ルートテンプレートから多数のパラメーターを受け入れて構成するネストされたCloudFormationテンプレートを持っています。現時点では、単純な文字列パラメーターのみを渡しますが、S3バケットARNのリストを子テンプレートに渡す必要があります。
ChildLambdaStack:
Type: AWS::CloudFormation::Stack
Properties:
Parameters:
AwsRegion: !Ref AwsRegion
Environment: !Ref Environment
Product: !Ref Product
S3Buckets: "arn:aws:s3:::bucket1,arn:aws:s3:::bucket2"
TemplateURL: "https://s3.amazonaws.com/child-template.yml"
そして、子テンプレートにはこれがあります
AWSTemplateFormatVersion: "2010-09-09"
Description: "Child Lambda"
Parameters:
AwsRegion:
Type: String
Environment:
Type: String
Product:
Type: String
S3Buckets:
Type: String
Resources:
DeployerPolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- s3:PutObject
- s3:GetObject
- s3:DeleteObject
- s3:CreateBucket
- s3:DeleteBucket
- s3:ListBucket
- s3:PutBucketNotification
Resource:
- Fn::Split:
- ","
- !Ref S3Buckets
私の考えは、私が入力しているS3バケットARNのリストは、このように子テンプレートで展開されるということです
Resource:
- arn:aws:s3:::bucket1
- arn:aws:s3:::bucket2
しかし、テンプレートを実行すると、エラーが発生します
Syntax errors in policy. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument)
CommaDelimitedList
パラメータータイプを使用するなど、他のバリエーションを試しましたが、動作しません。パラメータとして文字列のリストを渡す簡単な方法はありますか?
!Split
の戻り値はA list of string values.
であるため、次のようにします。
[...]
Resource: !Split [",", !Ref S3Buckets]
[...]
@ MaiKaY が指摘しているように、 @ Liam Mayfair のコードの欠陥は_Fn::Split
_の前に_-
_があり、その結果リストがリストである単一の要素。修正されたコードは次のようになります
_...
Resource:
Fn::Split:
- ","
- !Ref S3Buckets
_
より一般的な注意事項として、String
を分割しないため、_Fn::Split
_を使用する場合は、CommaDelimitedList
ではなくCommaDelimitedList
のパラメータータイプを使用する必要があります。
CommaDelimitedList
を_Fn::Split
_とともに使用すると、エラーTemplate error: every Fn::Split object requires two parameters, (1) a string delimiter and (2) a string to be split or a function that returns a string to be split
が表示されますFn::Split
_なしでCommaDelimitedList
を使用すると、エラー_Syntax errors in policy
_が表示されます。