はじめに
久しぶりにCloudFormationを使ってIaCに挑戦していたところ、作成したいリソース通りにならないという問題が発生したためまとめます
おそらく他の記事にもなかったため、つまずくと時間がかかるかと思いますので誰かの役に立てば嬉しいです
問題
S3のポリシーをCloudFormationで以下のように作成しました
s3.yml
S3BucketPolicy:
Type: "AWS::S3::BucketPolicy"
Properties:
Bucket:
Ref: S3Bucket
PolicyDocument:
Statement:
- Action:
- "s3:ListBucket"
Effect: "Allow"
Resource:
Fn::Sub: "arn:aws:s3:::${BucketName}"
Principal:
AWS: !Ref CodeBuildRole
そして、AWSで作成したS3のポリシーを確認すると以下のようになっていました
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "767555320:root" # なぜかrootがついている
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::kitlab-test-s3"
}
]
}
767555320
はダミーでパラメータに設定した値です
そのあとになぜか「:root」という文字が付与されていました
解決方法
これはパラメータとして渡している値が問題でした
Principal
にはARN
を渡さないといけないので、もしARNの形式でない文字列が渡されていると省略されているであろう:root
を自動的に付与する仕組みのようでした
なので以下のコードでCLIを叩いてS3を作成するようにしたところうまくいくようになりました
$ aws cloudformation create-stack \
--stack-name s3-test \
--template-body file://./cloudformation/s3.yml \
--parameters \
ParameterKey=CodeBuildRole,ParameterValue=arn:aws:iam::7675555555:role/service-role/sample
(以下省略)
{
"Version": "2008-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::7675555555:role/service-role/sample"
},
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::s3-test"
}
]
}
おわりに
この仕様が調べた感じではどこにも載っていなかったので解決までに時間がかかりました
ダミーの値でリソース作成しないほうがよさそうです