本連載では、以下のイメージの構成にあるAWSリソース基盤自動化環境の構築を実践しています。
前回は、ECSクラスタを構築するCloudFormationテンプレートを実装しました。今回はECSタスク定義を行うCloudFormationテンプレートを作成し、実行していきます。
なお、実際のソースコードはGitHub上にコミットしています。以降のソースコードでは本質的でない記述を一部省略しているので、実行コードを作成する場合は、必要に応じて適宜GitHub上のソースコードも参照してください。
ECSタスク定義スタック構築テンプレート
ECSタスク定義は、連載「AWSで作るクラウドネイティブアプリケーションの基本」の第9回で実施したものと同等のものを構築します。ECSタスクをCloudFormationで構築する場合、リソースタイプが「AWS::ECS::TaskDefinition」で、ECSタスクの実行に必要なIAMロール「AWS::IAM::Role」と、ECSコンテナのなかで実行されるアプリケーションに付与するIAMロール「AWS::IAM::Role」が必要です。プロパティとして設定可能な属性は、上記リンク先の通りですが、加えて、ECSを「商用環境」「ステージング環境」「開発環境」という3つのパターンに分けて作成するようにします。
テンプレートのサンプルは以下の通りです。
AWSTemplateFormatVersion: '2010-09-09'
// omit
Parameters:
EnvType:
Description: Which environments to deploy your service.
Type: String
AllowedValues: ["Dev", "Staging", "Production"]
Default: Dev
Mappings:
BackendServiceTaskDefinitionMap: #(A)
Production:
"Memory" : 1024
"Cpu" : 512
"ContainerName" : "mynavi-sample-cloudformation-ecs-backend-service"
"ContainerImage" : "debugroom/mynavi-sample-cloudformation-ecs-backend-service:1.0-RELEASE" #(B)
"ContainerPort" : 8080
"HostPort" : 0
"ContainerMemory" : 1024
"Profile" : "production"
Staging:
"Memory" : 1024
"Cpu" : 512
"ContainerName" : "mynavi-sample-cloudformation-ecs-backend-service"
"ContainerImage" : "debugroom/mynavi-sample-cloudformation-ecs-backend-service:1.0-SNAPSHOT"
"ContainerPort" : 8080
"HostPort" : 0
"ContainerMemory" : 1024
"Profile" : "staging"
// omit
Resources:
BackendECSTaskRole: #(C)
Type: AWS::IAM::Role
Properties:
Path: /
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ecs-tasks.amazonaws.com
// omit
ECSTaskExecutionRole: #(D)
Type: AWS::IAM::Role
Properties:
Path: /
AssumeRolePolicyDocument:
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
Service: ecs-tasks.amazonaws.com
ManagedPolicyArns: #(E)
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
- arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
- arn:aws:iam::aws:policy/SecretsManagerReadWrite
BackendServiceECSTaskDefinition:
Type: AWS::ECS::TaskDefinition #(F)
Properties:
Family: !Sub sample-ecstask-backend-service-${EnvType}
RequiresCompatibilities:
- EC2
Memory: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, Memory]
Cpu: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, Cpu]
NetworkMode: bridge
ExecutionRoleArn: !GetAtt ECSTaskExecutionRole.Arn
TaskRoleArn: !GetAtt BackendECSTaskRole.Arn
ContainerDefinitions:
- Name: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, ContainerName]
Image: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, ContainerImage]
PortMappings:
- ContainerPort: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, ContainerPort]
HostPort: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, HostPort]
Memory: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, ContainerMemory]
Environment: #(G)
- Name: ENV_TYPE
Value: !FindInMap [BackendServiceTaskDefinitionMap, !Ref EnvType, Profile]
Secrets: #(H)
- Name: RDS_PASSWORD
ValueFrom : !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/mynavi-sample-cloudformation-rds-password"
// omit
Outputs:
// omit
FrontendECSTaskRole:
Description: Frontend ECS Task has role
Value: !Ref FrontendECSTaskRole
Export:
Name: !Sub ${VPCName}-FrontendEcsTaskRole-${EnvType}
BackendECSTaskRole:
Description: Backend ECS Task has role
Value: !Ref BackendECSTaskRole
Export:
Name: !Sub ${VPCName}-BackendEcsTaskRole-${EnvType}
ECSタスク定義のテンプレートの記述の基本となるポイントは下表の通りです。
記述 | 説明 |
---|---|
A | パラメータEnvTypeに応じて、Backend Serviceアプリケーションのタスク定義に適用するパラメータ値を変更するよう、Mappings要素を定義します。省略していますが、Mapはアプリケーションの単位で作成します |
B | コンテナイメージでは、DockerHub上にプッシュすることを前提としたURIを定義しておきます |
C | ECSコンテナで実行するアプリケーションが利用するAWSサービスへのアクセス許可を付与するIAMロールを定義します。詳細は「AWS::IAM::Role」を参照してください。個々のサービスアクセスポリシーは次回解説しますが、ここではロールのみを定義するかたちとします |
D | ECSタスク実行するために必要なIAMロールを定義します。詳細は「AWS::IAM::Role」を参照してください |
E | ECSタスク実行に必要なポリシーはAmazonECSTaskExecutionRolePolicyになりますが、タスク定義のなかでSystems Manager Parameter StoreやSecret Managerへのアクセスが発生するため、必要なアクセスポリシーをアタッチします |
F | ECSタスク定義を定義します。詳細は「AWS::ECS::TaskDefinition」を参照してください |
G | コンテナイメージに環境変数を設定します。FindInMap関数を用いて、作成する環境に応じてパラメータを切り替えます |
H | Systems Manager Parameter Storeからセキュア文字列を取得し設定します。ここで設定した環境変数はAWSコンソール上からも参照できないため、パスワードなどの秘匿性のあるデータはSecretsプロパティを使って設定してください。記載形式の詳細はAWS公式開発者ガイドの「機密データの指定」も参照してください |
作成したテンプレートに対して、以下のように、スタック名とテンプレートパスを変更してヘルパースクリプトを実行します。
#!/usr/bin/env bash
stack_name="mynavi-sample-ecs-task"
template_path="sample-ecs-task-cfn.yml"
parameters="EnvType=Dev"
aws cloudformation deploy --stack-name ${stack_name} --template-file ${template_path} --parameter-overrides ${parameters} --capabilities CAPABILITY_IAM
実行が正常に終了すると、ECSタスクが作成されます。
以上、今回はECSタスクを構築するCloudFormationテンプレートを実装しました。次回は、ECSタスクのIAMロールにAWSリソースへのアクセスポリシーを付与するCloudFormationテンプレートを作成する手順を紹介します。
著者紹介
![]() |
川畑 光平(KAWABATA Kohei) - NTTデータ
金融機関システム業務アプリケーション開発・システム基盤担当、ソフトウェア開発自動化関連の研究開発を経て、デジタル技術関連の研究開発・推進に従事。
Red Hat Certified Engineer、Pivotal Certified Spring Professional、AWS Certified Solutions Architect Professional等の資格を持ち、アプリケーション基盤・クラウドなど様々な開発プロジェクト支援にも携わる。AWS Top Engineers & Ambassadors選出。
本連載の内容に対するご意見・ご質問は Facebook まで。
※ 本記事は掲載時点の情報であり、最新のものとは異なる場合がございます。予めご了承ください。
連載目次
関連リンク
ダウンロードBOXに入れる
記事をダウンロードBOXに追加します。よろしいですか?
ブックマーク
記事をブックマークに追加します。よろしいですか?
-
[2021/03/05 08:00] サーバ/ストレージ
-
[2021/03/04 08:00] クラウド
-
$side_seminar_count = $i+1; ?>
-
2021年3月12日(金) 13:00 ~ 17:00 【第1部】13:00~13:50(基調講演) 【第2部】14:00~16:15 計12セッション 【ASK THE SPEAKER】16:30~17:00(講演者への質問コーナー)
KDDI SOLUTION DAY 2021 ~不確実性の高い時代のビジネス共創とDX~
$side_seminar_count = $i+1; ?>
-
2021年3月12日 金曜日 13:00 – 14:50
DXでさらに企業進化を AI+自動化でビジネスをパワーアップ
$side_seminar_count = $i+1; ?>
-
2021年3月15日(月)0:00~2021年3月31日(水)23:59
KDDI まとめてオフィスの学校向けオンラインセミナー ~これからの教育ICT推進に向けて~
$side_seminar_count = $i+1; ?>
-
2021年 3月 18日 (木) 13:00~18:20
マイナビニュース スペシャルセミナー 2021年の脅威に対峙する
$side_seminar_count = $i+1; ?>
-
2021年3月18日(木)15:00~16:00
5G時代のCDNに!コスト削減と顧客体験向上を両立させるCDNとは?
今注目のIT用語の意味を事典でチェック!