Dockerの概要
Get started with Docker Compose | Docker Documentation
IAMの概要
(VPCの概要)
Amazon Elastic Container Service とは - Amazon Elastic Container Service
コンテナ起動タイプが2つ
Fargate launch type: サーバーレスにコンテナをデプロイできる
EC2 launch type: EC2にコンテナインスタンスを構築してからそこにコンテナをデプロイする
タスク定義: アプリケーションを実行するのに必要な設定を記述したJSON
タスクとサービス: タスク定義をインスタンス化したのがタスク
クラスタ: リソースの論理グループ化
コンテナインスタンス
コンテナエージェント: タスクの起動や停止 / リソース利用状況をECSに送信etc..
ECR
タスク定義の例 - Amazon Elastic Container Service
コンテナのログはcloud watchに簡単に出力できる
環境変数でECS上のコンテナに機密情報を設定することは推奨されていない
However, those methods may not provide the desired level of security because environment variables can be shared with any linked container, read by any process running on the same Amazon EC2 instance, and preserved in intermediate layers of an image and visible via the Docker inspect command or ECS API call. You could also bake secrets into the container image, but someone could still access the secrets via the Docker build cache.
上記の理由以外にも、JSONのタスク定義だと平文の機密情報がコンソールから閲覧可能になってしまっていて、 しかもタスク定義を削除することができないのでそれが残ってしまう。
コンテナインスタンスの設定時にもS3を使って機密情報を設定することが推奨されている
しかし、VPCエンドポイント作成時には、既存の接続が瞬断するので本番環境があるVPCで設定しようとすることがあれば注意が必要
ECSのタスクに対してIAMロールを設定し、パラメータストアに保存している機密情報を限定的に読み込み可能にしている
RUN apt-get update && apt-get install -y \
python-dev \
zip \
jq
RUN curl -O https://bootstrap.pypa.io/get-pip.py
RUN python get-pip.py
RUN pip install awscli
Node.jsのSDKの認証情報がタスク用のIAMロールになってしまった
参考: タスク用の IAM ロール - Amazon Elastic Container Service
注記 タスク用の IAM ロールを指定すると、そのタスクのコンテナ内の AWS CLI または他の SDK は、タスクロールによって提供された AWS 認証情報を排他的に使用し、コンテナインスタンスから IAM アクセス権限を継承しなくなります。
ローカル環境でも動作させたかったので、prefixの有無を見てパラメータストアを利用するようにした
以下は、エントリポイント用のシェルスクリプト
#!/bin/bash
#This is simple bash script that is used to test access to the EC2 Parameter store.
set -e
# Getting region
PARAMETER_STORE_PREFIX=${PARAMETER_STORE_PREFIX:-}
if [ -n "$PARAMETER_STORE_PREFIX" ]; then
# NOTE: May be Fargate backend not return availability zone
EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
# Trying to retrieve parameters from the EC2 Parameter Store
SECRET_1=`aws ssm get-parameters --names ${PARAMETER_STORE_PREFIX}.secret-1 --with-decryption --region $EC2_REGION --output text 2>&1`
SECRET_2=`aws ssm get-parameters --names ${PARAMETER_STORE_PREFIX}.secret-2 --with-decryption --region $EC2_REGION --output text 2>&1`
fi
exec "$@"
(ブログでパラメータストアから機密情報を設定するスクリプトをS3に保存している理由がよく分かっていない)
Amazon ECS コマンドラインインターフェースの使用 - Amazon Elastic Container Service
コンテナインスタンスにファイルを用意する必要がでてきそうだったので mysqlの設定ファイルを利用しないようにdocker-compose.ymlを修正した。
(どうやるのがいいのか分かっていない)
ローカルでコンテナを起動させたあとに docker stats
でメモリ使用量を確認してから
コンテナインスタンスのタイプを決めるとスムーズになる。
docker-comose.ymlで指定したmemory上限を超えるとOut of Memoryになってタスクが終了する。
チュートリアル: ECS CLI を使用して EC2 タスクのクラスターを作成する - Amazon Elastic Container Service
スケールアウト / 可用性の調査
Fargate