Amazon Simple Storage Service (Amazon S3) バケットで、別の AWS アカウントの AWS Lambda 関数を呼び出したいです。
解決策
別の AWS アカウントの Lambda 関数を呼び出すように Amazon S3 バケットを設定するには、次の手順を実行します。
- Lambda 関数のリソースベースのアクセス許可ポリシーを更新して、Amazon S3 に呼び出しアクセス許可を付与します。
- Lambda 関数を呼び出す Amazon S3 イベント通知を作成します。
重要: Lambda 関数は S3 バケットと同じ AWS リージョンにある必要があります。
関数を移行する方法については、「Lambda コンソールを使用して Lambda 関数を別の AWS アカウントまたはリージョンに移行する方法を教えてください」を参照してください。
Lambda 関数のリソースベースのアクセス許可ポリシーを更新して Amazon S3 に呼び出しアクセス許可を付与する
AWS マネジメントコンソール
Lambda 関数のリソースベースのアクセス許可ポリシーを更新して Amazon S3 に呼び出しアクセス許可を付与するには、次の手順を実行します。
- Lambda 関数を配置している AWS アカウントで、Lambda コンソールの [関数] ページを開きます。
- Amazon S3 によって呼び出す Lambda 関数の名前を選択します。
- [設定] タブから、[アクセス許可] を選択します。
- [リソースベースのポリシー] セクションで、[アクセス許可を追加] を選択します。
- [ポリシーステートメント] ペインで、[AWS サービス] を選択します。[サービス] ドロップダウンリストが表示されます。
- [サービス] ドロップダウンリストで [S3] を選択すると、さらにフィールドが表示されます。
- [ステートメント ID] には、ポリシー内で作成するステートメントを区別するための一意のステートメント ID を入力します。
- [ソースアカウント] に、S3 バケットをホストするアカウントの AWS アカウント ID を入力します。
- [ソース ARN] に、S3 バケットの ARN を入力します。次の形式を使用します。
arn:aws:s3:::bucket_name
注: bucket_name は、お使いの S3 バケットの名前に置き換えてください。
- [アクション] で、ドロップダウンリストから [lambda:InvokeFunction] を選択します。
- [保存] を選択します。
詳細については、「Lambda でリソースベースのポリシーを使用する」を参照してください。
AWS CLI
**注:**AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
Lambda 関数のリソースベースのアクセス許可ポリシーを更新し、次に示すように、add-permission API を使用して Amazon S3 に呼び出しアクセス許可を付与します。
aws lambda add-permission \--function-name LambdaFunction_name \
--action lambda:InvokeFunction \
--principal s3.amazonaws.com \
--source-arn arn:aws:s3:::bucket_name \
--source-account account-id \
--statement-id "unique_statement_ID"
注: LambdaFunction_name、bucket_name、unique_statement_ID はそれぞれ、実際の変数に置き換えてください。
Lambda 関数を呼び出す Amazon S3 イベント通知を作成する
AWS マネジメントコンソール
指示に従い、Amazon S3 コンソールを使用してイベント通知を有効にして設定します。
AWS CLI
Lambda 関数を呼び出す Amazon S3 イベント通知を作成するには、put-bucket-notification-configuration コマンドを使用します。
重要: put-bucket-notification コマンドを使用する前に、S3 バケットに他のイベント通知が設定されていないことを確認してください。put-bucket-notification コマンドは、既存の通知設定に対して、追加操作ではなく、置換操作を実行します。
バケットにすでにイベント通知があるかどうかを確認するには、次のコマンドを実行します。
aws s3api get-bucket-notification-configuration --bucket bucket_name
上記のコマンドが空の JSON オブジェクトを返すか、応答がない場合は、既存のイベント通知設定はありません。以下の設定で、notification.json という名前の新しいファイルを作成して保存します。
{
"LambdaFunctionConfigurations": [
{
"Id": "my-lambda-function-s3-event-configuration",
"LambdaFunctionArn": "LambdaFunction_ARN",
"Events": [ "s3:ObjectCreated:" ],
"Filter": {
"Key": {
"FilterRules": [
{
"Name": "prefix"|"suffix",
"Value": "string"
}
]
}
}
}
]
}
注: LambdaFunction_ARN は、お使いの Lambda 関数 ARN に置き換えてください。プレフィックスとサフィックスは、フィルタールールの変数に置き換えます。
get-bucket-notification-configuration が既存のイベント通知設定 JSON を返す場合は、既存の JSON 設定を notification.json というファイル名で保存します。新しい Lambda 通知設定を既存の LambdaFunctionConfigurations キーに追加するか、次の例で示す JSON 構文を使用して新しいキーを作成します。notification.json ファイルにキーを追加します。
{
... # Non Lambda event configurations like SNS, SQS etc. ,
"LambdaFunctionConfigurations": [
{
"Id": "my-lambda-function-s3-event-configuration",
"LambdaFunctionArn": "LambdaFunction_ARN",
"Events": [ "s3:ObjectCreated:" ],
"Filter": {
"Key": {
"FilterRules": [
{
"Name": "prefix"|"suffix",
"Value": "string"
}
]
}
}
},
{...}, #Other pre-existing Lambda Function configurations
]
}
notification.json を作成したら、次のコマンドを実行して S3 イベント通知設定を更新します。
aws s3api put-bucket-notification-configuration \
--bucket bucket_name \
--notification-configuration file://notification.json
注: bucket_name は、お使いの S3 バケットの名前に置き換えてください。
Lambda 関数をテストする
Lambda コンソールで Lambda 関数をテストするには、「ダミーイベントで Lambda 関数をテストする」を参照してください。関数がイベント通知によって呼び出されない場合は、「Amazon S3 イベント通知で Lambda 関数が呼び出されない理由を知りたいです」を参照してください。
関連情報
Lambda 関数に Amazon S3 バケットへのアクセスを許可する方法を教えてください
Amazon S3 イベント通知を作成するときに「次の宛先の設定を検証できません」というエラーが発生する理由を知りたいです