kikki's tech note

技術ブログです。UnityやSpine、MS、Javaなど技術色々について解説しています。

AWS CloudFormationだけでECS環境を構築する

本章では、AWS CloudFormationを利用した、ECSの構築方法について共有します。

構成

例として、SpringアプリケーションをECS上に展開させます。以下のコンテナを用意します。

外部からの接続を想定して、SecurityGroupでアクセス権限を限定し、ロードバランサーで負荷分散も行います。

f:id:kikkisnrdec:20190426185037p:plain

ソースコード

ソースコードのボリュームが多かったので、GitHubにアップしました。記事と照らし合わせて参照ください。
github.com

CloudFormationの実演

事前準備

ロールの作成

ECSの環境を構築、実行するために、必要な権限を保持したロール及びプロファイルを作成します。今回は、すでに定義されているポリシーを参照し、以下のロールを用意しました。

  • AWS::IAM::Role
    • AmazonECSTaskExecutionRolePolicy
      • Fargate起動タイプで使用
      • Amazon ECR からコンテナイメージを取得し、ログオプションの awslogs ログドライバーを使用権限を付与
    • AmazonEC2ContainerRegistryReadOnly
      • Amazon ECR への読み取る権限を付与
    • AmazonEC2ContainerServiceforEC2Role
      • EC2起動タイプで使用
      • Amazon ECS コンテナエージェントで、Amazon ECS API への呼び出しを実行する権限を付与
    • CloudWatchAgentServerPolicy
      • インスタンスから情報を読み取り、CloudWatch に書き込むアクセス権限を付与
ロググループの作成

コンテナ内サービスの実行ログを監視するために、CloudWatch Logsを使用します。そして今回のECSでのログを束ねるグループとして、ロググループを作成します。

  • AWS::Logs::LogGroup
    • LogGroupName
      • ロググループ名を指定
    • RetentionInDays
      • ログの保持期間を指定
クラスタの作成

特定のコンテナ群を管理するクラスタを作成します。

  • AWS::ECS::Cluster

ネットワークの作成

今回のECSで必要なインフラを配置する、ネットワークを構築します。

サービスディスカバリーの作成

コンテナ間での名前解決のために、Cloud Mapを利用します。Cloud Mapにより、コンテナのサービス名がRoute53に登録され、正引きが行なえます。

ECSの作成

Reverse ProxyサーバーやWEBサーバーを構築します。

  • AWS::ECS::TaskDefinition
    • NetworkMode
      • FargateもEC2もともに通信できるよう、「awsvpc」を選択
    • RequiresCompatibilities
      • ECSの起動タイプを選択
        • EC2
          • MySQLは、ハードリソースを消費するため、EC2を選択
        • Fargate
          • Nginx Tomcat Redisは、Fargateを選択

ロードバランサーのURLを取得

以下のコマンドで、ロードバランサーのURLを取得します。

$ aws cloudformation describe-stacks --stack-name loadBalancer | jq -r '.Stacks[].Outputs[] | select(.OutputKey=="LoadBalancerUrl") | .OutputValue'

筆休め

アプリケーションのポータビリティと再現性を担保するために、コンテナ技術を利用するケースがあります。AWSのインフラ構築もコマンド一つで展開できるよう準備しておくことで、フットワークの軽いサービスを提供できます。ぜひインフラ構成のコード化も試みてください。

以上、「CloudFormationだけでECS環境を構築する」でした。


※無断転載禁止 Copyright (C) kikkisnrdec All Rights Reserved.