Tech Hotoke Blog

IT観音とは私のことです。

【AWS】ただしNatGatewayテメーはダメだ

f:id:TechHotoke:20220221182526p:plain

目的

学習用AWS環境のコストが添付画像のような状態となっており、コストの80%程度を占めるNatGateway(以下、NGW)の金額(画像右端グラフの紫部分)を抑えること

f:id:TechHotoke:20220217154924p:plain

元凶

NGWはEC2インスタンスのように起動・停止が出来ず、起動時間に対して料金が発生するためこんな状態になっています。 これが続くと馬鹿にならないので、早急に対応したいと思います。

ちなみにNGWの料金はCostExplolerから見ると「EC2 その他」という項目に入っていてぱっと見では分かりません。

グラフ横にあるフィルター>サービスからEC2その他を選択し、グループ化の条件に使用タイプを選択すると下記のように内訳をみることができます f:id:TechHotoke:20220217155437p:plain

f:id:TechHotoke:20220217155754p:plain

f:id:TechHotoke:20220217155711p:plain

対処方法 

  1. CloudFormationでNGWを削除したり作成したりする
  2. CloudFormationで環境そのものを削除したり作成したりする
  3. NGWを外した構成にできないか検討する

1に関しては、ルートテーブルも直さないといけないなどNGWを作ったり消したりすることはサービス基盤として運用するには非効率すぎるというご指摘を知り合いのエンジニアの方から頂いたため却下。

一応参考URL: 必要な時だけNAT Gatewayを作成する方法 | DevelopersIO

今回は3を採用してみたいと思います。

やること

  • protected subnetに配置されているEC2をpubic subnetに移行すること
  • NGWを削除すること
  • 踏み台サーバーを削除すること
  • 移行後のEC2インスタンス冗長化すること

要件

  • public subnetに移行されたEC2インスタンスには任意のポート番号にhttp通信した時にのみアクセスされること

構成の変更

現在の構成

f:id:TechHotoke:20220215232239p:plain

変更後の構成(これもアドバイスいただきました。勉強になります)

f:id:TechHotoke:20220221175246p:plain

  • TODO
    • ProtectedにあるインスタンスをPublicに配置し直す
    • セキュリティグループのインバウンドをALBのSGIDをトリガーに許可するようにする
    • メンテナンス用途のログインについては、SSMセッションマネージャーでログイン

実装

  • 既存のAZ-aに所属するprotectedsubnetに配置されていたEC2からイメージを作成します

  • セキュリティグループの設定にALBのSGIDを選択し、ポート8080のみ許可するように設定し、それ以外はデフォルト設定でOKです

f:id:TechHotoke:20220219154008p:plain

  • 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ロールの設定を開きます

f:id:TechHotoke:20220220000211p:plain

  • 新しいIAMロールの作成リンクを押下します

  • AmazonSSMManagedInstanceCoreを選択し、ロールをEC2インスタンスにアタッチします

  • EC2インスタンスのセキュリティタブから任意のロールが割り当てられていることを確認します

f:id:TechHotoke:20220220122020p:plain

  • AWS System Managerを検索し、ナビゲーションペインからセッションマネージャーを選択し、セッションの開始を選択します f:id:TechHotoke:20220219235134p:plain

  • すると、画像のようにロールを割り当てたインスタンスが表示されます(インスタンスが起動していることが条件) f:id:TechHotoke:20220220122238p:plain

  • セッションを開始するを選択するとコンソールが開くので、そちらから該当するアプリケーションの起動状態などが確認できればOKです

f:id:TechHotoke:20220220122939p:plain

  • 次にpublic subnetに配置されたEC2インスタンスSSH接続を試みてそれが失敗することを確認します

ssh: connect to host <ホスト名> port 22: Operation timed out

EC2インスタンス冗長化する

  • 基本的な設定は別記事をご参照ください。

techhotoke.hatenablog.com

  • 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