別のアカウントの Amazon S3 バケットにファイルをアップロードするために Lambda 関数を使用すると Access Denied エラーが発生するのはなぜですか?

最終更新日: 2020 年 11 月 2 日

AWS Lambda 関数を使用して、別の AWS アカウントの Amazon Simple Storage Service (Amazon S3) バケットにファイルをアップロードしたいのですが、アクセス拒否エラーが表示されます。どうすれば解決できますか?

簡単な説明

AWS Lambda 関数と Amazon S3 バケット間のアクセス許可が不完全であるか、正しくない場合、「アクセスが拒否されました」というエラーが表示されます。

あるアカウント (アカウント A) の Lambda 関数と、別のアカウント (アカウント B) の S3 バケットの間に正しいアクセス許可を設定するには、次の手順通りに進めてください。

1.    アカウント A で AWS Identity and Access Management (IAM) ロール (実行ロール) を作成します。これにより、関数が Amazon S3 にオブジェクトをアップロードできるようになります。

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

解決方法

作業を開始する前に、次の項目が作成済みであることを確認してください。

アカウント A で IAM ロール (実行ロール) を作成します。これにより、関数が Amazon S3 にオブジェクトをアップロードできるようになります。

1.    Lambda 関数の IAM ロールを作成します。

2.    後ほどのステップのために、IAM ロールの Amazon リソースネーム (ARN) を書き留めてください。ARN を取得する方法の 1 つは、AWS コマンドラインインターフェイス (AWS CLI) コマンド get-role を実行することです。

注意: AWS CLI コマンドの実行時にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください

3.    アカウント B のバケットにオブジェクト (s3:PutObject) をアップロードするアクセス許可を付与する IAM ロールにポリシーをアタッチします。たとえば、このポリシーは、s3:PutObject と s3:PutObjectAcl の両方へのアクセス許可をロールに付与します。

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

4.    Lambda 関数の実行ロールを、作成した IAM ロールに変更します。関数の設定を構成することで、実行ロールを変更できます。

アカウント B で、Lambda 関数がオブジェクトをアップロードできるようにバケットポリシーを更新する

バケットポリシーを更新して、Lambda 関数の IAM ロール (実行ロール) の ARN を、アクション s3:PutObject へのアクセス権を持つプリンシパルとして指定します。以下のようなバケットポリシーを使用できます。

注: このポリシーは、実行ロールに 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/*"
            ]
        }
    ]
}