フラミナル

考え方や調べたことを書き殴ります。IT技術系記事多め

SessionManagerを使用したFargate踏み台のベストプラクティス

はじめに

AWS環境を作ると踏み台の管理というのがついて回ります。立てないにこしたことはないのですが、どうしても必要になることがありますよね。

最近のクラウドではWebコンソール上でシェル起動してという選択肢もありますが、うまいこと管理できなかったりツールをずっと置いておくには不向きだったりします。

AWSではSession Manager(SSM)をFargate上で動かすことで踏み台を手軽に、かつ外部公開することなく運用することができるようになりました。以下のブログではその実装方法が解説されています。

f:id:lirlia:20210312183605p:plain

※上記のサイトから引用

私もこれを実際に使っているのですが、その中で見えてきた課題とそれに対する解決方法をまとめておきます。

Fargate踏み台で設定すること

作業ログ取れない問題

Documentを指定すると作業ログが取得できるのですが、ポートフォワーディングやDocumentの指定をスキップされるとログを取れなくなる場合があります。

そのためSSHやリモートコマンドのポートフォワーディングは行わせないこと、デフォルトのDocumentにて作業ログ取得をする設定をすることが求められます。

残し続けるものはEFSへ

.bash_profileやgitリポジトリなどコンテナを作り直す度に新しくなると辛いものはEFSに保存しておき、ECSからマウントするようにしましょう。

コンテナで使うパッケージの管理

Dockerfileでコンテナイメージを作成し変更時にECSをアップデートしていきます。当たり前ですが作り直しになるので、コンテナに追加したパッケージなどは消え去ります。

そのためパッケージを追加したい場合はDockerfileに書く必要があるのですが正直めんどくさすぎます。(入れる度にDockerfileを更新するのか…!)

ということで私はECSからEFSをマウントし、EFSにこのコンテナで利用するパッケージをリストとしてまとめています。このリストを定期的(誰かがログインするたび)にチェックし存在しないパッケージをインストールするようにすることでDockerfileに依存しない形でパッケージの管理をしています。

※このリストはGit管理しておくとよい

コンテナはMulti-AZ構成にしよう

AZ障害が起きると踏み台が死にどこにもアクセスできない可能性があります。ECSでは2つ以上のAZのサブネットに所属させれば片方死んでも起動してくれる ので忘れずに設定するようにしましょう。

ただしEFSやSecurityGroupなどサブネット違うところで起動した時に変わらず接続、利用できることは確認してください。

コンテナを作り直すのはコンテナの外でやろう

TerraformやCloudformationを踏み台で実行するようにしている場合、踏み台自身を再作成することができません。(だって踏み台が途中で落ちるから)

なので必ず他のところで実行できるような環境を用意しましょう。(GitHub Actionなどの自動デプロイを使うのが良い)

タイムアウト値を伸ばそう

SSMのタイムアウト値が短すぎるのでDocumentの設定で60分にしましょう。(正直1日ぐらいにしてほしい)