やったこと
lambdaを使ってデータをS3に保存するときにバケットをパブリックにしてしまうとセキュリティー的によろしくないのでアクセスを制限するためにバケットポリシーを作成しました。
今回はA
というバケットに PutObject
を put_s3
というlambdaからのみ許可させます。
ハマったとこ
最初、以下のようなバケットポリシーにしていました。
lambdaからのアクセスを許可するんだからprincipalには lambda のarnを入力したらいけるでしょって感じで。
しかし、これで保存をしようとすると Invalid principal in policy
とエラーが...
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "test_policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:lambda:ap-northeast-1:xxxxxx:function:put_s3"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::A/*"
}
]
}
解決策
以下のように lambda のarnでは無く lambdaに付与しているrole のarnを指定することで無事バケットポリシーを作成することができました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "test_policy",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::xxxxx:role/lambda_role"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::A/*"
}
]
}