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

このコマンドで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 Service と Backend 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