今回、Terraform で踏み台サーバのタスク定義と DockerImageをpushしておいて、必要なタイミングでCLIで起動できるような構成を作ってみました。
全体のコードはこちら
※ そのほかにも RDS,CloudFront,ALB,Firehose など、関係ないリソースも入ってます。
環境
MacOS arch amd64
Terraform 1.1.6
AWS provider > 4.0
amazonlinux:2のイメージを使い、RDSに接続するのでMySQLクライアントのパッケージなどを入れておきます。
FROM amazonlinux:2
RUN rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 && \
yum install -y sudo jq awscli shadow-utils htop lsof telnet bind-utils yum-utils && \
yum install -y yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm && \
yum-config-manager --disable mysql80-community && \
yum-config-manager --enable mysql57-community && \
yum install -y mysql-community-client \
yum -y install net-tools \
yum -y install traceroute
以下の点を考慮して、Terraformで実行できるようにコードを書きます。
初回apply時にECRにpushするには、null_resource
で定義します。
// task_definition.json
[
{
"name": "bastion",
"image": "${IMAGE_PREFIX}-bastion-${ENV}:${ENV}",
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "${BASTION_LOG_GROUP}",
"awslogs-region": "${REGION}",
"awslogs-stream-prefix": "ecs"
}
},
"command": ["tail", "-f", "/dev/null"]
}
]
ここまでできたら、terraform apply
します。
正常終了して、ECRにイメージが登録されて、ECSにタスク定義が作られていればOK。
scripts/run-bastion-task.sh
に処理が記述されています。
簡潔に説明すると、
上でbastionコンテナを起動したら、ecs-exec.sh
を実行して、session startします。
作業が終了したら、scripts/stop-bastion-task.sh
を実行して、bastionコンテナを停止します。
途中説明省きましたが、これで必要な時だけ、Fargateでbastionコンテナを起動して、DBに接続することができるようになります。