Serverless Operations, inc

>_cd /blog/id_2vdply17n

title

VPC Lattice その3:通信のIAM認証

summary

Amazon VPC Lattice は、アプリケーションのサービスとリソースの接続、保護、モニタリングに使用するフルマネージド型のアプリケーションネットワークサービスです。この連載記事ではVPC Latticeの機能を1個ずつ見ていきます

VPC Lattice その1:AWS Lambda URL と Amazon VPC Lattice の接続

VPC Lattice その2:2つの異なるVPCの接続

今までの記事で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の結果がレスポンスとして出力されます。

Written by
編集部

亀田 治伸

Kameda Harunobu

  • Facebook->
  • X->
  • GitHub->

Share

Facebook->X->
Back
to list
<-