

# API Gateway リソースポリシーを作成して API にアタッチする
<a name="apigateway-resource-policies-create-attach"></a>

API 実行サービスを呼び出して API にアクセスすることをユーザーに許可するには、API Gateway リソースポリシーを作成して API にアタッチする必要があります。ポリシーを API にアタッチすると、ポリシー内のアクセス許可が API のメソッドに適用されます。リソースポリシーを更新する場合は、API をデプロイする必要があります。

**Topics**
+ [前提条件](#apigateway-resource-policies-prerequisites)
+ [リソースポリシーを API Gateway API にアタッチする](#apigateway-resource-policies-create-attach-procedure)
+ [リソースポリシーのトラブルシューティング](#apigateway-resource-policies-troubleshoot)

## 前提条件
<a name="apigateway-resource-policies-prerequisites"></a>

 API Gateway リソースポリシーを更新するには、`apigateway:UpdateRestApiPolicy` アクセス許可と `apigateway:PATCH` アクセス許可が必要です。

エッジ最適化 API またはリージョン API の場合、リソースポリシーを作成時またはデプロイ後に API にアタッチできます。プライベート API の場合、リソースポリシーなしで API をデプロイすることはできません。詳細については、「[API Gateway のプライベート REST API](apigateway-private-apis.md)」を参照してください。

## リソースポリシーを API Gateway API にアタッチする
<a name="apigateway-resource-policies-create-attach-procedure"></a>

次の手順は、リソースポリシーを API Gateway API にアタッチする方法を示しています。

------
#### [ AWS マネジメントコンソール ]

**リソースポリシーを API Gateway API にアタッチするには**

1. [https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway) で API Gateway コンソールにサインインします。

1. REST API を選択します。

1. 左のナビゲーションペインで、**[リソースポリシー]** を選択します。

1. [**Create policy**] (ポリシーの作成) を選択します。

1. (オプション) **[テンプレートを選択]** を選択してサンプルポリシーを生成します。

   ポリシーの例では、プレースホルダーは、二重波括弧 (`"{{placeholder}}"`) で囲まれています。各プレースホルダー (波括弧を含む) を必要な情報に置き換えます。

1. どのテンプレート例も使用しない場合は、リソースポリシーを入力します。

1. **[Save changes]** (変更の保存) をクリックします。

API が API Gateway コンソールで以前にデプロイ済みの場合、リソースポリシーを有効にするには再デプロイする必要があります。

------
#### [ AWS CLI ]

AWS CLI を使用して新しい API を作成し、それにリソースポリシーをアタッチするには、次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドを使用します。

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy "{\"jsonEscapedPolicyDocument\"}"
```

AWS CLI を使用して既存の API にリソースポリシーをアタッチするには、次の [update-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/update-rest-api.html) コマンドを使用します。

```
aws apigateway update-rest-api \
    --rest-api-id api-id \
    --patch-operations op=replace,path=/policy,value='"{\"jsonEscapedPolicyDocument\"}"'
```

リソースポリシーを別の `policy.json` ファイルとしてアタッチし、[create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドに含めることもできます。次の [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html) コマンドは、リソースポリシーをアタッチした新しい API を作成します。

```
aws apigateway create-rest-api \
    --name "api-name" \
    --policy file://policy.json
```

`policy.json` は、API Gateway リソースポリシー ([例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example) など) です。

------
#### [ AWS CloudFormation ]

CloudFormation を使用して、リソースポリシーを持つ API を作成できます。次の例では、サンプルリソースポリシー [例: 送信元の IP アドレスまたは IP アドレスの範囲に基づき、API トラフィックを拒否する](apigateway-resource-policies-examples.md#apigateway-resource-policies-source-ip-address-example) を使用して 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
        RequestTemplates:
          application/json: '{"statusCode": 200}'
        IntegrationResponses:
          - StatusCode: 200
            ResponseTemplates:
              application/json: '{}'
      MethodResponses:
        - StatusCode: 200
          ResponseModels:
            application/json: 'Empty'
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - MethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: test
```

------

## リソースポリシーのトラブルシューティング
<a name="apigateway-resource-policies-troubleshoot"></a>

次のトラブルシューティングガイダンスは、リソースポリシーの問題を解決するのに役立ちます。

### API が \$1"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:us-east-1:\$1\$1\$1\$1\$1\$1\$1\$1/\$1\$1\$1\$1/\$1\$1\$1\$1/"\$1 を返します
<a name="apigateway-resource-policies-troubleshoot-auth"></a>

リソースポリシーで、プリンシパルを次のように AWS プリンシパルに設定する場合:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::111111111111:role/developer",
                    "arn:aws:iam::111111111111:role/Admin"
                ]
            },
            "Action": "execute-api:Invoke",
            "Resource": [
                "execute-api:/stage/GET/pets"
            ]
        }
    ]
}
```

------

API のすべてのメソッドに `AWS_IAM` 認可を使用する必要があります。使用しない場合、API は前のエラーメッセージを返します。メソッドの `AWS_IAM` 認可を有効にする方法の詳細については、「[API Gateway の REST API のメソッド](how-to-method-settings.md)」を参照してください。

### リソースポリシーが更新されません
<a name="apigateway-resource-policies-troubleshoot-deploy"></a>

 API 作成後にリソースポリシーを更新する場合は、更新後のポリシーをアタッチしてから API をデプロイし、変更を伝達する必要があります。ポリシーのみ、更新または保存した場合、API のランタイム動作が変更されることはありません。API のデプロイの詳細については、「[API Gateway で REST API をデプロイする](how-to-deploy-api.md)」を参照してください。

### リソースポリシーから次のエラーが返されます: 無効なポリシードキュメント。ポリシー構文を確認し、プリンシパルが有効であることを確認してください。
<a name="apigateway-resource-policies-troubleshoot-invalid-principal"></a>

このエラーのトラブルシューティングを行うには、まずポリシー構文を確認することをお勧めします。詳細については、「[Amazon API Gateway のアクセスポリシー言語の概要](apigateway-control-access-policy-language-overview.md)」を参照してください。また、指定したすべてのプリンシパルが有効であり、削除されていないことを確認することをお勧めします。

さらに、API が[オプトインリージョン](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#optinregion)にある場合は、リソースポリシー内のすべてのアカウントでリージョンが有効になっていることを確認します。