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

2021.09.13

AWS事業本部 梶原@福岡です。 CloudFormationのテンプレートを記載している際に、パラメータでドメイン名とドメインの.(ドット)を変換したパラメータを入力していたのですが、 2つ入力するのがあまりにめんどくさく。え、文字列置換すればいいじゃん!て思ったんですが、組み込み関数にはReplaceとかないんすよね・・・

組み込み関数リファレンス https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

ということで、出オチですが、以下を使うといい感じに変換できますので、どうぞ!
うまく置換できないときもあるかと思いますが複雑なやつはこういうのは向いてないと思うので素直に2つ入力してください。

置換処理

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

経緯

さすがにこれで、Lambdaを使うのはちょっと心苦しく、なんとかなんないかなとおもっていたのですが、
CloudFormationには文字列を分割する関数Splitと

Fn::Split
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-split.html

と、文字列を連結する関数がJoinがありました。
Fn::Join
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-join.html

なので、置換対象の文字で、割って、置換文字でくっつけるです

やってみた

AWSTemplateFormatVersion: "2010-09-09"

Parameters:
  BucketName:
    Description: A name for the bucket. The bucket name must contain only lowercase letters, numbers, periods (.), and dashes (-) and must follow
    Type: String
    Default: developers.io
Resources:
  MyBucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Join ["-", !Split [".", !Ref BucketName]]

こんな感じです!。ピリオド(.)をハイフン(-)に変換した。S3バケットが作成できます。

まとめ

作成するリソースにより、ピリオドが使えなかったり、使える文字が限られたりしますがそのために、別のパラメータを使って入力させたりする機会があったりします。 そんなとき、思い出してもらえると、複数のパラメータをまとめたりできるかと思います。

参考情報

組み込み関数リファレンス https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html

How can i replace some string in cloudformation aws https://stackoverflow.com/questions/56881879/how-can-i-replace-some-string-in-cloudformation-aws/60941273