この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは、モバイルアプリサービス部の田中孝明です。
元々はモバイルアプリエンジニアでしたが、最近ではサーバーレス開発部の案件に携わることも増え、 AWS SAM / AWS CloudFormationに触れる機会が増えました。
そんな中、「あれ、これどうやれば良かったんだろ」というような躓きがあったので、それらを備忘録として記しました。
今回は AWS CloudFormation の 組み込み関数 について書いていきたいと思います。
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 CloudFormation は様々なAWSのサービスに対する知識が必要で、自分がモバイルアプリのエンジニアからAWSのサービスを触れていく中で、非常に勉強になったサービスです。他にも気が付いた点を随時書き記していきたいと思います。