チュートリアル: プライベート REST API を構築する - Amazon API Gateway

チュートリアル: プライベート REST API を構築する

このチュートリアルでは、プライベート REST API を作成します。クライアントは Amazon VPC 内からのみ API にアクセスできます。API は、一般的なセキュリティ要件であるパブリックインターネットから分離されています。

このチュートリアルの完了には約 30 分かかります。まず、AWS CloudFormation テンプレートを使用して Amazon VPC、VPC エンドポイント、AWS Lambda 関数を作成し、API のテストに使用する Amazon EC2 インスタンスを起動します。次に、AWS Management Console を使用してプライベート API を作成し、VPC エンドポイントからのアクセスのみを許可するリソースポリシーをアタッチします。最後に、API をテストします。

このチュートリアルで作成するプライベート API の概要。

このチュートリアルを完了するには、AWS アカウントと、コンソールへのアクセス権がある AWS Identity and Access Management ユーザーが必要です。詳細については、「API Gateway の開始方法の前提条件」を参照してください。

このチュートリアルでは、 を使用しますAWS Management Console この API とすべての関連リソースを作成する ‭AWS CloudFormation テンプレートについては、‭template.yaml を参照してください。

ステップ 1: 依存関係を作成する

この AWS CloudFormation テンプレートをダウンロードして解凍します。テンプレートを使用して、プライベート API のすべての依存関係を作成します。これには、Amazon VPC、VPC エンドポイント、API のバックエンドとして機能する Lambda 関数が含まれます。プライベート API は後で作成します。

AWS CloudFormation スタックを作成するには
  1. https://console.aws.amazon.com/cloudformation で AWS CloudFormation コンソール を開きます。

  2. [スタックの作成] を選択し、[With new resources (standard) 新しいリソースを使用 (標準)] を選択します。

  3. [Specify template (テンプレートの指定)] で、[Upload a template file (テンプレートファイルのアップロード)] を選択します。

  4. ダウンロードしたテンプレートを選択します。

  5. [Next (次へ)] を選択します。

  6. [Stack name] (スタックの名前) で、private-api-tutorial と入力し、[Next] (次へ) を選択します。

  7. [Configure stack options] (スタックオプションの設定) で、[Next] (次へ) を選択します。

  8. [Capabilities] (機能) で、AWS CloudFormation がアカウントに IAM リソースを作成できることを承認します。

  9. 送信 を選択します。

AWS CloudFormation は API の依存関係をプロビジョニングします。これには数分かかる場合があります。AWS CloudFormation スタックのステータスが CREATE_COMPLETE の場合は、[Outputs] (出力) を選択します。VPC エンドポイント ID を書き留めます。このチュートリアルの後の手順で必要になります。

ステップ 2: プライベート API を作成する

VPC 内のクライアントのみがアクセスできるようにプライベート API を作成します。

プライベート API を作成するには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. [Create API] (API を作成) を選択し、[REST API] で [Build] (構築) を選択します。

  3. [API 名] に「private-api-tutorial」と入力します。

  4. [API エンドポイントタイプ] で、[プライベート] を選択します。

  5. [VPC エンドポイント ID] に、AWS CloudFormation スタックの [出力] からの VPC エンドポイント ID を入力します。

  6. API の作成 を選択します。

ステップ 3: メソッドと統合を作成する

API への GET リクエストを処理する GET メソッドと Lambda 統合を作成します。クライアントが API を呼び出すと、API Gateway はステップ 1 で作成した Lambda 関数にリクエストを送信し、クライアントに応答を返します。

メソッドと統合を作成するには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. API を選択します。

  3. / リソースを選択し、[メソッドを作成] を選択します。

  4. [メソッドタイプ] で、[GET] を選択します。

  5. [統合タイプ] で、[Lambda 関数] を選択します。

  6. [Lambda プロキシ統合]を有効にします。Lambda プロキシ統合では、API Gateway は定義された構造を使用して Lambda にイベントを送信し、Lambda 関数からの応答を HTTP 応答に変換します。

  7. [Lambda function] (Lambda 関数) には、ステップ 1 で AWS CloudFormation テンプレートを使用して作成した関数を選択します。関数の名前は private-api-tutorial で始まります。

  8. [メソッドの作成] を選択します。

ステップ 4: リソースポリシーをアタッチする

