さいとブログ

Terraform+CLIでFargateに踏み台サーバを任意のタイミングで起動・停止できるようにしてみた

今回、Terraform で踏み台サーバのタスク定義と DockerImageをpushしておいて、必要なタイミングでCLIで起動できるような構成を作ってみました。

全体のコードはこちら
※ そのほかにも RDS,CloudFront,ALB,Firehose など、関係ないリソースも入ってます。


環境

MacOS arch amd64
Terraform 1.1.6
AWS provider > 4.0


手順

踏み台のDockerImageをECRに登録する

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


applyでECRにpushする

以下の点を考慮して、Terraformで実行できるようにコードを書きます。

  • 上で作成したDockerImageを初回apply時にECRにpushするように組む
  • bastionコンテナ起動時に利用するタスク定義を作成します


初回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の実行

ここまでできたら、terraform applyします。
正常終了して、ECRにイメージが登録されて、ECSにタスク定義が作られていればOK。

bastionコンテナの起動

scripts/run-bastion-task.shに処理が記述されています。
簡潔に説明すると、

  • 起動する環境(dev,stg,prod)を選択できる
  • 最新のタスク定義を取得
  • subnetと security groupを取得し、ネットワーク設定をする
  • aws ecs run-taskでbastionコンテナを起動します


ecs-execをする

上でbastionコンテナを起動したら、ecs-exec.shを実行して、session startします。

bastionコンテナの停止

作業が終了したら、scripts/stop-bastion-task.shを実行して、bastionコンテナを停止します。

最後に

途中説明省きましたが、これで必要な時だけ、Fargateでbastionコンテナを起動して、DBに接続することができるようになります。

プロフィール

profile icon

saitoです。
ソフトウェアエンジニアとして働いています。
web開発に関する学びを当ブログに書き残しています。