web-dev-qa-db-ja.com

Lambdaを許可するS3ポリシー

AWSポリシージェネレーターで作成されたS3バケットには、特定のロールで実行されているラムダがバケット内のファイルにアクセスできるようにする次のポリシーがあります。ただし、Lambdaを実行すると、403のアクセス許可が拒否されます。

"errorMessage": "Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: <requestId>)",
  "errorType": "com.amazonaws.services.s3.model.AmazonS3Exception",

S3バケットのポリシー:

{
"Version": "2012-10-17",
"Id": "Policy<number>",
"Statement": [
    {
        "Sid": "Stmt<number>",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::<account>:role/<roleName>"
        },
        "Action": "s3:*",
        "Resource": "arn:aws:s3:::<bucketName>/*"
    }
]
}

ポリシーの何が問題になっていますか? Lambaは、ポリシーで設定されたロールで実行されています。

12
FiguringThisOut

AWS Lambda関数に割り当てられるロールは、AWS Lambdaロールを作成(IAMコンソールでロールを作成するときに選択)である必要があります。

ロールプリンシパルを持たないロールを使用しているサービス(この場合はLambda関数)に権限が割り当てられているため。

また、バケット自体(コンテンツの一覧表示など)およびバケットのコンテンツ(GetObjectなど)にアクセス許可を割り当てる必要があります。

次のようなものになります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowS3Access",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123XXX:role/service-role/LAMBDA_ROLE_NAME"
            },
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::my-bucket",
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
17
John Rotenstein

私がそれを動作させることができた間に私のためにループした後、プロセスは次のとおりです:

  1. s3バケットを作成します。
  2. iAMポリシーを作成します(バケット名が必要です)
  3. IAMロールを作成します(IAMポリシーが必要です)
  4. ラムダ関数の作成(IAMロールが必要)
  5. S3バケットポリシーの作成(ラムダ関数名が必要)

IAMポリシー:

 {
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "Stmt*******",
        "Effect": "Allow",
        "Action": [
            "s3:PutObject",
            "s3:PutObjectAcl",
            "s3:PutObjectTagging",
            "s3:PutObjectVersionAcl",
            "s3:PutObjectVersionTagging"
        ],
        "Resource": [
            "arn:aws:s3:::<bucket-name>"
        ]
    }
]
}

このポリシーをs3バケットで使用します

{
"Id": "Policy************",
"Version": "2012-10-17",
"Statement": [
{
  "Sid": "Stmt********",
  "Action": [
    "s3:PutObject",
    "s3:PutObjectAcl",
    "s3:PutObjectTagging",
    "s3:PutObjectVersionAcl",
    "s3:PutObjectVersionTagging"
  ],
  "Effect": "Allow",
  "Resource": "arn:aws:s3:::<bucket-name>/*",
  "Principal": {
    "AWS": [
      "arn:aws:iam::*********:role/<lambda-function-name>"
          ]
          }
        }
     ]
}
6