2021-10-24

AWS Copilot で Dockerfile をデプロイしてみた

aws_copilot.md

乱雑な作業記録です。

はじめに

いま、私の手元には Dockerfile があります。

動作確認が終わりました。

このままデプロイしたいです。

します。

ディレクトリ構成 (必要な部分のみ)

$ tree -a . ├── README.md ├── api │   └── Dockerfile └── docker-compose.yml

準備

これによると、AWS Copilot CLI と AWS CLI と Docker が必要らしいです。

基本的には AWS Copilot CLI だけで済みそうですね。

$ brew install aws/tap/copilot-cli

あと、こちらが AWS Copilot CLI 公式ドキュメント です。

AWS Copilot のコンセプトを少し理解する

こちら を読むと、AWS Copilot は以下のような構成をしているようです。

  • Application : 以下の 2 個を包括する概念

    • Environment : いわゆるデプロイステージ ( dev, stg, prod など )

    • Service : 他の AWS サービス ( DynamoDB, S3 など )

したがって、この順番に作成していこうと思います。

Application を作成する

まずは Application を作成します。名前はプロジェクト名と同名にしました。

$ copilot app init ${アプリケーション名}

なお、このときに Route 53 に登録済みの既存ドメイン名を利用することができ、これなら HTTPS が使えるようです。(まだ試していません)

$ copilot app init ${アプリケーション名} --domain example.com

少し待つと、copilot ディレクトリが作成されました。

$ tree -a . ├── README.md ├── api │   └── Dockerfile ├── copilot │   └── .workspace └── docker-compose.yml

Environment を作成する

次に dev という名前の Environment を作成します。

$ copilot env init \ --name "dev" \ --profile "default" \ --default-config

上記の --profile ではどの AWS Credentials を使用するかを指定しているので、使用したいプロファイル名を指定してください。

なお、パラメーターなしで copilot env init を実行すれば、対話でいろいろ聞いてくれます。

これで AWS 上に色々必要なリソースが作成されるようです。

作成されたリソースのプレフィックスは、だいたい {App}-{Env}- でした。

Service を作成する

次に app という名前の Service を作成します。

$ copilot svc init \ --svc-type "Load Balanced Web Service" \ --name "app" \ --dockerfile "./api/Dockerfile" \ --port "80"

なお、パラメーターなしで copilot svc init を実行すれば、対話でいろいろ聞いてくれます。

少し待つと、copilot ディレクトリの下に app/manifest.yml が作成されました。

$ tree -a . ├── README.md ├── api │   └── Dockerfile ├── copilot │   ├── .workspace │   └── app │   └── manifest.yml └── docker-compose.yml

ちなみに、ポート番号に 80 以外を設定していると、うまくいきませんでした。

よく調べていないので原因不明ですが、そのうちちゃんと調べようと思います。

その他の AWS サービスを作成する

他に必要な AWS サービスがある場合、まずは copilot storage init をしてみてください。

すると、DynamoDB・S3・Aurora のいずれかのリソースを作成するための対話が始まります。

この時点では AWS リソースは作成されないので、適当に db という名前で作成してみます。

すると、copilot/app ディレクトリの下に addons/db.yml が作成されました。

$ tree -a . ├── README.md ├── api │   └── Dockerfile ├── copilot │   ├── .workspace │   └── app │   ├── addons │   │   └── db.yml │   └── manifest.yml └── docker-compose.yml

この YAML ファイルは AWS CloudFormation の記法で書かれており、公式ドキュメントの ここ を参考にして、欲しい AWS リソースを定義すれば良さそうです。

私は、Aurora (PostgreSQL) と Cognito User Pool を作成しました。

デプロイする

最後に、デプロイします。

Environment は dev で、Service は app です。

$ copilot svc deploy \ --env "dev" \ --name "app"

初回のデプロイは、かなり時間が掛かると思います。

また、次回以降のデプロイも同じコマンドでできますが、リソースに変更がないと判断されるとデプロイしてくれません。

そのときは、--force のオプションをつけるとデプロイできます。

追加の AWS リソースでエラーが発生したら

追加の AWS リソースのデプロイでエラーが発生すると、CloudFormation のいつもの悪癖で、ロクに理由を教えてくれません。

と思ったのですが、自分の探し方が悪かったようで、スタックが別に分けてありました。

メインのスタック名が {App}-{Env}-{Service} の形式ですが、追加の AWS リソースは {App}-{Env}-{Service}-AddonsStack-XXXXXXXXXXXX というスタック名です。

そこのイベントに、エラーの詳細が多少は書かれています。

メモ

似たようなことができるヤツで、Docker Compose for Amazon ECS というものがありました。

今回はうまくいかなかったので断念しましたが、選択肢の一つとして頭の片隅に留めておきたいと思いました。

どうせ忘れるのでメモしときました。

0 件のコメント:

コメントを投稿

訓練誤差と汎化誤差の計算

数式をいっぱい書きたい衝動に駆られたので、最近勉強したヤツを書いてみる。 機械学習の課題の一つとして、過学習が挙げられる。 これは、訓練データに対しては精度は高いが、未知のデータに対しては誤差が大きくなり、汎化ができていない状態のこと。端的に言えば、教科書通りに問題を解くこ...