踏み台サーバーをAWS Fargateで構築
ネクストビートでWebエンジニアとして働いている黒川と申します。
ネクストビートは2021年6月入社で、保育士バンク!コネクトというサービスの開発を担当しています。
今回は踏み台サーバーをAWS Fargateで構築してみたので紹介したいと思います。
なぜするのか?
EC2で踏み台サーバーを構築することがよくあると思いますが、下記のような問題あります。
- OSの脆弱性対策、パッチ適応などが利用者側の責務になり運用負荷が発生してしまいます。
- sshキーの管理が発生してしまう。
- ssh接続を使用している場合は踏み台サーバーのログイン経路が外部にさらされた状態になってしまいます。
これらを解決するためにECS/FargateとSession Mangaerを使用して踏み台サーバーを構築します。
- OSの脆弱性対策、パッチ適応などがAWSの責務になり運用負荷が減ります。
- セキュリティー設定をIAMで一元管理できます。
sshキーの管理が不要になります。 - 踏み台サーバーをプライベートネットワークに配置することでアタックサーフェスを減らします。
コンテナ作成
今回、イメージは amazonlinux2を使用します。
Session Mangaerを利用するためには踏み台サーバーにSSM Agentをインストールが必要です。
amazonlinux2にはデフォルトでSSM Agentがインストールされています。
イメージの作成して、ECRへのプッシュ行います。
ECRにプッシュするための権限をユーザに付与しておいてください。
- イメージを作成
- ECRへプッシュ
ネットワーク構築
プライベートネットワークにサーバーを配置するので、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のユーザ名を見れば誰が操作したか分かります。
イベントの詳細を開くとイベントレコードにsessionIdという項目があります。
Cloud Watch LogsにはsessionId毎にログが出力されているので、誰がどんな操作したか分かります。
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を用いています。フルスタックに開発したい!という方のご応募をお待ちしております。