Lambda 関数を使用して別の AWS アカウントの Amazon S3 バケットにファイルをアップロードすると、アクセス拒否エラーが表示されるのはなぜですか?

所要時間2分
0

AWS Lambda 関数を使用して Amazon Simple Storage Service (Amazon S3) バケットにファイルをアップロードすると、アクセス拒否エラーが表示されます。Amazon S3 バケットは別の AWS アカウントにあります。 

簡単な説明

Lambda 関数と Amazon S3 バケット間のアクセス権限が不完全または正しくない場合、Lambda はアクセス拒否エラーを返します。

あるアカウント (アカウント 1) の Lambda 関数と別のアカウント (アカウント 2) の S3 バケットの間に権限を設定するには、以下を実行します:

1.(アカウント 1) Lambda 関数がオブジェクトを Amazon S3 にアップロードできるようにする Lambda 実行ロールを作成します。

2.(アカウント 2) S3 バケットのバケットポリシーを変更して、Lambda 関数がバケットにオブジェクトをアップロードできるようにします。

解決策

**重要:**次のソリューションでは、ある AWSアカウントに Lambda 関数を、もう 1 つのアカウントに S3 バケットが必要です。

S3 バケットにファイルをアップロードする Lambda 関数のコード例 (Python バージョン 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**メモ:**アップロードリクエストで bucket-owner-full-control ACL を渡す前に、バケットで ACL が非アクティブ化されていないことを確認してください。これは S3 バケットの所有権設定で行います。詳細については、「オブジェクトの所有権の管理とバケットの ACL の無効化」を参照してください。

(アカウント 1) Lambda 関数が Amazon S3 にオブジェクトをアップロードできるようにする Lambda 実行ロールを作成します

1.Lambda 関数用の AWS Identity and Access Management (IAM) ロールを作成します。

2.IAM ロールの Amazon リソースネーム (ARN)をコピーします。

**メモ:**S3 バケットのバケットポリシーを更新する前に、IAM ロールの ARN を取得する必要があります。IAM ロールの ARN を取得する 1 つの方法は、AWS コマンドラインインターフェイス (AWS CLI) get-role コマンドを実行することです。AWS CLI コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

3.アカウント 2 のバケットにオブジェクト (s3: PutObject) をアップロードするアクセス権限を付与する](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html)ポリシーを IAM ロールにアタッチ[します。

IAM ロールに s3: PutObject と s3: PutObjectACLのアクセス権限を付与する IAM ポリシーの例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::AccountBBucketName/*"
    }
  ]
}

4.Lambda 関数の実行ロールを、作成した IAM ロールに変更します。手順については、「Lambda 関数オプションの設定」を参照してください。

(アカウント 2) S3 バケットのバケットポリシーを変更して、Lambda 関数がバケットにオブジェクトをアップロードできるようにします

バケットポリシーを更新して、Lambda 実行ロールの ARN をアクション** s3: PutObject** にアクセスできるプリンシパルとして指定するようにします。

Lambda 関数がバケットにオブジェクトをアップロードすることを許可する S3 バケットポリシーの例

**メモ:**次のポリシーでは、Lambda 関数の実行ロールに s3: PutObjectACL へのアクセス権限も付与します。

{
            "Version": "2012-10-17",
            "Statement": [
            {
            "Effect": "Allow",
            "Principal": {
            "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

関連情報

Amazon S3 での 403 アクセス拒否エラーのトラブルシューティング方法を教えてください。

AWS公式
AWS公式更新しました 1年前
コメントはありません