Amazon API Gateway HTTP API へのクロスアカウントアクセスを行うために、AWS Identity and Access Management (IAM) 認証を有効にしたいです。
簡単な説明
API Gateway REST API では、リソースポリシーを使用してクロスアカウント用の IAM 認証を行えます。ただし、この方法は API Gateway HTTP API では使用できません。
sts:AssumeRole API アクションを使用することで、HTTP API アカウントのロールを引き受けることができます。引き受けたロールは、別のアカウントで HTTP API を呼び出すために使用できる一時的なセキュリティ認証情報を提供します。
解決策
IAM 一時認証情報を作成する
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
1.HTTP API をホストするアカウント A 用の IAM ポリシーを作成します。このポリシーは、HTTP API execute-api ARN の呼び出しを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"execute-api:Invoke",
],
"Resource": [
"arn:aws:execute-api:us-east-1:<AccountA-id>:<Api-id>/$default/*/*"
]
}
]
}
2.アカウント A に IAM ロールを作成し、"信頼されたエンティティタイプ" に "AWS アカウント" を追加した後、アカウント B の ID を入力します。
3.ステップ 1 で作成した IAM ポリシーを、ステップ 2 で作成した IAM ロールにアタッチします。
4.アカウント B 用の IAM ポリシーを作成し、sts:AssumeRole アクションを許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<AccountA-id>:role/<AssumedRoleName>"
}
]
}
5.IAM ポリシーをアカウント B のユーザーにアタッチします。
6.AWS CLI コマンド assume-role を次のように実行します。
$ aws sts assume-role --role-arn arn:aws:iam::<account-id>:role/<AssumedRoleName> --role-session-name role_session
出力例:
{
"Credentials": {
"AccessKeyId": "A1B2C3D4E5E6G7H8J9K0",
"SecretAccessKey": "abcdefghijk123456789",
"SessionToken":
"11111111111122222222223333333333344444444455555566666667777777777778888888999999999aaaaaaaaaabbbbbbbbbcccccccc==",
"Expiration": "2022-07-11T15:55:25+00:00"
},
"AssumedRoleUser": {
"AssumedRoleId": "AAAAAAABBBBBBBBBBB:role_session",
"Arn": "arn:aws:sts::<account-id>:assumed-role/<AssumedRoleName>/role_session"
}
}
認証情報オブジェクトで AccessKeyId、SecretAccessKey、SessionToken を確認します。これらの、引き受けたロールから取得した一時的な認証情報を使用して HTTP API を呼び出すことができます。
IAM 認証をテストする
Postman アプリを使用して、IAM 認証を有効にしたメソッドで API リソースにリクエストを送信します。
注: 別のツールまたは環境を使用して API Gateway に送信されたリクエストを手動で認証するには、Signature Version 4 (SigV4) の署名プロセスを使用します。詳細については、「AWS API リクエストへの署名」を参照してください。
1.Postman で [認証] タブを選択し、次の操作を行います。
[タイプ] で [AWS 署名] を選択します。
AccessKey、SecretKey、SessionToken に、assume-role API コールからの値を入力します。
2.[リクエスト URL の入力] に、次のような API の呼び出し URL を入力します。
https://<Api-id>.execute-api.<region>.amazonaws.com/<stagename>/<resourcepath>
認証されたリクエストは 200 OK レスポンスコードを返します。許可されていないリクエストは、「認証トークンが見つかりません」というメッセージと 403 Forbidden 応答コードを返します。
関連情報
API Gateway REST API の IAM 認証を有効にする方法を教えてください