クライアントが VPC エンドポイントを介してのみ API を呼び出すことを許可するリソースポリシーを API にアタッチします。API へのアクセスをさらに制限するには、VPC エンドポイントの VPC エンドポイントポリシーを設定することもできますが、このチュートリアルでは不要です。

リソースポリシーをアタッチするには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. API を選択します。

  3. [リソースポリシー][ポリシーを作成] の順に選択します。

  4. 以下のポリシーを入力します。vpceID を、AWS CloudFormation スタックの [Outputs] (出力) からの VPC エンドポイント ID に置き換えます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*", "Condition": { "StringNotEquals": { "aws:sourceVpce": "vpceID" } } }, { "Effect": "Allow", "Principal": "*", "Action": "execute-api:Invoke", "Resource": "execute-api:/*" } ] }
  5. [Save changes] (変更の保存) をクリックします。

ステップ 5: API をデプロイする

次に、API をデプロイして、Amazon VPC のクライアントが使用できるようにします。

API をデプロイするには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. API を選択します。

  3. [API のデプロイ] を選択します。

  4. [ステージ][新規ステージ] を選択します。

  5. [Stage name (ステージ名)] に test と入力します。

  6. (オプション) [説明] に説明を入力します。

  7. [デプロイ] を選択します。

これで、API をテストする準備ができました。

ステップ 6: API がパブリックにアクセスできないことを確認する

curl を使用して、Amazon VPC の外部から API を呼び出すことができないことを確認します。

API をテストするために
  1. API Gateway コンソール (https://console.aws.amazon.com/apigateway) にサインインします。

  2. API を選択します。

  3. メインナビゲーションペインで、[ステージ][テスト] ステージの順に選択します。

  4. [ステージの詳細] で、コピーアイコンを選択して API の呼び出し URL をコピーします。URL は https://abcdef123.execute-api.us-west-2.amazonaws.com/test のようになります。ステップ 1 で作成した VPC エンドポイントではプライベート DNS が有効になっているため、提供された URL を使用して API を呼び出すことができます。

  5. curl を使用して、VPC の外部からの API の呼び出しを試みる

    curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test

    Curl は、API のエンドポイントを解決できないことを示します。別の応答が返された場合は、ステップ 2 に戻り、API のエンドポイントタイプに [Private] (プライベート) を選択します。

    curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test

次に、VPC 内の Amazon EC2 インスタンスに接続して API を呼び出します。

ステップ 7: VPC のインスタンスに接続し、API を呼び出す

次に、Amazon VPC 内から API をテストします。プライベート API にアクセスするには、VPC 内の Amazon EC2 インスタンスに接続し、curl を使用して API を呼び出します。ブラウザでインスタンスに接続するには、Systems Manager の Session Manager を使用します。

API をテストするには
  1. Amazon EC2 コンソール (https://console.aws.amazon.com/ec2/) を開きます。

  2. [Instances] を選択します。

  3. ステップ 1 で AWS CloudFormation テンプレートを使用して作成した private-api-tutorial という名前のインスタンスを選択します。

  4. [Connect] (接続) を選択し、[Session Manager] を選択します。

  5. [Connect] (接続) を選択して、インスタンスへのブラウザベースのセッションを起動します。

  6. Session Manager セッションで、curl を使用して API を呼び出します。Amazon VPC でインスタンスを使用しているため、API を呼び出すことができます。

    curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test

    応答 Hello from Lambda! が得られたことを確認します。

Session Manager を使用して、Amazon VPC 内から API を呼び出します。

Amazon VPC 内からのみアクセスできる API を正常に作成し、正常に動作することを確認しました。

ステップ 8: クリーンアップする

不要なコストを回避するには、このチュートリアルで作成したリソースを削除します。次の手順は、REST API と AWS CloudFormation スタックを削除します。

REST API を削除するには
  1. https://console.aws.amazon.com/apigateway で API Gateway コンソールにサインインします。

  2. [API] ページで API を選択します。[API アクション][API を削除] の順に選択し、選択を確定します。

AWS CloudFormation スタックを削除するには
  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

  2. AWS CloudFormation スタックを選択します。

  3. [Delete] (削除) を選択し、選択を確定します。

次のステップ: AWS CloudFormation を使用して自動化する

このチュートリアルで使用するすべての AWS リソースの作成とクリーンアップを自動化できます。AWS CloudFormation テンプレートの完全な例については、template.yaml を参照してください。