踏み台サーバーをAWS Fargateで構築

Arata Kurokawa
nextbeat-engineering
Jul 29, 2022

ネクストビートでWebエンジニアとして働いている黒川と申します。
ネクストビートは2021年6月入社で、保育士バンク!コネクトというサービスの開発を担当しています。

今回は踏み台サーバーをAWS Fargateで構築してみたので紹介したいと思います。

なぜするのか?

EC2で踏み台サーバーを構築することがよくあると思いますが、下記のような問題あります。

  • OSの脆弱性対策、パッチ適応などが利用者側の責務になり運用負荷が発生してしまいます。
  • sshキーの管理が発生してしまう。
  • ssh接続を使用している場合は踏み台サーバーのログイン経路が外部にさらされた状態になってしまいます。
EC2インスタンスで構成

これらを解決するためにECS/FargateとSession Mangaerを使用して踏み台サーバーを構築します。

  • OSの脆弱性対策、パッチ適応などがAWSの責務になり運用負荷が減ります。
  • セキュリティー設定をIAMで一元管理できます。
    sshキーの管理が不要になります。
  • 踏み台サーバーをプライベートネットワークに配置することでアタックサーフェスを減らします。
FargateとSession Mangerで構成

コンテナ作成

今回、イメージは amazonlinux2を使用します。

Session Mangaerを利用するためには踏み台サーバーにSSM Agentをインストールが必要です。

amazonlinux2にはデフォルトでSSM Agentがインストールされています。

イメージの作成して、ECRへのプッシュ行います。
ECRにプッシュするための権限をユーザに付与しておいてください。

  • イメージを作成
「docker buildコマンド」と「Dockerfile」
  • ECRへプッシュ
pushコマンド

ネットワーク構築

プライベートネットワークにサーバーを配置するので、VPCエンドポイント または NATゲートウェイを使用して、ECRからイメージをpullできるようにしておいてください。

ECS構築

デフォルトだとコンテナ起動後、コンテナを起動させ続けるためのプロセスが存在しないため、すぐに正常終了してコンテナが停止してしまいます。

タスク定義のJSONのpseudoTerminalという項目をtrueにする必要があります。
そうすることで、TTY を割り当てることができます。

ECSタスクロールにSSM(Systems Manager)へのアクセス許可も追加します。

踏み台サーバーへアクセス

タスクに対して ECS Execを有効にします。

Management Console上ではECS Execを有効にするための設定がないためCLIで有効にします。

update-serviceを実行するにも権限が必要なのでユーザに権限を付与してください。

ECS Execを使用する権限をユーザに付与して、起動中のタスクIDとコンテナ名でECS Execを実行すると、コンテナ内へアクセスすることが可能になります。

MFA

ECS ExecにMFAを適応することもできます。

ポリシーにMFAしていることを条件に追加します。

get-session-tokenでセッショントークンを取得し、credentialsに追加します。

ECS Execのコマンドにprofileのオプションを追加し、実行するとコンテナ内へアクセスすることが可能になります。

踏み台サーバからDatabaseへアクセス

今回はMysqlを使用します。
Databaseの作成時にMysqlを選択してください。

dockerのイメージにmysql clientインストールします。

ECSからアクセスできるように、Databaseにはインバウンドに3306ポートを許可しているセキュリティグループを割り当ててください。

これでECSからmysqlコマンドでデータベースへアクセスすることができます。

監査ログ

コンテナ内で実行したコマンドのログをCloud Watch Logsに出力することができます。

デフォルトではECSタスク定義に設定されているawslogsにログが出力されます。

別のロググループにECS Execのログを出力させたい場合はupdate-clusterでログ出力先を設定します。

ログを出力する権限をECSタスクロールに追加します。

ただCloud Watch Logsに出力されるログには、誰が操作したかまでは分かりませんが、Cloud Tailを使用すると誰が実行したかが分かるようになります。

Cloud Tailのイベント履歴のExecuteCommandのユーザ名を見れば誰が操作したか分かります。

Cloud Tailのイベント履歴

イベントの詳細を開くとイベントレコードにsessionIdという項目があります。
Cloud Watch LogsにはsessionId毎にログが出力されているので、誰がどんな操作したか分かります。

Cloud Watch Logのセッション毎のログ

Session Managerにログは出力されますが、所有者が下記のように出力されるのでCloud Tailを使用しました。

arn:aws:sts::<account_id>:assumed-role/AWSServiceRoleForECS/ecs-execute-command

ここまで読んでいただきありがとうございました!

今回はCLIやManagement Consoleで構築を行いましたが、Terraformで実装してみようかと思います。

We are Hiring!

株式会社ネクストビートでは

「人口減少社会において必要とされるインターネット事業を創造し、ニッポンを元気にする。」
を理念に掲げ一緒に働く仲間を募集しております。

バックエンドにはPlay Framework(言語はScala)、フロントエンドの開発には主にAngularを用いています。フルスタックに開発したい!という方のご応募をお待ちしております。

--

--

nextbeat-engineering
nextbeat-engineering

Published in nextbeat-engineering

「人口減少社会への価値貢献」をミッションとするネクストビートのエンジニアによるエンジニアブログです。Scala,Angular,Kotlin,Svelte,TypeScriptなど社内で使用されている技術の情報だけでなく、社員のインタビュー記事や自社イベント、社内勉強会の様子も配信します。※本ブログ掲載記事は、一部に当社従業員が個人で作成し、当社ブログでの利用を許諾した記事が存在し、個人のブログ等で公開された内容が含まれます。