web-dev-qa-db-ja.com

リージョン間でAWSラムダを呼び出す

Boss、worker1、worker2の3つのラムダ関数があります。 boto3.client.invokeを使用すると、上司からworker1を呼び出すことができます。これら2つは同じ地域にあります。
worker2は別のリージョンにあります。ボスからworker2を呼び出そうとすると、次のエラーが返されます。
"呼び出し操作の呼び出し中にエラーが発生しました(ResourceNotFoundException):この領域( 'us-west-2')では 'us-east-1'の関数に到達できません"。ボスには、次の権限を持つ実行ロールがあります。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "lambda:InvokeFunction"
        ],
        "Effect": "Allow",
        "Resource": "arn:aws:lambda:*:*:*"
    }
]
}

これが機能するために許可を伝達する必要がある方法を明確にするのを手伝ってください。ありがとう

編集:masterとworker1はus-west-2にあり、worker1はus-east-1にあります。
マスターからワーカーを呼び出すために使用されるコードは次のとおりです。

def lambda_handler(event, context):
function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
    FunctionName = function_name,
    Payload = payload
)
response_payload = response['Payload'].read()
response_arr = json.loads(response_payload)
return response_arr['answer']
6
Sawyer Merchant

ご意見ありがとうございました。 @ Michael-ローカルリージョンにリクエストを送信するようにデフォルト設定されているAWSクライアントライブラリに関するsqlbotのコメントは、解決策を見つけるのに役立ちました。 Pythonの場合、ライブラリはboto3です。 docs を読んだ後、地域を設定する方法が明確ではありませんでした。 (簡単な)答えを提供したのはこれでした ブログ投稿

cleint = boto3.client('lambda', region_name='us-west-2')

地域間のラムダから別のラムダへのユースケースが複雑であるというのは、まさにマイケルです。他のリソース(ラムダからec2、ラムダからs3など)をリージョン間で機能させようとしたときに、boto3を初めて使用する他の人が同じエラーに遭遇した場合に備えて、この回答をここに残しておきます。
ありがとう

9
Sawyer Merchant

worker2ラムダ関数の領域を次のように設定する必要があります:

arn:aws:lambda:us-east-1-...:function:worker_2

したがって、コードは次のようになります:

function_name = "arn:aws:lambda:us-east-1-...:function:worker_2"
lambda_client = boto3.client('lambda')
payload = json.dumps({"body-json": "payload string")
response = lambda_client.invoke(
    FunctionName = function_name,
    Payload = payload
)

これで、masterラムダ関数のIAMロールを介してLambdamasterにアクセス許可を付与する必要があります。

+提案

リージョンus-east-1でラムダ関数を実行するAPIGatewayエンドポイントを作成できます。このエンドポイントは、セキュリティのレイヤーを提供するために特定のAPIキーでのみ実行できます。

そして、masterラムダ関数から、そのエンドポイントへのリクエストを実行します。

資源

0
Ele