はじめに
こんにちは。Tsukasaです!
今日はAWS公式ハンズオンのセキュアなプライベートネットワーク空間を作成してみた事について記事にしていきたいと思います。
NATゲートウェイやVPCエンドポイントといった、認定試験でもよく出る内容となっているので、ここで実際にハンズオンで手を動かすことによってより理解が深まると思います。
それでは早速見て行きたいと思います!
今回やること
今回やることは、一言で言うとVPC上にあるプライベートサブネットからVPC外のAWSサービスに安全に接続すると言うった内容になります。
AWSのハンズオンでは以下のものを用いました。こちらも興味のある方は是非ご覧ください。
今回やりたいことは下記のようになります。
まず、VPCを作成して、そこに、パブリックサブネットとプライベートサブネットを2つずつ置きます。
今回は敢えてEC2インスタンスをパブリックサブネットに置き、普通にWebサイトにアクセスができるかを確認し、プライベートサブネットにもEC2を置き、NATゲートウェイやVPNエンドポイントを用いて、VPC外部にあるSSMやS3に接続できることをゴールとします。
VPCの作成
まずはVPCの作成から始めます。
VPCはEC2やDBなどの基盤サービスを置くために必要な場所になります。
まずはコンソール画面からVPCを検索して、下記の画面を開きます。オレンジの「VPCの作成」ボタンをクリックします。
本来であれば、「VPCなど」を選択し、ここでサブネットまで一緒に作りますが、今回は敢えて「VPCのみ」を選択します。
設定は下記のようにしてもらえれば大丈夫です。
名前は各自で決めていただき、IPv4 CIDRブロックは10.0.0.0/16とします。
後はデフォルトの設定とし、作成ボタンをクリックします。
サブネットの作成
続いてサブネットの作成を行います。
VPCの画面の左側から「サブネット」を選択し、サブネットの作成を行います。
まずはVPCの紐付けを行います。
先程作成したVPCを紐付けます。
サブネットは全部で4つ作ります。
パブリックサブネットが2つ、プライベートサブネット2つになります。
下記のように設定し、残りはデフォルトの設定のままで大丈夫です。
パブリックサブネット1
サブネットが完成したら、次はインターネットゲートウェイを作成します。
VPCは作りましたが、インターネットゲートウェイがないと、インターネットと通信ができません。
そのため必須な機能となります。
こちらもVPCの画面の左側から「インターネットゲートウェイ」を選択し、右上のオレンジのボタンから作成を開始ます。
こちらでは名前だけ付けます。
基本的にどの機能も同じですが、わかりやすい名前にすると良いと思います。
インターネットゲートウェイが完成したら、今度はVPCと紐付けする必要があります。
これをやらないとせっかく作っても機能しないのでこちらも必須の作業になります。
下記画像のように「アクション」から「VPCアタッチ」を選択します。
先程作成したVPCを選択して、右下のオレンジのボタンを押して紐付けします。
Route Tableの作成
次はRoute Tableの作成を行います。
VPC内でトラフィックのルーティング(経路)を決める設定です。
こちらもVPCの画面の左側から「ルートテーブル」に行き、右上のオレンジのボタンを押して、ルートテーブルの作成を行います。
まずはパブリックルートテーブルの作成を行います。
基本的には下記の通りにやってもらえれば大丈夫です。
VPCの紐付けもここで行います。
後はデフォルトの設定で、オレンジの右下のボタンを押して作成します。
プライベートルートテーブルも同様の流れで作成します。
作成後下記のようにパブリックルートテーブルを選択し、右下の「ルートを編集」ボタンを押します。
ここでは先程作成したインターネットゲートウェイを選択します。
次はサブネットの関連付けを行います。
右下の「サブネットの関連付けを編集」ボタンをクリックします。
ここではパブリックサブネットを関連付けます。
パブリックサブネットは2つ作りましたよね。そのため2つ選択して関連付けます。
次はプライベートルートテーブルも同じようにやります。
プライベートルートテーブルはパブリックルートテーブルとは違って、ルートを編集する必要がありません。何故なら、プライベートパブリックテーブルはメインのルートテーブルとなっているため、その設定が必要がないからです。そのため、ルートを編集する作業を省いて、サブネットの関連付けを行うところから始めます。
こちらもパブリックルートテーブルと同じように、サブネットを選択します。
こちらではパブリックサブネットを選択します。
動作確認とEC2/IAMロールの作成
次は下記画像のようにパブリックサブネットにEC2とIAMロールを作成した上で、Webサイトが動作するかの確認を行います。
下記のようにしてもらえれば大丈夫です。
今回はEC2にIAMロールを紐づけたいので、ユースケースはEC2を選択します。
許可ポリシーにSSMと検索して、「AmazonSSMFullAccess」を選択します。
続きまして、EC2を作成します。右側のオレンジボタンを押して作成を行います。
VPCは作成済のものを選択します。サブネットはパブリックサブネットを選択します。
高度な詳細で先程作成したIAMロールを選択します。後はデフォルトで大丈夫です。
下記のようにコードを入力します。
こちらはハンズオン資料に記載があるので、ご確認ください。
完成したら、下記の「パブリックIPv4アドレス」をコピーして、新しいタブを開き、アプリが動いているか確認します。
NATゲートウェイの作成
ここからが今回のハンズオンのメインテーマになるかと思います。
今までは、パブリックサブネットにEC2を置き、そこからアプリを起動しましたが、セキュリティの都合上、プライベートサブネットにEC2インスタンスを置かないといけないという場合もあるかと思います。その場合、VPC外のAWSサービスや、アプリにはアクセスができません。NATゲートウェイはそうった際に使用するものになります。
下記のように外部のアプリにもVPC外のサービスにもアクセスできるのが、NATゲートウェイの特徴です。
まずはプライベートサブネットに置くEC2インスタンスを作成します。
EC2の作成方法はここでは割愛いたします。
EC2インタンスの作成が完了したら、次はNATゲートウェイの作成を行います。
VPCの画面の左側からNATゲートウェイを選択します。その後右上のオレンジのボタンを押して作成を開始します。
NATゲートウェイを下記のように作成します。
ここで大事なことはNATゲートウェイはパブリックサブネットに作成するということです。
そのためサブネットは必ずパブリックサブネットに置く必要があります。
NATゲートウェイを作成したら、今度はルートテーブルとの紐付けを行う必要があります。
現状、NATゲートウェイはパブリックサブネットにあるため、それとプライベートサブネットを紐付けます。下記画像の右下にある「ルートを編集」ボタンを押します。
0.0.0.0/0を選択し、NATゲートウェイを選択します。その上で先程作成したNATゲートウェイを選択し、変更を保存します。
紐付けができたら、このVPCの外にあるSSMに接続できるかを確認します。
イメージとしては下記のようになります。
EC2インスタンスの画面に行き、上にある「接続」ボタンを押します。
セッションマネージャーを選択し、右下のオレンジの接続ボタンを押します。
VPCエンドポイントの作成(Interface型)
NATゲートウェイを用いて、EC2インスタンスが、プライベートサブネットにあってもVPC外のサービスやアプリに接続できることがわかりました。
NATゲートウェイはインターネットゲートウェイを通して使うことができます。
しかし、金融系やセキュリティの厳しいシステムだとすると、そもそもインターネットゲートウェイを完全に使うことができないといった場合もあります。
そのような場合はどうすればいいのでしょうか?
正解はVPCエンドポイントを用いることです!
今回はVPCエンドポイントを使って、ネット接続なしでVPC外にあるサービスに接続できるようにしてみます。
ネット接続をせずにVPC外のサービスに接続する方法は主に2種類あります。
Gateway型とInterface型に分かれます。
何がGateway型で何がInterface型なのかは接続先のVPC外にあるサービスによります。
それではVPCの作成に入ります。
まずは下準備です。
VPCの画面からVPCの設定編集を行います。
それが完了したら、次はセキュリティグループを作成します。
基本は下記のようにしてもらえれば大丈夫です。
インバウンドルールですが、必ずHTTPSにしてください。
VPCエンドポイントのエラーの代表格はここのインバウンドルールの設定ミスになります。
HTTPSになっていることを確認してください。
ここからエンドポイントの作成に入ります。
こちらは基本的に下記のようにしてもらえれば大丈夫です。
インターフェイス型では、SSM,SSM-message,EC2-messageの3つのエンドポイントを作成する必要があります。これはそういう仕様になっているためです。
サブネットを選択します。今回はcを選択します。cを選ぶ理由は、プライベートサブネットに置いてあるEC2インスタンスが置いてあるのが、AZのcになるためです。
SSMが完成したら、SSM-MessageとEC2-messageも同じように作成します。
上記の作業が全て終わったら先程と同じようにEC2インスタンスからセッションマネージャーに接続します。こちらも問題なく接続できましたね!
VPCエンドポイントの作成(Gateway型)
次はGateway型を試そうと思います。
Gateway型はS3などのサービスに接続したい時に使いたい型でしたよね。
まずは下準備としてS3バケットの作成から始めます。
ここではS3バケットの作成方法については省略いたします。
S3バケットを作成したら、IAMロールにS3の権限を付与する必要があります。
こちらでAmazonS3ReadOnlyAccessを追加します。
ここからエンドポイントの作成を行います。
Interface型の時と同じように下記の画面から作成を行います。
今回はS3なので、S3と検索をし、下記画像で選択したものを選択します。
ここで注意なのですが、選択されたものとその下にあるもの同じ名前ですよね?
この場合どうしたら良いのでしょうか?
この場合は横にあるタイプを見て確認する必要があります。
今回はGateway型になるので、Gateway型のものを選びます。
ルートテーブルはパブリック、プライベートルートテーブルのどちらも選択します。
これでVPCエンドポイントのGataway型が完成しました。
最後に稼働できるか確認します。
手順は同じくEC2インスタンスのセッションマネージャーから接続します。
下記のコードを打ち込んで実行してください。
aws s3 ls --region ap-northeast-1
おー!!ちゃんとS3に接続できたことが確認できました!!
VPCエンドポイントを用いてセキュアにVPC外にあるS3に接続できました!!
実はエラーが出てました。。。
はい、順調かと思っていましたが、実はエラーが出ていたのです。
ここではエラーについて書いて行きます。
下記はVPCエンドポイントでセッションマネージャーに接続する際に頻繁に発生するエラーです。
こういう時はエラー内容をそのままコピペしてネットで調べて良いと思います。
調べた結果、セキュリティグループの設定がおかしいことが大部分なようです。
上記でも記載しましたが、HTTPSになっていなくてエラーになることが多いそうです。
しかし私の場合はそこはHTTPSになっていたので大丈夫でした。
問題はエンドポイント側にありました。
画面下にあるセキュリティグループのグループ名が「default」になってますよね。
せっかくSSMというセキュリティグループを作成したのにそれをエンドポイントに紐付けないとちゃんと起動はしません。
あまりこういったエラーはないかもしれませんが、今回自分でやってみての発見となりましたので、皆さんもご注意ください。
終わりに
いかがだったでしょうか?
今回も公式ハンズオンで無料でNATゲートウェイやVPCエンドポイントについて学ぶことができました。セキュリティはシステムの中でも最も大切な部分ですし、実務でも試験でもよく出てくる内容だと思います。実際に手を動かすことでより理解も深まると思いますので、是非皆さんも挑戦してみてください!!