aws

【B-26】AWSでDockerを動かす際のポイント

IT基礎編でdockerについて学んできましたが、Docker を AWS で動かす際には、ローカル環境とは異なる制約や設定の違い を理解する必要があります。
特に、ECS on EC2 と Fargate の違い、ネットワークやボリュームの制限、環境変数の設定方法 を押さえておくことが重要です。


1. AWS における Docker の実行方法

AWS で Docker を実行する主な方法として、以下の 2種類 があります。

実行方法特徴
ECS on EC2EC2 インスタンス上でコンテナを動かす
FargateAWS による完全マネージドなコンテナ実行環境(サーバーレス)

2. ローカル環境と AWS環境 の違い

(1) ネットワークの違いと制約

コンテナ間のネットワークを利用する場合、Fargateに制約があることに注意しましょう。
Fargateはサーバーレスサービスのため、サーバー(ホスト)の操作ができません。
そのため、hostネットワークは利用できないことに注意しましょう。
参考:https://zenn.dev/fdnsy/articles/43b7f4d745ed1f

環境ネットワークの種類特徴制約
ローカル環境【A-27】Docker network 参照コンテナ間通信が可能特になし(自由にネットワークを構成可能)
ECS on EC2VPC 内の ENI(Elastic Network Interface)EC2 上でコンテナごとに ENI を付与できる特になし(EC2の制約に依存)
FargateAWS VPC 内の ENIコンテナごとに直接 VPC 内の IP が割り当てられるawsvpc のみ

(2) ボリュームの違いと制約

ネットワークと同様、Fargateはサーバー(ホスト)がないためvolumeにも制約があります。
そのため、Fargate では、永続ストレージとして EFS(Elastic File System)が必要です。
もしくは、Fargate + RDS + S3で運用するパターンもあります。

環境ボリュームの種類特徴制約
ローカル環境Docker Volume(docker volume create/var/lib/docker/volumes/ に保存自由に管理可能
ECS on EC2EC2 の EBSEC2 にアタッチされた EBS を使うEBS は 1つのインスタンスにしかアタッチできない
FargateAWS EFS複数コンテナ間で共有可能なストレージ(EFS)を利用Docker の -v オプション(ローカルボリューム)は使用不可

3. Dockerfile の設計・考え方

上記でも述べましたが、Fargateの場合はネットワークモードやボリュームに制約があります。
そこでRDSやEFSを併用して構築を行いますが、こうなるとローカル側とコンテナ構成の差分ができるようになります。
(ローカル側でDBコンテナを作るが、AWS側では不要。ローカルではbridgeモードだが、AWS側ではawsvpc。)

AWS では、ローカルと AWS の両方で動作するように設計するため、 GUI(コンソール)側や環境変数で制御できるようにする のがポイントです。
具体的には、
・Dockerfile側はローカル用にbridgeモードで記載しておき、Fargate側はawsvpcで設定を上書きする。
・AWS側ではDBコンテナはビルドしない。
・DockerfileのDBコンテナ情報をAWS側の環境変数でRDS情報に上書きする。