[小ネタ] CloudFormationの組み込み関数を使った文字列操作の備忘録

AWS SAM / AWS Cloud​Formationの備忘録として記しました。 今回はAWS Cloud​Formationの組み込み関数について書いていきたいと思います。
2018.07.07

はじめに

こんにちは、モバイルアプリサービス部の田中孝明です。

元々はモバイルアプリエンジニアでしたが、最近ではサーバーレス開発部の案件に携わることも増え、 AWS SAM / AWS Cloud​Formationに触れる機会が増えました。

そんな中、「あれ、これどうやれば良かったんだろ」というような躓きがあったので、それらを備忘録として記しました。

今回は AWS Cloud​Formation組み込み関数 について書いていきたいと思います。

Conditions

特定の環境でのみ構築したい場合は AWS CloudFormationの条件 を使います。

以下は Env で与えられた環境名が development の時だけ、 DevelopmentStream を構築するテンプレートの例になります。

Parameters:
  Env:
    Type: String

Conditions:
  IsDevelopment: !Equals [ !Ref Env, development ]

Resources:
  DevelopmentStream:
    Condition: IsDevelopment
    Type: AWS::Kinesis::Stream
    Properties:
      Name: development_stream
      RetentionPeriodHours: 24
      ShardCount: 1

組み込み関数 Fn::Sub

組み込み関数 Fn::Sub は、スタックを作成または更新するまで使用できない値を含むコマンドまたは出力を作成するために、この関数を使用できます。主に変数と文字列を結合する際に使用します。

以下はS3のバケットを作成する際、バケット名をユニークにするためにリージョン名と Env で与えられた環境名を含めているテンプレートの例になります。

Parameters:
  Env:
    Type: String

Resources:
  DataBucket:
    DeletionPolicy: Retain
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub data-${AWS::Region}-${Env}

us-east-1 リージョン向けに作成すれば、バケット名は data-us-east-1-development となります。

組み込み関数 Fn::Join

組み込み関数 Fn::Join は、一連の値を特定の区切り文字で区切って1つの値にする組み込み関数です。

文字列の結合なら、普段は前述した 組み込み関数 Fn::Sub を利用することが多いのですが、「別のスタックで作成したArn」を組み合わせて利用する際に、難しいケースが出て来ます。 今回は 組み込み関数 Fn::Join を用いた方法の一つ、「変数を考慮した、エクスポートされた値を参照する方法」を例にします。

以下のように環境ごとにS3のBucketのArnをエクスポートするs3スタックを作成します。

# スタック名は s3 とする

Parameters:
  Env:
    Type: String

Resources:
  DataBucket:
    DeletionPolicy: Retain
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub data-${AWS::Region}-${Env}

Outputs:
  DataBucketArn:
    Value: !GetAtt DataBucket.Arn
    Export:
      Name: !Sub ${AWS::StackName}-${Env}-DataBucketArn

ここで、環境ごとにエクスポートされたS3のBucketのArnを、IAMポリシーのリソースとして指定したいと思います。 s3スタックからエクスポートした変数名を指定し、配下のリソース名を追加します。

- Fn::Join:
  - ""
  - - Fn::ImportValue: !Sub s3-${Env}-DataBucketArn
    - /*

結合された値は以下のようになります。

arn:aws:s3:::data-bucket-us-east-1-development/*

以下はIAMポリシーに対して、s3スタックからエクスポートしたArnからリソース名を作成し、それを指定しているテンプレートの例になります。

Parameters:
  Env:
    Type: String

Resources:
  GroupPolicy:
    Type: AWS::IAM::Policy
    Properties:
      PolicyName: group-policy
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - s3:PutObject
            Resource:
              - Fn::Join:
                - ""
                - - Fn::ImportValue: !Sub s3-${Env}-DataBucketArn
                  - /*

最後に

AWS Cloud​Formation は様々なAWSのサービスに対する知識が必要で、自分がモバイルアプリのエンジニアからAWSのサービスを触れていく中で、非常に勉強になったサービスです。他にも気が付いた点を随時書き記していきたいと思います。

参考