目的
学習用AWS環境のコストが添付画像のような状態となっており、コストの80%程度を占めるNatGateway(以下、NGW)の金額(画像右端グラフの紫部分)を抑えること
元凶
NGWはEC2インスタンスのように起動・停止が出来ず、起動時間に対して料金が発生するためこんな状態になっています。 これが続くと馬鹿にならないので、早急に対応したいと思います。
ちなみにNGWの料金はCostExplolerから見ると「EC2 その他」という項目に入っていてぱっと見では分かりません。
グラフ横にあるフィルター>サービスからEC2その他を選択し、グループ化の条件に使用タイプを選択すると下記のように内訳をみることができます
対処方法
- CloudFormationでNGWを削除したり作成したりする
- CloudFormationで環境そのものを削除したり作成したりする
- NGWを外した構成にできないか検討する
1に関しては、ルートテーブルも直さないといけないなどNGWを作ったり消したりすることはサービス基盤として運用するには非効率すぎるというご指摘を知り合いのエンジニアの方から頂いたため却下。
一応参考URL: 必要な時だけNAT Gatewayを作成する方法 | DevelopersIO
今回は3を採用してみたいと思います。
やること
要件
- public subnetに移行されたEC2インスタンスには任意のポート番号にhttp通信した時にのみアクセスされること
構成の変更
現在の構成
変更後の構成(これもアドバイスいただきました。勉強になります)
- TODO
- ProtectedにあるインスタンスをPublicに配置し直す
- セキュリティグループのインバウンドをALBのSGIDをトリガーに許可するようにする
- メンテナンス用途のログインについては、SSMセッションマネージャーでログイン
実装
既存のAZ-aに所属するprotectedsubnetに配置されていたEC2からイメージを作成します
セキュリティグループの設定にALBのSGIDを選択し、ポート8080のみ許可するように設定し、それ以外はデフォルト設定でOKです
EIPを新しく作成し、先ほど作成したインスタンスに関連づけます
先ほど作成したEC2インスタンスをALBのターゲットグループに追加します
statusがhealthyになっていることを確認します
他のインスタンスが停止状態になっていることを確認し、URLにアクセスして画面が正常に表示されればOKです
続いて、SSMセッションマネージャーを利用してEC2にログインしてみます。
セッションマネージャーでEC2インスタンスにアクセスする
SSMセッションマネージャーとは
Session Manager はフルマネージド AWS Systems Manager 機能です。Session Manager を使って、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、エッジデバイス、オンプレミスサーバー、仮想マシン (VM) を管理できます。インタラクティブ・ワンクリック ブラウザ ベースのシェル、または AWS Command Line Interface (AWS CLI) を使用できます。Session Manager は安全かつ監査可能なノード管理を実現し、インバウンドポートを開いたり、踏み台ホストを維持したり、SSH キーの管理したりする必要はありません。また Session Manager はマネージドノードの制御されたアクセス、厳格なセキュリティプラクティス、ノードアクセス詳細がある完全監査可能なログを要件とする社内ポリシーの尊守を実現しつつ、エンドユーザーが簡単なワンクリック・クロス プラットフォームアクセスによってマネージドノードの使用を実現します。
引用:
AWS Systems Manager Session Manager - AWS Systems Manager
- こちらのメリットとして、公式にあげられているものの中に、下記のような記述もあり今回の要件を満たすのに最適だと言えるように感じます
インバウンドポートを開いたり、踏み台ホストや SSH キーを管理したりする必要はありません マネージドノードのインバウンド SSH ポートとリモート・パワーシェル ポートを開いたままにした場合、エンティティが未許可または悪意のあるコマンドをマネージドノード上で実行するリスクが大幅に増加します。Session Manager はこれらのインバウンド ポートを塞ぎ、SSH キーと証明書の管理、踏み台ホスト、ジャンプボックスの管理からユーザーを解放して、セキュリティ体制の向上に役立ちます。
- EC2のIAMロールの設定を開きます
新しいIAMロールの作成リンクを押下します
AmazonSSMManagedInstanceCoreを選択し、ロールをEC2インスタンスにアタッチします
EC2インスタンスのセキュリティタブから任意のロールが割り当てられていることを確認します
AWS System Managerを検索し、ナビゲーションペインからセッションマネージャーを選択し、セッションの開始を選択します
セッションを開始するを選択するとコンソールが開くので、そちらから該当するアプリケーションの起動状態などが確認できればOKです
ssh: connect to host <ホスト名> port 22: Operation timed out
EC2インスタンスを冗長化する
- 基本的な設定は別記事をご参照ください。
IAMロールの割り当てを行い、セッションマネージャーによるインスタンスへの接続設定の確認を行います。
AZ-aに配置したEC2インスタンスを停止した状態で、URLにアクセスし、問題なく画面が表示されればOKです。
こちらもSSH接続を試行して、失敗することを確認します
ssh: connect to host <ホスト名> port 22: Operation timed out
- 最後に元凶のNGWとNGWに割り当てていたEIPを開放します。
今回は以上となります! ここまでお付き合い頂きありがとうございます。
参考:
ステップ 1: Session Manager の前提条件を満たす - AWS Systems Manager
セッションマネージャーのハマりどころをパターンごとに整理してみる | DevelopersIO
AWS Systems Manager セッションマネージャで EC2 インスタンスにセキュアにログイン | 働くひとと組織の健康を創る iCARE