【CloudFormation】Error: The policy failed legacy parsing
やりたい事
以下のページを参考に、別アカウントのCodePipelineに、CodeCommitの変更を配信したい。また、これをCloudFormationを使ってできる限り省力化したい。
発生したエラー
開発アカウント側で、IAM Policyを作成する際にエラーが発生した。以下がテンプレートである。
AllowTargetAccessPolicy:
Type: AWS::IAM::Policy
Properties:
Roles:
- !Ref AllowTargetAccessRole
PolicyName:
!Join
- ""
- - !Ref AWS::Region
- !Ref AWS::AccountId
- To
- !Ref TargetAccountID
- CodeCommitAccessPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action:
- s3:PutObject
- s3:PutObjectAcl
Resource: !Sub arn:aws:s3:::artifact-bucket-for-${TargetAccountID}-from-${AWS::AccountId}
-
Effect: Allow
Action:
- kms:DescribeKey
- "kms:GenerateDataKey*"
- kms:Encrypt
- "kms:ReEncrypt*"
- kms:Decrypt
Resource: !Sub "arn:aws:kms:${AWS::Region}:${TargetAccountID}:key/${KMS_ID}
-
Effect: Allow
Action:
- codecommit:GetBranch
- codecommit:GetCommit
- codecommit:UploadArchive
- codecommit:GetUploadArchiveStatus
- codecommit:CancelUploadArchive
Resource:
!Sub arn:aws:codecommit:${AWS::Region}:${AWS::AccountId}:${RepositoryName}
すると、以下のエラーが発生した。
The policy failed legacy parsing (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument;)
リソースをコメントアウトして、問題がKMSに関するポリシードキュメントブロックにあることがわかった。
解決方法
なぜか、!Sub の代わりに!Joinを使用することでエラーが回避できた。 (参考) tycoh.hatenablog.com
AllowTargetAccessPolicy:
Type: AWS::IAM::Policy
Properties:
Roles:
- !Ref AllowTargetAccessRole
PolicyName:
!Join
- ""
- - !Ref AWS::Region
- !Ref AWS::AccountId
- To
- !Ref TargetAccountID
- CodeCommitAccessPolicy
PolicyDocument:
Version: 2012-10-17
Statement:
-
Effect: Allow
Action:
- s3:PutObject
- s3:PutObjectAcl
Resource: !Sub arn:aws:s3:::artifact-bucket-for-${TargetAccountID}-from-${AWS::AccountId}
-
Effect: Allow
Action:
- kms:DescribeKey
- "kms:GenerateDataKey*"
- kms:Encrypt
- "kms:ReEncrypt*"
- kms:Decrypt
Resource: |
!Join
- ""
- - arn:aws:kms
- !Ref AWS::Region
- ":"
- !Ref TargetAccountID
- "key/"
- !Ref KMSArn
-
Effect: Allow
Action:
- codecommit:GetBranch
- codecommit:GetCommit
- codecommit:UploadArchive
- codecommit:GetUploadArchiveStatus
- codecommit:CancelUploadArchive
Resource:
!Sub arn:aws:codecommit:${AWS::Region}:${AWS::AccountId}:${RepositoryName}
原因は後日AWS Forumに質問してみることにする。