AWS Copilot でAWS Fargateに簡単デプロイしてみよう

Copilotで錬成陣なしデプロイ、真理の扉開けました
2020.12.24

検証のためFargateへデプロイが簡単と噂のCopilotを急遽使ってみました。

  • DockerfileがあればFargateへのデプロイ準備整ったようなもの
  • ローカルで作ってたものを簡単にFargateに載せられます
  • copilot-cliのインストールは必要

デフォルト設定で構築できるテスト環境

本記事では Load Balanced Web Service のサービス設定でデプロイします。Copilotにより構築される環境は以下のイメージです。

Services - AWS Copilot CLIより

つかってみた

備忘録をかねて手元のDockerfileがFargateにコンテナとしてデプロイされロードバランサ経由でアクセスできるまでを残します。

まず、いきさつを説明するとDockerfileを作成しローカルで動作確認をおえました。ここからが問題です。スパッとFargateに載せて動作検証したいことがあるのですが気分がのりません。簡単にデプロイできると噂に聞いていた Copilot の出番か?と調べてみます。

最低限求められるものが、アプリケーションと Dockerfile のみです。

ただいまのディレクトリの状況です。Dockerfilemain.go(アプリケーション)があります。後は勢いだけでデプロイできそうな機運が高まります。

> tree
.
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

Copilotインストール

前提としてAWS CLIやDockerがインストールされている必要があります。

Getting started with AWS Copilot by deploying an Amazon ECS application - Amazon Elastic Container Service

私の環境ではcopilotのインストールだけで済み、コマンドひとつで準備が整いました。

> brew install aws/tap/copilot-cli

バージョン確認

> copilot -v
copilot version: v1.0.0

Install Copilot - AWS Copilot CLI

Copilotでデプロイ

Getting startedではデモアプリを利用しています。私は手元のDockerfileをFargateにデプロイが目的なのでやってみてダメだったら考えることにします。デプロイに至るまでインタラクティブに入力を求められました。せっかくなので最初から見ていきましょう。

copilot initでアプリケーション名を聞かれるので入力します。

> copilot init
Welcome to the Copilot CLI! We're going to walk you through some questions
to help you get set up with an application on ECS. An application is a collection of
containerized services that operate together.


  What would you like to name your application? [? for help] sample-api-server ←入力した箇所

ロードバランサーは使いたかったのでそのまま進ます。

Application name: sample-api-server

  Which workload type best represents your architecture?  [Use arrows to move, type to filter, ? for more help]
  > Load Balanced Web Service
    Backend Service
    Scheduled Job

ロードバランスされる WEBサービスの名前 を聞かれます。パッと見て ELBの名前か と勘違い。sample-api-lbと入力しました。あとで分かりましたがECRのリポジトリのイメージ名もここで指定した名前が付きます。サービス名に対して、ロードバランサの名前をつけてかっこ悪いことになったのでお気をつけてください。

Application name: sample-api-server
Workload type: Load Balanced Web Service

  What do you want to name this Load Balanced Web Service? [? for help] sample-api-lb ←入力した箇所

ECRのココの名前のことです。

カレントディレクトリにDockerfileあるのでそのまま進めます。

Application name: sample-api-server
Workload type: Load Balanced Web Service
Service name: sample-api-lb

  Which Dockerfile would you like to use for sample-api-lb?  [Use arrows to move, type to filter, ? for more help]
  > ./Dockerfile
    Enter custom path for your Dockerfile
    Use an existing image instead

テスト環境でデプロイしても良いかと聞かれるので、yで進ます。

  Would you like to deploy a test environment? [? for help] (y/N)

ECRリポジトリに保存されるDockerイメージのイメージタグ名を聞かれます。

Note: Couldn't find a git commit sha to use as an image tag. Are you in a git repository?
Input an image tag value: latest ←入力した箇所

その後は10分ほど放置してデプロイ完了しました。簡単すぎて逆に不安です。

✔ Deployed sample-api-lb, you can access it at http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com.

補足

copilot init実行時に引数で設定値を指定した実行も可能です。といっても初見ではなにを設定するのかわかっていなかったので対話型で答えていきました。

ドキュメント記載の実行例

copilot init --app demo                      \
  --name api                                 \
  --type 'Load Balanced Web Service'         \
  --dockerfile './Dockerfile'                \
  --port 80                                  \
  --deploy

Getting started with AWS Copilot by deploying an Amazon ECS application - Amazon Elastic Container Service

ロードバランサ経由してコンテナ接続テスト

コンテナで動いているアプリケーションは検証のため適当な値を返すAPIサーバが欲しくて作ったモックです。実行結果に深い意味はなく、ELBのURLへアクセスして実行結果が返ってきたら動作確認はOKのです。デプロイ完了時にELBのURLが表示されていたのでcurlでアクセスしてみます。

GETリクエストで網走市の人口が返ってきます。

> curl http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com
{"Place":"Abashiri","Population":34920}

POSTはplaceで指定した地名(文字列)にテキトーな人口(ランダムな正数)を埋めて返します。正常に動作しています。謎のAPIなので正常かと言えるかはあれですけども本人の意図通り動いているのでヨシ!

> curl -X POST http://sampl-Publi-147UVZMTUH7X7-1197417906.us-east-1.elb.amazonaws.com/location -d place="kitami"
{"Place":"kitami","Population":305}

マネジメントコンソールから見てみる

デフォルトの設定のテスト環境用に構築されたリソースを見てましょう。

新規にVPCが作成されています。

サブネットはPublic2個、Private2個作成されています。

ルートテーブルはPublicSubnet用にインターネットゲートウェイから外へ出られる設定が入っています。PrivateSubnet用は明示的にルートテーブルは作成されず、VPC内のローカル通信のみが許可されています。NAT Gatewayは作成されていません。

セキュリティグループはELB用に80,443がフルオープンと、コンテナ用に他のコンテナと、ELBから許可のインバウンドルールが設定されています。

文字が小さくて読めなかったですね...

ECSクラスターは本来は設定ファイルでいろいろ設定することになるはずなので中身は省略。

Copilotで作成したリソースの削除

こんなに簡単にデプロイできるなら削除してもまた作り直せばいいやと思い削除してみます。

削除対象のCopilotで管理しているアプリケーション名を確認します。

> copilot app ls
sample-api-server

調べた名前を指定してcopilot app deleteでリソースを削除できます。

> copilot app delete --name sample-api-server
Are you sure you want to delete application sample-api-server? Yes

簡単に作成・削除できるのでELBの課金を抑えられて検証するときには嬉しいですね。

おわりに

勢いだけでデプロイできました。今回の私の目的である検証用途のデプロイには必要十分でした。CI/CDのパイプラインもできるみたいなので試したいのですが、そもそもCopilot使ってたのはFargateへデプロイするのに気乗りしないからでした。ここらで本題の検証に戻りたいと思います、それでは。

以上、網走の大村でした。