本連載では、以下のイメージの構成にあるAWSリソース基盤自動化環境の構築を実践しています。
前回は、ElastiCacheを構築するテンプレートを実装しました。続く今回は、S3およびSQSを構築するテンプレートを作成します。
なお、実際のソースコードはGitHub上にコミットしています。以降のソースコードでは本質的でない記述を一部省略しているので、実行コードを作成する場合は、必要に応じて適宜GitHub上のソースコードも参照してください。
S3スタック構築テンプレート
S3は、連載「AWSで作るクラウドネイティブアプリケーションの基本」の第25回で実施したのと同じ要領で構築します。S3をCloudFormationで構築する場合、リソースタイプが、「AWS::S3::Bucket」であるリソース定義が必要です。プロパティとして設定可能な属性は、上記リンク先の通りですが、加えて、S3を「商用環境」「ステージング環境」「開発環境」という3つのパターンに分けて作成するようにします。テンプレートのサンプルは以下の通りです。
AWSTemplateFormatVersion: '2010-09-09'
// omit
Mappings:
BucketDefinitionMap: #(A)
Production:
"BucketName" : debugroom-mynavi-sample-cloudformation-bucket-production
"AccessControl" : "Private"
"BlockPublicAcls" : True
"BlockPublicPolicy" : True
"IgnorePublicAcls" : True
"RestrictPublicBuckets" : True
// omit
Parameters:
EnvType: #(B)
Description: Which environments to deploy your service.
Type: String
AllowedValues: ["Dev", "Staging", "Production"]
Default: Dev
Resources:
S3Bucket: #(C)
Type: AWS::S3::Bucket
Properties:
BucketName: !FindInMap [BucketDefinitionMap, !Ref EnvType, BucketName] #(D)
AccessControl: !FindInMap [BucketDefinitionMap, !Ref EnvType, AccessControl]
PublicAccessBlockConfiguration:
BlockPublicAcls: !FindInMap [BucketDefinitionMap, !Ref EnvType, BlockPublicAcls]
BlockPublicPolicy: !FindInMap [BucketDefinitionMap, !Ref EnvType, BlockPublicPolicy]
IgnorePublicAcls: !FindInMap [BucketDefinitionMap, !Ref EnvType, IgnorePublicAcls]
RestrictPublicBuckets: !FindInMap [BucketDefinitionMap, !Ref EnvType, RestrictPublicBuckets]
Outputs:
S3Bucket: #(E)
Description: Mynavi S3 bucket name
Value: !Ref S3Bucket
Export:
Name: !Sub MynaviSampleS3Bucket-${EnvType}
S3のテンプレートの記述の基本となるポイントは下表の通りです。
記述 | 説明 |
---|---|
A | Mappingsとして、EnvTypeパラメータの値に応じて、3つの環境ごとの論理名とパラメータを定義します。Mappings定義方法の詳細はアプリケーションロードバランサー(ALB)スタック構築テンプレートと同様なので適宜参照してください |
B | S3を商用環境、ステージング環境、開発環境用に分けるよう、EnvTypeパラメータとして指定可能にします。このパラメータに応じて、Mappingsに定義したパラメータを切り替え、リソース定義を分けて作成できるようにします |
C | S3のリソース定義を行います。定義するプロパティの詳細はAWS::S3::Bucketを参照してください |
D | 環境によって異なる値を定義したい箇所は、EnvTypeパラメータを引数としたFindInMap関数でデータ取得します |
E | S3のバケット名をOutputs出力します |
作成したテンプレートに対して、以下のようにスタック名とテンプレートパスを変更してヘルパースクリプトを実行します。
#!/usr/bin/env bash
stack_name="mynavi-sample-s3"
template_path="sample-s3-cfn.yml"
parameters="EnvType=Dev"
aws cloudformation deploy --stack-name ${stack_name} --template-file ${template_path} --parameter-overrides ${parameters} --capabilities CAPABILITY_IAM
実行が正常に終了すると、S3のバケットが作成されます。
続いて、SQSのスタックテンプレートを実装します。
SQSスタック構築テンプレート
SQSは連載「AWSで作るクラウドネイティブアプリケーションの基本」の第28回で実施したのと同じ要領で構築します。SQSをCloudFormationで構築する場合、リソースタイプが、AWS::SQS::Queueであるリソース定義が必要です。プロパティとして設定可能な属性は、各リンク先の通りですが、加えて、SQSを「商用環境」「ステージング環境」「開発環境」という3つのパターンに分けて作成するようにします。
AWSTemplateFormatVersion: '2010-09-09'
// omit
Mappings:
SQSDefinitionMap: #(A)
Production:
"QueueName" : mynavi-sample-queue-production
"VisibilityTimeout": 30
"DelaySeconds" : 5
"MaximumMessageSize" : 26144
"MessageRetentionPeriod" : 345600
"ReceiveMessageWaitTimeSeconds" : 0
// omit
Parameters:
EnvType: #(B)
Description: Which environments to deploy your service.
Type: String
AllowedValues: ["Dev", "Staging", "Production"]
Default: Dev
Resources:
SQSSampleQueue: #(C)
Type: AWS::SQS::Queue
Properties:
QueueName: !FindInMap [SQSDefinitionMap, !Ref EnvType, QueueName] #(D)
VisibilityTimeout: !FindInMap [SQSDefinitionMap, !Ref EnvType, VisibilityTimeout]
DelaySeconds: !FindInMap [SQSDefinitionMap, !Ref EnvType, DelaySeconds]
MaximumMessageSize: !FindInMap [SQSDefinitionMap, !Ref EnvType, MaximumMessageSize]
MessageRetentionPeriod: !FindInMap [SQSDefinitionMap, !Ref EnvType, MessageRetentionPeriod]
ReceiveMessageWaitTimeSeconds: !FindInMap [SQSDefinitionMap, !Ref EnvType, ReceiveMessageWaitTimeSeconds]
Outputs:
SQSServiceEndpoint: #(E)
Description: SQS service endipoint
Value: !Sub https://sqs.${AWS::Region}.amazonaws.com
Export:
Name: !Sub MynaviSampleSQS-${EnvType}-ServiceEndpoint
SQSServiceRegion: #(F)
Description: SQS service region
Value: !Sub ${AWS::Region}
Export:
Name: !Sub MynaviSampleSQS-${EnvType}-Region
SQSSampleQueue: #(G)
Description: SQS sample queue
Value: !Ref SQSSampleQueue
Export:
Name: !Sub MynaviSampleSQS-${EnvType}
SQSのテンプレートの記述の基本となるポイントは下表の通りです。
記述 | 説明 |
---|---|
A | Mappingsとして、EnvTypeパラメータの値に応じて、3つの環境ごとの論理名とパラメータを定義します。Mappings定義方法の詳細はアプリケーションロードバランサー(ALB)スタック構築テンプレートと同様なので適宜参照してください |
B | SQSを「商用環境」「ステージング環境」「開発環境」用に分けるよう、EnvTypeパラメータとして指定可能にします。このパラメータに応じて、Mappingsに定義したパラメータを切り替え、リソース定義を分けて作成できるようにします |
C | SQSのリソース定義を行います。定義するプロパティの詳細はAWS::SQS::Queueを参照してください |
D | 環境によって異なる値を定義したい箇所は、EnvTypeパラメータを引数としたFindInMap関数でデータ取得します |
E | SQSのサービスエンドポイントをOutputs出力します |
F | SQSを構築したリージョンをOutputs出力します |
G | SQSのキュー名をOutputs出力します |
作成したテンプレートに対して、ヘルパースクリプトを以下のように、スタック名とテンプレートパスを変更して実行します。
#!/usr/bin/env bash
stack_name="mynavi-sample-sqs"
template_path="sample-sqs-cfn.yml"
parameters="EnvType=Dev"
aws cloudformation deploy --stack-name ${stack_name} --template-file ${template_path} --parameter-overrides ${parameters} --capabilities CAPABILITY_IAM
実行が正常に終了すると、SQSのキューが作成されます。
以上、今回はS3、SQSを構築するCloudFormationテンプレートを実装しました。次回は、これまで作成してきたテンプレートを一括で実行できるよう親子関係でネスト化する手順について解説します。
著者紹介
川畑 光平(KAWABATA Kohei) - NTTデータ 課長代理
金融機関システム業務アプリケーション開発・システム基盤担当を経て、現在はソフトウェア開発自動化関連の研究開発・推進に従事。
Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなどさまざまな開発プロジェクト支援にも携わる。2019 APN AWS Top Engineers & Ambassadors選出。
本連載の内容に対するご意見・ご質問は Facebook まで。