はじめに
最近AWSのインフラ構築にTerraformを使いはじめて少しずつではあるが使えるようになってきた。
当面はコンテナ環境を構築したいのでFargateを使うのだけどもやはりコンテナ内へのシェルログイン機能がほしい。
当方の環境
Linux環境で実施しているが同様の環境が作れるならOSは問わないと思う。
- aws-cli/2.4.24 Python/3.8.8 Linux/4.15.0-189-generic
- session-manager-plugin
- GNU Make 4.1
- GNU Awk 4.1.4
- jq-1.6
aws-cliとsession-manager-pluginは絶対必要だけどもそれ以外は無くてもコマンドライン操作のコピペでなんとかなる。
実装
ECS Exec
そこでECS Execの出番となり、以下のサイトなどを参考にやってみた。
設定方法は上記を参考にしていただくとしてExecの実行は
aws ecs execute-command --cluster クラスター名 \
--task タスクID \
--container コンテナ名 \
--interactive --command OSコマンド
となり、必要な情報を与えればよいのだが、タスクID以外は事前に自分の設定値なので把握できる。
そしてそのタスクIDだがTerraformのoutputで取得できないかと調べたができなさそうだった。
Task IDの取得
同じようなことを苦労されているようだったので参考にしたかったが、もう少しすっきりやりたかった。
その結果
まあこれでいいんじゃないかなレベル。
細かくは検証していない。
# クラスタ名がmy-clusterの場合
aws ecs list-tasks --cluster my-cluster | jq -r '.taskArns[]' | awk -F'/' '{print $3}'
結果
x0123456789012345678901234567890123456789
出力した値を--task
に渡してやれば良い。
完成版
--profile
や--region
オプションは無くてもよいが自分の環境には必要なので書いておく。
MAKEFLAGS += --warn-undefined-variables
SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c
.DEFAULT_GOAL := help
# all targets are phony
.PHONY: $(shell egrep -o ^[a-zA-Z_-]+: $(MAKEFILE_LIST) | sed 's/://')
# ここは各自の設定に書き換える
PROFILE=default
REGION=ap-northeast-1
CLUSTER=my-cluster
CONTAINER=nginx
get-task-id: ## Get Task ID
$(eval TASK_ID := $(shell aws ecs list-tasks \
--profile ${PROFILE} \
--region ${REGION} \
--cluster ${CLUSTER} | \
jq -r '.taskArns[]' | awk -F'/' '{print $$3}'))
ecs-exec: get-task-id ## Ecs Exec
@aws ecs execute-command \
--cluster ${CLUSTER} \
--profile ${PROFILE} \
--region ${REGION} \
--task ${TASK_ID} \
--container ${CONTAINER} \
--interactive --command /bin/sh
help: ## Print this help
@echo 'Usage: make [target]'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z0-9_-]+:.*?## / {printf "\033[33m%-30s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
使い方
make ecs-exec
結果(最後のところでプロンプトが表示されておりログインできている)
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-xxxxxx
#
解説
ecs-exec
を実行するだけだが、その実行前にget-task-id
タスクが呼び出され環境変数TASK_IDがセットされる。
最後に
別にMakefileは使わなくてもよいけどタスクIDを取得する手間が省けてワンライナーでシェルアクセスできるので便利。
あと、今回の話に関してはTerraformまったく関係ないのでFargate+ECS Execの環境構築ができていれば使える。