API Gateway リソースポリシーを作成して API にアタッチする
API 実行サービスを呼び出して API にアクセスすることをユーザーに許可するには、API Gateway リソースポリシーを作成して API にアタッチする必要があります。ポリシーを API にアタッチすると、ポリシー内のアクセス許可が API のメソッドに適用されます。リソースポリシーを更新する場合は、API をデプロイする必要があります。
前提条件
API Gateway リソースポリシーを更新するには、apigateway:UpdateRestApiPolicy
アクセス許可と apigateway:PATCH
アクセス許可が必要です。
エッジ最適化 API またはリージョン API の場合、リソースポリシーを作成時またはデプロイ後に API にアタッチできます。プライベート API の場合、リソースポリシーなしで API をデプロイすることはできません。詳細については、「API Gateway のプライベート REST API」を参照してください。
リソースポリシーを API Gateway API にアタッチする
次の手順は、リソースポリシーを API Gateway API にアタッチする方法を示しています。
- AWS Management Console
-
リソースポリシーを API Gateway API にアタッチするには
https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。
REST API を選択します。
-
左のナビゲーションペインで、[リソースポリシー] を選択します。
-
[Create policy] を選択します。
-
(オプション) [テンプレートを選択] を選択してサンプルポリシーを生成します。
ポリシーの例では、プレースホルダーは、二重波括弧 ("{{placeholder
}}"
) で囲まれています。各プレースホルダー (波括弧を含む) を必要な情報に置き換えます。
どのテンプレート例も使用しない場合は、リソースポリシーを入力します。
-
[Save changes] (変更の保存) をクリックします。
API が API Gateway コンソールで以前にデプロイ済みの場合、リソースポリシーを有効にするには再デプロイする必要があります。
- AWS CLI
-
AWS CLI を使用し、新しい API を作成してこれにリソースポリシーをアタッチするには、次のように create-rest-api コマンドを呼び出します。
aws apigateway create-rest-api \
--name "api-name
" \
--policy "{\"jsonEscapedPolicyDocument
\"}"
AWS CLI を使用して、リソースポリシーを既存の API にアタッチするには、次のように update-rest-api コマンドを呼び出します。
aws apigateway update-rest-api \
--rest-api-id api-id
\
--patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument
\"}"'
- AWS CloudFormation
-
AWS CloudFormation を使用して、リソースポリシーを持つ API を作成できます。次の例では、サンプルリソースポリシー 例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する を使用して REST API を作成します。
AWSTemplateFormatVersion: 2010-09-09
Resources:
Api:
Type: 'AWS::ApiGateway::RestApi'
Properties:
Name: testapi
Policy:
Statement:
- Action: 'execute-api:Invoke'
Effect: Allow
Principal: '*'
Resource: 'execute-api/*'
- Action: 'execute-api:Invoke'
Effect: Deny
Principal: '*'
Resource: 'execute-api/*'
Condition:
IpAddress:
'aws:SourceIp': ["192.0.2.0/24", "198.51.100.0/24" ]
Version: 2012-10-17
Resource:
Type: 'AWS::ApiGateway::Resource'
Properties:
RestApiId: !Ref Api
ParentId: !GetAtt Api.RootResourceId
PathPart: 'helloworld'
MethodGet:
Type: 'AWS::ApiGateway::Method'
Properties:
RestApiId: !Ref Api
ResourceId: !Ref Resource
HttpMethod: GET
ApiKeyRequired: false
AuthorizationType: NONE
Integration:
Type: MOCK
ApiDeployment:
Type: 'AWS::ApiGateway::Deployment'
DependsOn:
- MethodGet
Properties:
RestApiId: !Ref Api
StageName: test
リソースポリシーのトラブルシューティング
次のトラブルシューティングガイダンスは、リソースポリシーの問題を解決するのに役立ちます。
API が {"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:********/****/****/"} を返します
リソースポリシーで、プリンシパルを次のように AWS プリンシパルに設定する場合:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
""Principal": {
"AWS": [
"arn:aws:iam::account-id:role/developer",
"arn:aws:iam::account-id:role/Admin"
]
},
"Action": "execute-api:Invoke",
"Resource": [
"execute-api:/*"
]
},
...
}
API のすべてのメソッドに AWS_IAM
認証を使用する必要があります。使用しない場合、API は前のエラーメッセージを返します。メソッドの AWS_IAM
認証を有効にする方法の詳細については、「API Gateway の REST API のメソッド」を参照してください。
リソースポリシーが更新されません
API 作成後にリソースポリシーを更新する場合は、更新後のポリシーをアタッチしてから API をデプロイし、変更を伝達する必要があります。ポリシーのみ、更新または保存した場合、API のランタイム動作が変更されることはありません。API のデプロイの詳細については、「API Gateway で REST API をデプロイする」を参照してください。
リソースポリシーから次のエラーが返されます: 無効なポリシードキュメント。ポリシー構文を確認し、プリンシパルが有効であることを確認してください。
このエラーのトラブルシューティングを行うには、まずポリシー構文を確認することをお勧めします。詳細については、「Amazon API Gateway のアクセスポリシー言語の概要」を参照してください。また、指定したすべてのプリンシパルが有効であり、削除されていないことを確認することをお勧めします。
さらに、API がオプトインリージョンにある場合は、リソースポリシー内のすべてのアカウントでリージョンが有効になっていることを確認します。