CloudFormation で Parameter Store の StringList 型から一部の値を参照する方法を教えてください

2022.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

リソース情報を SSM パラメーターストア の StringList型パラメータで管理しています。
CloudFormation でパラメータ内の一部の値を動的参照するように書きたいのですが、テンプレートの書き方を教えてください。
なお、AWS公式ドキュメントは確認しましたが、一部の値だけを参照する方法はなさそうに見えました。

動的な参照を使用してテンプレート値を指定する - AWS CloudFormation

パラメーターストアの値

名前: /CloudFormation/VPC
種類: StringList
値: sg-1234567890abcdefg,subnet-abcdg1234567890

CloudFormationテンプレート

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をご利用ください。

具体的には次のようなテンプレートを作成すると、パラメータ内の一部の値を動的参照できます。

CloudFormationテンプレート

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 パラメーターストアのパラメータから一部の値を取得できないようです。

参考資料