今までの記事でVPC Latticeを経由した
EC2→Lambda
EC2(VPC A) → EC2 (VPC B)
への接続を見てきました。2番目のシナリオで、アクセス先の EC2 (VPC B)にPublicIPがなくてもアクセスが行えることを確認しました。
VPC Latticeの機能として通信にIAM認証をかけることができます。今日はこの機能を見ていきます。
さっそくやってみる
環境準備
EC2(VPC A) → EC2 (VPC B)のアクセスが行えるところまで環境を構築しておきます。
IAMユーザーの作成
Latticeで通信の認証はIAMロール、IAMユーザー両方で行えます。例えばClientがLambda等であればロールを直接アタッチできますが、EC2の様に独立したプログラムであればIAMユーザーでSig4リクエストを作成します。この例ではIAMユーザーを使います。IAMユーザーいつも通り作成します。ポリシーには VPCLatticeServicesInvokeAccess を付与します。

IAMユーザー名はlatticeclientとしておきます。
作成出来た後アクセスキーを作成してメモっておきます。

LatticeサービスでIAM認証の設定変更
今の環境は認証なしでGETであればなんでも通信が通るようになっています。これを設定変更していきます。
VPCマネージメントコンソール左ペインから`Latticeサービス`をクリックします。

アクセス設定を編集 をクリックします。

AWS IAM を選択します。

以下のポリシーを貼り付けます。
以下の値は皆さんの環境ごとに書き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAliceAccess",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::917561075114:user/latticeuser"
},
"Action": "vpc-lattice-svcs:Invoke",
"Resource": "*",
"Condition": {}
}
]
}
917561075114 : AWSアカウント番号
arn:aws:vpc-lattice:ap-northeast-1:917561075114:service/svc-08c822987a0b6ab7d/: LatticeサービスのARN
変更内容を保存します。
IAMユーザー latticeuser のみがVPC Lattice サービスを実行可能、という意味です。まだ先に設定したように、ここで指定されるIAMユーザーは VPCLatticeServicesInvokeAccess ポリシーを保有している必要があります。
アクセステスト
まずはEC2(VPC A)から普通にcurlでアクセスを行うと以下のエラーがでます。期待通りの動作をしています。
curl nginx-08c822987a0b6ab7d.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws
AccessDeniedException: User: anonymous is not authorized to perform: vpc-lattice-svcs:Invoke on resource: arn:aws:vpc-lattice:ap-northeast-1:917561075114:service/svc-08c822987a0b6ab7d/ because no service-based policy allows the vpc-lattice-svcs:Invoke action
では aws configre
で環境に先ほどのIAMユーザーを組み込みます。その後以下のスクリプトをコピペで作成します。
import boto3
import requests
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
# セッションと認証情報
session = boto3.Session()
credentials = session.get_credentials().get_frozen_credentials()
region = session.region_name
# 対象URL
url = "http://nginx-08c822987a0b6ab7d.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws"
# AWSRequest の作成
request = AWSRequest(method="GET", url=url)
request.headers["x-amz-content-sha256"] = "UNSIGNED-PAYLOAD"
# 署名付与(署名時にこのヘッダーがあることを認識させる)
SigV4Auth(credentials, "vpc-lattice-svcs", region).add_auth(request)
# リクエスト実行
response = requests.get(url, headers=dict(request.headers))
print(response.status_code)
print(response.text)
http://nginx-08c822987a0b6ab7d.7d67968.vpc-lattice-svcs.ap-northeast-1.on.aws
は皆さんの環境ごとに置換します。
以下のコマンドでスクリプトの実行環境を整えます。
sudo dnf install -y python3 python3-pip
pip3 install boto3
python3 test.pip
を実行すればEC2/VPC B へアクセス可能になり、GETの結果がレスポンスとして出力されます。