AWS Copilotを利用してコンテナアプリケーションを高速に立ち上げる

エキサイト株式会社エンジニアの佐々木です。IaCといえば、Terraformがデファクトスタンダードですが、AWSのECSを利用しているのであれば、 AWS Copilotコマンドが便利だと思いますので紹介します。

前準備

AWS Copilot CLIをインストールしておきます。

aws.github.io

AWS クレデンシャルの設定

AWS Copilotの実行には、AWS クレデンシャルが必要です。aws configure ssoでも、IAM でのアプリケーションキーの発行でもどちらでも動作します。

AWS Copilotの環境構築

AWS Copilotの環境構築は下記の手順になります。

コマンド できること
copilot app init AWS Copilotの管理用の名前空間を構築します。Application と呼ばれます。
copilot env init copilotで指定する環境を作成します。ECSコンテナとかが作成されます。(環境数分作成します。dev/test/stage/prod なら4回行います。)
copilot env deploy copilotで作成した環境をAWSにデプロイします。
copilot svc init ECSコンテナ内のサービス作成に必要な設定ファイル等を生成します。
copilot svc deploy ECSコンテナ内のサービス作成・ALB作成・ターゲットグループ作成を行います。

copilot app init

下記のコマンドでsample-appを構築します。

copilot app init sample-app

Application

このコマンドでaws copilotのApplication を作成します。Applicationは、AWS Copilotの管理用のネームスペースになります。基本的にApplicationの中にECSだったりALBだったりが設定されていくイメージです。(実際は異なります)

copilot env init

Application内を環境ごとに区分けするコマンドです。

# 下記コマンドでtest envを作成します。
copilot env init test --import-vpc-id vpc-xxxxxxxxx, --import-public-subnets subnet-aaaa,subnet-bbbb --import-private-subnets subnet-cccc,subnet-dddd

# 下記コマンドでprod envを作成します。
copilot env init prod  --import-vpc-id vpc-zzzzzzzzz, --import-public-subnets subnet-kkkk,subnet-lllll --import-private-subnets subnet-mmmmm,subnet-nnnnn

アプリケーション開発をしていると、環境ごとにわけることはあるかなと思いますので、その数だけ環境を作成します。(必要になったら作る感じでいいと思います。)イメージとしては、ECSのクラスターの設定ファイルが作成されます。 オプションで--importコマンドで既存のVPCやサブネットを指定できます。(Terraformと組み合わせるときに便利です)

copilot env deploy

上記で作成した設定ファイルをAWSにデプロイします。

copilot env deploy --name test

copilot env deploy --name prod

デプロイすると、こんな下記のイメージになります。

copilot svc init

ECSのサービスやALBの定義を作成するコマンドになります。

下記のようなコマンドを実行します。

copilot svc init --name ${サービス名} --svc-type ${サービスタイプ}  --image ${コンテナイメージ}

--svc-type は下記を設定できます。

--svc type できること
Request-Driven Web Service AWS App Runnerを設定をするモード
Load Balanced Web Service ECS Fargete x Load Balancerを設定をするモード
Backend Service Load BalancerなしのECS Fargateを設定するモード。外部からアクセスはできない。
Worker Service SQS/SNSを利用したECS Fargateを設定するモード
Static Site 静的ファイルをS3に配置し、CrowdFrontと連携を設定するモード

以上となります。よく使うのは、Load Balanced Web ServiceBackend Service になります。今回は下記のコマンドを実行します。

copilot svc init --name sample-service --svc-type "Load Balanced Web Service" --image public.ecr.aws/nginx/nginx:stable-perl --port 80

サンプルなので、コンテナイメージはNginxとします。これを実行するとmanifest.ymlが出力されます。

copilot/
  sample-service/
     - manifest.yml

copilot svc deploy

下記のコマンドを実行して、manifest.ymlを元にデプロイを行います。

cd sample-service
copilot svc deploy --name sample-service --env test

ECS Fargateのサービスとタスク、ALBの作成が完了します。イメージとしては下記になります。

このときに、ドメイン等を紐づけていない場合は、ランダムな文字列のURLを発行して、リクエストができるようになります。

このURLにアクセスすると、Nginxのデフォルト画面がでてきます。

まとめ

AWS Copilotで簡単にAWS ECS Fargate / Application LoadBalancer まわりの設定ができました。生成されるmanifest.ymlもかなりわかりやすく書かれているので、運用もしやすいかと思います。メディア事業部ではサービスの立ち上げ等を頻繁に行うので、30分程度で環境構築できるのは魅力的です。今後使っていこうと思います。また、別記事にはなりますが細かい設定を行いたい場合は、YAMLでパッチをあてることも可能でかなり広範囲でAWS Copilotは活躍してくれそうです。

さいごに

エキサイトではフロントエンジニア、バックエンドエンジニア、アプリエンジニアを随時募集しております。長期インターンも歓迎していますので、興味があれば連絡いただければと思います。

募集職種一覧はこちらになります!(カジュアルからもOK) www.wantedly.com