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は、ポリシーで設定されたロールで実行されています。
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/*"
]
}
]
}
私がそれを動作させることができた間に私のためにループした後、プロセスは次のとおりです:
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>"
]
}
}
]
}