#1.GatewayとInterface#
下記の通り、VPCエンドポイントの方式には、GatewayとInterfaceがある。Gatewayはs3とdynamodのみ。
##Gateway##
VPCのルートテーブルを書き換えてVPCエンドポイントのゲートウェイ経由でAWSのAPIエンドポイントへアクセスする。
ゲートウェイVPCエンドポイントではAWSのAPIへはパブリックIPへ向いており、*アクセス制御はゲートウェイのアクセスポリシーで行います。
[Feb 2, 2021]S3がInterface型にも対応しました。
##Interface##
サービスのエンドポイントとENIをPrivateLinkと呼ばれるものでリンクされます。
DNSを使ってENIのプライベートIPに<サービス名>.<リージョン>.amazonaws.comのようなAレコードが設定されます。
インターフェイスVPCエンドポイントではENIに対してアクセスするため、アクセス制御はセキュリティグループで行います。
##比較##
Gateway型 | PrivateLink(Interface型) | |
---|---|---|
アクセス制御 | エンドポイントポリシー。IAM Policyと同じ構文でアクセス先のリソースを制限可能。 | セキュリティグループ。セキュリティグループでアクセス元IP、ポートを制御可能。対象のサービスの特定のリソースへのアクセス制御は不可。 |
利用料金 | 無料 | 有料 |
冗長性 | ユーザー側で意識する必要なし | マルチAZで配置するように設定する |
詳しくは下記のページが参考になりました。
#2.Gateway#
ここでは、[com.amazonaws.ap-northeast-1.s3]を選択します。
エンドポイントにアクセスできるVPCとサブネットを指定します。
ここでは、わざとカスタムで特定のバケットに対し、GetとPutのみ許可するようなポリシーを設定しています。詳細は、Amazon S3 のエンドポイントポリシーの使用
を参考にしてください。
{
"Statement": [
{
"Sid": "Access-to-specific-bucket-only",
"Principal": "*",
"Action": [
"s3:GetObject",
"s3:PutObject"
],
"Effect": "Allow",
"Resource": ["arn:aws:s3:::naata-vpcep",
"arn:aws:s3:::naata-vpcep/*"]
}
]
}
なお、ルートテーブルに以下のとおり、追加されていることがわかります。
検証してみます。
特定のバケットへのGetとPutのみ許可しているので、これはもちろんアクセスできません。
aws s3 ls --region ap-northeast-1
An error occurred (AccessDenied) when calling the ListBuckets operation: Access Denied
下記のとおり、特定のバケットへのputが成功していることがわかります。
aws s3 cp test.txt s3://naata-vpcep
upload: ./test.txt to s3://naata-vpcep/test.txt
#3.Interface#
ここでは、プライベートサブネットに配置してあるEC2インスタンスから、sshを利用せずセッションマネージャーを利用して接続したいと思います。
エンドポイントは同じように4つ作成すればよい。
com.amazonaws.ap-northeast-1.ssm
com.amazonaws.ap-northeast-1.ssmmessage
com.amazonaws.ap-northeast-1.ec2
com.amazonaws.ap-northeast-1.ec2messages
Systems Manager 用 VPC エンドポイントを作成する
「com.amazonaws.ap-northeast-1.ssm」を選択します。
VPCエンドポイントを設定するVPCを選択して、ENIを配置するサブネットを選択します。
[プライベート DNS 名を有効にする]で「このエンドポイントで有効にする」にチェックを入れます。
【注意】
「このエンドポイントで有効にする」でチェックを入れている場合、VPCの設定でDNS 解決とDNS ホスト名を有効にしておく必要があります。
ENIに設定するセキュリティグループを選択します。※対象のEC2からHTTPS(443)を受け取れるセキュリティグループとするのが基本です。
作成されたら、DNS Namesが3つ作成されと思います。
<エンドポイントID>-XXXXXXXX.ssm.<リージョン>.vpce.amazonaws.com
<エンドポイントID>-XXXXXXXX-.ssm.ap-northeast-1.vpce.amazonaws.com
ssm.ap-northeast-1.amazonaws.com
セッションマネージャを確認し、接続できるか確認してみましょう。
コマンドを打てるコンソールまでは開いたが、何も反応しない。。。
そこで、こちらのページにある内容で解決!
セッションマネージャーのログの出力先として設定されている s3やCloudWatch Logsのロググループの設定を確認し、接続することができた。