[小ネタ]Cloudformationで置換した文字列値と文字列を組み合わせる方法

2022.05.31

こんにちは。
コンサルティング部 繁松です。

今日はCloudformationテンプレート内で、置換した文字列値と文字列を組み合わせた値を利用することがあったのでブログにしました。
テンプレート内で文字列を置換する方法は梶原さんのブログを参考にさせていただきました。

置換処理

!Join [置換文字, !Split [置換対象文字, 文字列]]

参考:[小ネタ]CloudFormationのテンプレート内で文字を置換したい

やりたかったこと

パラメータで[shigematsu.k]を設定し
ロール名:[shigematsu.k-role]
Lambda関数名:[shigematsu-k-LambdaFunction]
にしたい。

  • パラメータの入力項目は1つにして、各リソースのNameを設定したい
  • Lambdaに設定する実行ロール名では"."を使いたい
  • Lambdaは命名規則で"."が使えないので"-"に置き換えたい
  • ロール名の後ろには[-role]、Lambda関数名の後ろには[-LambdaFunction]と付けたい

方法

!Sub  
  - ${Prefix}-lambda  
  - Prefix:  
      !Join [ "-", !Split [".", !Ref NamePrefix]]

!Subを利用することで解決しました。

やってみた

AWSTemplateFormatVersion: "2010-09-09"  
  
Parameters:  
  PrefixName:  
    Type: String  
    Default: shigematsu.k  
  
Resources:  
  Lambdatest:  
    Type: "AWS::Lambda::Function"  
    Properties:  
      Code:  
        ZipFile: |  
          import json  
  
          def lambda_handler(event, context):  
              # TODO implement  
              return {  
                  'statusCode': 200,  
                  'body': json.dumps('Hello from Lambda!')  
              }  
      FunctionName : !Sub  
        - ${Prefix}-LambdaFunction  
        - Prefix:  
            !Join [ "-", !Split [".", !Ref PrefixName]]  
      Handler: "index.lambda_handler"  
      Role: !GetAtt Role.Arn  
      Runtime: "python3.9"  
      Timeout: 10  
  
  Role:  
    Type: "AWS::IAM::Role"  
    Properties:  
      AssumeRolePolicyDocument:  
        Version: "2012-10-17"  
        Statement:  
          Effect: "Allow"  
          Action: "sts:AssumeRole"  
          Principal:  
            Service: "lambda.amazonaws.com"  
      RoleName: !Sub '${PrefixName}-role'

Lambda関数名は"."を"-"に変換し、[-LambdaFunction]がついた名前に
ロール名は"."のまま[-role]がついた名前のリソースが作成されました。

さいごに

置換は梶原さんのブログを参考に解決することができ、文字列の追加については!Subを使用することで解決しました。
1つのパラメータから値を取得したい場合にリソース毎の命名規則に沿った値に置き換えし、後続の文字列はリソース毎に分けたい場合に利用する機会があると思います。

なにかのお役に立つと幸いです。

参考