暑い日が続ますね。前回に続きAWS上でのデプロイ、運用が簡単にできるバックエンド環境をAWSで構築しようと調査・実験を行っていますが、私の頭もヒートアップしています😁
AWSはかなり昔から使っていましたが、EC2、S3がメインでDocker用環境作りは今回がはじめてです。ここ数日間でいろいろと勉強し・試し・挫折し、また勉強し・試し・挫折を繰り返しました。
AWSでDockerを運用するには
前回の AWS App Runnerへの期待(と失望) にもAWSでDockerを運用するにはを書きましたが今回の学習の結果をまとめると、
- AWSのDocker環境は基本的にAmazon Elastic Container Service(ECS)の上に構築されています
- ただしAWS Fargateを使うと、EC2等のリソースを確保しなくても自動的にDocker環境が構築できます。いわゆるサーバレス環境ですね
- またAWS CloudFormationというAWSの各種リソースの作成・管理を自動化するためのテンプレートを使うことでDocker環境構築がコード化できます
- ただしAWS CloudFormationを0から自力で作り運用するには、AWSの専門家になる必要がありそうです
- そこで定型的なDocker環境を簡単に作成できるツールがいくつか用意されています
Kubernetesを理解していないDocker弱者の私には、前回のAWS App Runnerのような簡易ツールに目がいきます。その後もいくつかのツールを試してみました。
AWSのDocker簡易ツール
今回は以下のツールを試してみました
Docker ECS integration
Docker Compose と Amazon ECS を利用したソフトウェアデリバリの自動化は開発環境ではデファクトスタンダードなdocker-composeを使いdocker-composeで定義されたDocker環境をECSにデプロイできる素晴らしいツールです。AWS社とDocker社の協業によって生まれたツールで、まだベータ版のようです。
ただし、制限はあります
- VPC(ネットワーク)やロードバランサー等は事前に準備しないといけません
- Dockerの構築(build)は出来ないのでdocker-composeから利用するDockerイメージはあらかじめAmazon Elastic Container Registry(ECR)その他の場所に準備しておかないと行け
あるブログにあった簡単なサンプルを試してみましたが ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes
というエラーが発生した時点で、どのように対処したら良いのか判らず止めました。
AWS Copilot
AWS Copilot のご紹介はAWSから正式リリースされたオープンのツールです、公式ドキュメントYour toolkit for containerized applications on AWSも用意されています。AWS Copilotはcopilotコマンドをインストールするだけで、Dockerfileをもとにロードバランサー等を含むDocker環境がECR上に構築できる素晴らしいツールです。
さっそくnignxを動かすだけの簡単なDockerfileを使い試したみました、しかしThe following resource(s) failed to create: [PublicLoadBalancer]
エラーで失敗します、ネット上を調べても解決方法がみつかりません。
いろいろ試したが、LoadBalancerを使わないBackend Service等は構築できました。
ひょっとしてと思い、AWSのリージョンを東京(ap-northeast-1)から北カリフォルニア(us-west-1)に換えてみたたところ動きました😅
Copilotは1つのDockerfileをベースに動きますが、設定ファイルmanifest.ymlにサイドカーsidecarsを指定する事で周辺的な処理を行うDockerを利用する事ができます。
今回わかった事
Docker ECS integrationやAWS Copilotのような簡単に使えるツールはありますが、何かトラブルが発生すると、これらのベースになっているAWS CloudFormationの知識が必要になります、ネット情報を検索するとAWS強者たちはCloudFormationのJSONやYAMLで会話しています。 そももも、AWSのベーシックな機能(概念)でありIAMやVPCの知識も要求されます。
これらの知識がないとこれらのツールを使ってもDocker環境の構築・運用はむずかしいのかもしれません。
ただし問題が発生した際には、AWSに有償サービスを依頼する事はできますし、Ask an Expert のような無料サービスがあるのは救いかもしれません。
そしてどうするか
さて、今回のバックエンドの仕事で要求される事は
- 簡単に開発環境が作れるようにしたい
- 簡単にデプロイしたい
- 当面は高負荷にはならない
- 当面は高可用性もいらない
とういことで、AWS弱者ですがLinux等は良くわかってる自分には、AWS EC2上のLinuxにDocker(docker-compose)をインストールし動かした良いのでは? と思いはじめています・・・・
そしてサービスが成長し、高負荷・高可用性が必要になった時点でAWSに詳しいエンジニアをチームに加え、AWSで動く最新のDocker環境を構築すれば良いのではないでしょうか?
そのためにも最初からDockerベースで作っておくのは重要です。