
CloudFormation で Parameter Store の StringList 型から一部の値を参照する方法を教えてください
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
困っていた内容
リソース情報を SSM パラメーターストア の StringList型パラメータで管理しています。
CloudFormation でパラメータ内の一部の値を動的参照するように書きたいのですが、テンプレートの書き方を教えてください。
なお、AWS公式ドキュメントは確認しましたが、一部の値だけを参照する方法はなさそうに見えました。
動的な参照を使用してテンプレート値を指定する - AWS CloudFormation
名前: /CloudFormation/VPC 種類: StringList 値: sg-1234567890abcdefg,subnet-abcdg1234567890
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC function.
Resources:
  Function:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: arn:aws:iam::123456789012:role/lambda-role
      Code:
        S3Bucket: my-bucket
        S3Key: function.zip
      Runtime: nodejs12.x
      Timeout: 5
      TracingConfig:
        Mode: Active
      VpcConfig:
        SecurityGroupIds:
          - sg-1234567890abcdefg   # パラメータから動作参照にしたい
        SubnetIds:
          - subnet-abcdg1234567890  # パラメータから動作参照にしたい
どう対応すればいいの?
パラメータセクションと組み込み関数Fn::Selectをご利用ください。
具体的には次のようなテンプレートを作成すると、パラメータ内の一部の値を動的参照できます。
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC function.
Parameters:
  Vpc:
    Type: AWS::SSM::Parameter::Value<List<String>>
    Default: "/CloudFormation/VPC"
Resources:
  Function:
    Type: AWS::Lambda::Function
    Properties:
      Handler: index.handler
      Role: arn:aws:iam::123456789012:role/lambda-role
      Code:
        S3Bucket: my-bucket
        S3Key: function.zip
      Runtime: nodejs12.x
      Timeout: 5
      TracingConfig:
        Mode: Active
      VpcConfig:
        SecurityGroupIds:
          - !Select [ 0, !Ref Vpc]
        SubnetIds:
          - !Select [ 1, !Ref Vpc]
動的な参照ではできないの?
2022年9月時点の挙動として、次のような「動作な参照」で取得したパラメータから一部の値を取得する書き方を行うと、配列全体の値が返却されます。
!Select [ 0, !Split [',', '{{resolve:ssm:/CloudFormation/VPC}}']] 
区切り記号を:に変更すると{{resolveが返却されることから、動作な参照が行われる前に組み込み関数が処理されるようです。
そのため、現時点では「動的な参照」では SSM パラメーターストアのパラメータから一部の値を取得できないようです。
参考資料
- パラメータ - AWS CloudFormation
 - 動的な参照を使用してテンプレート値を指定する - AWS CloudFormation
 - Fn::Select - AWS CloudFormation
 - Fn::Split - AWS CloudFormation
 - AWS::Lambda::Function - AWS CloudFormation
 - Alert when doing a split on a dynamic reference · Issue #2181 · aws-cloudformation/cfn-lint
 - AWS SSM Parameter StoreのString型とStringList型はどう違う? | DevelopersIO
 - AWS Systems Manager Parameter Store - AWS Systems Manager
 - CloudFormation の参照周りで意識すべきポイント・Tips | DevelopersIO
 - CloudFormation 文字列の配列をパラメータで渡してテンプレートを実行したいとき、CommaDelimitedListを使ってみる | DevelopersIO
 - CloudFormationのParametersの入力方法の違いをデータ型ごとに一覧にしてみた | DevelopersIO
 






