web-dev-qa-db-ja.com

CloudFormationのパラメーターとして文字列のリストを渡すにはどうすればよいですか?

ルートテンプレートから多数のパラメーターを受け入れて構成するネストされた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パラメータータイプを使用するなど、他のバリエーションを試しましたが、動作しません。パラメータとして文字列のリストを渡す簡単な方法はありますか?

7
Liam Mayfair

!Splitの戻り値はA list of string values.であるため、次のようにします。

[...]
    Resource: !Split [",", !Ref S3Buckets]
[...]
5
MaiKaY

@ 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_が表示されます。
4
gene_wood