本記事は TechHarmony Advent Calendar 12/8付の記事です。 |
こんにちは、SCSK 浦野です。
気がついたら12月だね、と会話したと思ったら、その12月も1/3が過ぎてしまいました。
雪国で育ったためか、雪を見ないとなかなか冬という気分になれていない筆者です。
さて、検証などでプライベートサブネットに Amazon EC2 インスタンスを用意して AWS Systems Manager セッションマネージャ経由でアクセスしたいと考えることがあるかと思います。似た状況で複数の AWS 初学者の方が「接続ができない!」とハマった所を見ましたので、環境を作成しながら確認ポイントを解説できればと思います。
前提など
以下図のように、VPC と接続先の Amazon EC2 インスタンスを作成し、AWS マネジメントコンソールからセッションマネージャ経由でアクセスしようとしたところアクセスできない、となった状況からスタートとします。
私の環境で、マネジメントコンソールのVPC作成から、「VPCなど」を選んで、設定を変更せずに作成したところ、このVPCの構成となりました。そこに、Amazon Linux の EC2 インスタンスを該当のプライベートサブネットに置く設定以外はデフォルトにしてデプロイしています。
つながらない理由と対応方法を考える
- ネットワーク的につながらない
現時点の構成では、EC2 インスタンスはプライベートサブネットで孤立しており、外部との通信ができません。
対応方法としては2つ考えられます。
1つ目は NAT ゲートウェイを設置する方法。もう一つは、エンドポイントを置く方法。
今回は、NAT ゲートウェイを設置する方法で進めたいと思います。
- IAMロールの設定が適切に行われていない。
マネジメントコンソールでデフォルトのままインスタンスを立ち上げるとIAMロールを付与されないインスタンスが起動します。
セッションマネージャ経由でアクセスする為には、インスタンスに「AmazonSSMManagedInstanceCore」が許可されているIAMロールが付与されている必要があります。付与までの手順を確認しましょう。
対応する
- NAT ゲートウェイを設置する
パブリックサブネットに NAT ゲートウェイを設置します。設置しただけでは、プライベートサブネットにあるインスタンスは依然として外部への通信先を知らないので、プライベートサブネット用のルートテーブルに 0.0.0.0/0を NAT ゲートウェイに向かわせる設定も行っていきましょう。
※この手順はVPCを作成する際に NAT ゲートウェイを追加して作成していれば不要です。もし、VPCの作成前であればそちらのほうが簡単に設定が可能です。- マネジメントコンソールで「VPC」を検索して開きます。
- 画面左の「NAT ゲートウェイ」をクリック後に画面右に表示される「NAT ゲートウェイを作成」をクリックします。
- 表示された画面で、NAT ゲートウェイに付与する名前、設置先のサブネット、EIP の割り当てを行い「NAT ゲートウェイを作成」をクリックします。
- NAT ゲートウェイは作成されますが、この時点では EC2 インスタンスからはインターネットへの経路が不明のままの為、ap-northeast-1aのプライベートサブネットのルートテーブルに情報を追記します。「VPC」→左ペインから「ルートテーブル」を選択し、ap-northeast-1aのプライベートサブネットに関連づけられているルートテーブルを選択します。
- 表示された画面の「ルート」タブをクリックすると登録されているルートの情報が確認できます。ここで、まだ NAT ゲートウェイが登録されていないことが確認できるかと思います。そこで「ルートを編集」をクリックします。
- 「ルートを追加」をクリックし、追加された送信先に「0.0.0.0/0」、ターゲットに「NAT ゲートウェイ」、その詳細に「先ほど作成した NAT ゲートウェイ」を選択し、「変更を保存」をクリックします。保存後登録されたことを確認してください。
- マネジメントコンソールで「VPC」を検索して開きます。
- IAMロールの作成と付与
マネジメントコンソールでデフォルトのままインスタンスを立ち上げるとIAMロールを付与されないインスタンスが起動します。
セッションマネージャ経由でアクセスする為には、インスタンスに「AmazonSSMManagedInstanceCore」が許可されているIAMロールが付与されている必要があります。付与まで行って行きましょう。- マネジメントコンソールで「IAM」を検索して開きます。
- 画面左の「ロール」をクリック後に画面右に表示される「ロールを作成」をクリックします。
- 信頼されたエンティティタイプで「AWSのサービス」を選び、ユースケースで「EC2」を選択して、「次へ」をクリックします。
- 許可を追加で、今回必要となる「AmazonSSMManagedInstanceCore」を検索、「次へ」をクリックします。
- 適当なロール名を設定し「ロールを作成」をクリックし、作成完了です。
- 次に、ここで作成したロールをインスタンスへ付与する為に、マネジメントコンソールでEC2を開き、付与先のインスタンスを選択して、「アクション」→ 「セキュリティ」→ 「IAMロールを変更」を選択します。
- IAMロールの欄に手順5で登録したIAMロールの名前を入れ検索し、設定し「IAMロールの更新」をクリックします。これで、必要なロールの付与は完了です。
- マネジメントコンソールで「IAM」を検索して開きます。
- 接続を試してみる
2点の対応が完了すると、通信できるはずですので通信確認を行います。EC2のインスタンス一覧から、該当の EC2 インスタンスを選択して「接続」をクリックすると、以下が表示されます。ここでさらに「接続」をクリックすると、SSHで接続した画面が表示されます。 - それでも接続できないときは
接続ができない状況が続いた後に接続が可能になった場合、すぐに接続が開始できないことがあります。すべての問題を解決したのに繋がらないと思ったときは、EC2 インスタンスを再起動してみてください。
また、今回は取り上げていませんが個別にセキュリティグループやネットワークACL等を設定している場合それらが通信をブロックする可能性もありますので設定されている内容が通信をブロックしていないか確認してみてください。
まとめ
プライベートサブネットに配置した EC2 インスタンスにセッションマネージャ経由でアクセスできない際の確認ポイントと、その対応手順を確認してきました。自分が作成した EC2 インスタンスに接続ができないとなると焦ることもあるかもしれませんが、落ち着いて原因を探して対応していきましょう!