Amazon API Gateway Mockの統合によるAPIエンドポイントのモッキング


アマゾンAPIゲートウェイは、ScaleまたはWebSocket APIを作成するための完全に管理されたサービスです.サービスは、開発者がアプリケーションのバックエンドを構築できるようにする多くの異なるAWSサービスと統合します.
このブログのポストは、そのような統合、主に模擬統合を見るでしょう.モックの統合は、高速かつ効率的な方法でAPIをプロトタイピングに優れています.また、開発が完了する前にAPIに依存するチームをブロック解除するのにも使用できます.

Code examples in this blog post are written in Typescript, and as my IaC of choice, I used AWS CDK.


飛び込みましょう.

仮説的シナリオ


あなたが取り組んでいるチームはペットAPIを構築することを使命としています.ビジネスのニーズはよく定義されている-ユーザーはペットリソースを作成し、彼が作成したペットのリソースを一覧表示できます.
アプリケーションのバックエンドに取り組んでいるあなたの同僚は、開発の間、彼らが開発の間、固執するプロセスに同意するのに少しの時間を必要とします.しかし、フロントチームは先頭に立った.彼らはAPIとの対話を開始する準備が整いました.
バックエンドに関してまだ決定される多くの決定があるので、あなたはプロセスでフロントエンドチームをブロックしているAPIゲートウェイMOCK統合を使っている「ペット資源」終点をハックすることに決めました.

模擬統合の解剖学


モンクの統合の美しさは、それがDynamodbまたはAWSラムダのような他のAWSサービスと相互作用しないということです.これは、定義するIAMポリシーやテーブルスキーマがないことを意味します.
統合のそれほど楽しい部分は露出設定オプションです.彼らは一見して漠然としているか不必要に複雑に見えるかもしれない.あなたができることはたくさんありますが、可能性はほとんどありません.
ここではコードの出発点です.
import * as cdk from "aws-cdk-lib";

const mockPetsAPI = new cdk.aws_apigateway.RestApi(this, "mockPetsAPI", {
  defaultCorsPreflightOptions: {
    allowOrigins: cdk.aws_apigateway.Cors.ALL_ORIGINS,
    allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS
  }
});

mockPetsAPI.root.addMethod(
  "POST",
  new cdk.aws_apigateway.MockIntegration({
    passthroughBehavior: cdk.aws_apigateway.PassthroughBehavior.NEVER,
    requestTemplates: {
      /* ... */
    },
    integrationResponses: [
      /* ... */
    ]
  })
);

通過行動


このパラメータはrequestTemplates パラメータそれはAPIゲートウェイがrequestTemplates をリクエストします.
使用例についてはNEVER としてpassthroughBehavior . これはAPIゲートウェイが上記で定義された変換を適用しようとすることを意味しますrequestTemplates セクションエンコード.指定されたエンコーディングのリクエストテンプレートを指定しない場合、APIゲートウェイは呼び出し元に415を返します.

For an in-depth deep dive into different passthrough behaviors, please refer to the official AWS documentation.


リクエストテンプレート


このパラメータはキーがリクエスト符号化であるキー値のペアを定義しますapplication/json , そして、値は要求を変えるのに使用されるマッピングテンプレートです.
あなたがラムダコード自体の範囲内でどんな変形もする必要がないように、AWSラムダ関数に渡される要求本体から必要なフィールドだけを摘むことを考えてください.
私たちは模擬統合を使用しているので、マッピングテンプレートは非常に簡潔になります.
requestTemplates: {
    "application/json": `{
        "statusCode": 201
    }`
}
私たちはAPIゲートウェイに、このエンドポイントに送られた全てのリクエストが、integrationResponse 定義statusCode 201年.
私は、フロントエンドチームが作るすべての要求がコード化されると仮定しましたapplication/json スキーム.
話をしましょうintegrationResponses 次.

統合応答


このパラメータは、私たちの模擬統合が返すことができる応答の配列を定義します.私が早く逃げれば、その反応はstatusCode 指定したリクエストマッピングテンプレートで定義されます.
我々の場合、我々は201のために1つの統合応答だけを定義する必要がありますstatusCode .
integrationResponses: [
  {
    statusCode: "201",
    responseTemplates: {
      "application/json": `{
            "id": "$context.requestId",
            "createdAt": $context.requestTimeEpoch,
            "updatedAt": $context.requestTimeEpoch
        }`
    }
  }
];

Please reference the API Gateway mapping template documentation for more information regarding the $context variable.


With integrationResponses 指定した方法の設定は次のようになります.
mockAPI.root.addMethod(
  "POST",
  new cdk.aws_apigateway.MockIntegration({
    passthroughBehavior: cdk.aws_apigateway.PassthroughBehavior.NEVER,
    requestTemplates: {
      "application/json": `{
              "statusCode": 201
            }
          `
    },
    integrationResponses: [
      {
        statusCode: "201",
        responseTemplates: {
          "application/json": `{
                "id": "$context.requestId",
                "createdAt": $context.requestTimeEpoch,
                "updatedAt": $context.requestTimeEpoch
            }`
        }
      }
    ]
  })
);
我々はまだ取り組む必要があるいくつかの問題があります.そのうちの1つはCorsである.

コア


我々が建設している終点が取り扱いであるのでPOST 要求は、MUCKインテグレーションは適切なCORSヘッダーを返すべきです.さもなければ、エンドポイントの消費者はブラウザ環境からそれを要求することができます.
MOCK統合へのCOsの追加は2段階プロセスである.
まず、与えられたメソッドの応答を設定する必要がありますstatusCode . メソッド応答内で、どのような要求パラメータを統合応答が設定できるかを指定します(この場合、パラメータはCorsヘッダーに対応します).
mockPetsAPI.root.addMethod(
  "POST",
  new cdk.aws_apigateway.MockIntegration({
    /* Previously defined parameters */
  }),
  {
    methodResponses: [
      {
        statusCode: "200",
        responseParameters: {
          "method.response.header.Access-Control-Allow-Origin": true,
          "method.response.header.Access-Control-Allow-Methods": true,
          "method.response.header.Access-Control-Allow-Headers": true
        }
      }
    ]
  }
);
同様integrationResponses , the methodResponses メソッド応答の配列です.与えられた積分応答と方法応答との間の関連はstatusCode パラメータ
第二に、CORSヘッダーの値を含めるように、統合応答を修正する必要があります.
mockPetsAPI.root.addMethod(
  "POST",
  new cdk.aws_apigateway.MockIntegration({
    /* Previously defined parameters */
    integrationResponses: [
      {
        statusCode: "201",
        responseTemplates: {
          /* Previously defined template */
        },
        // Populating the CORS headers with specific values.
        responseParameters: {
          "method.response.header.Access-Control-Allow-Methods":
            "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'",
          "method.response.header.Access-Control-Allow-Headers":
            "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'",
          "method.response.header.Access-Control-Allow-Origin": "'*'"
        }
      }
    ]
  }),
  {
    methodResponses: [
      {
        statusCode: "200",
        responseParameters: {
          "method.response.header.Access-Control-Allow-Origin": true,
          "method.response.header.Access-Control-Allow-Methods": true,
          "method.response.header.Access-Control-Allow-Headers": true
        }
      }
    ]
  }
);
ご覧の通り、CORSの設定がどのようにオープンしているかに関して寛大です.私はあなたのニーズに応じて微調整をアドバイスします.

リクエスト本文の操作


これまでのAPI定義は以下のようになります.
クリックして拡大
import * as cdk from "aws-cdk-lib";

const mockPetsAPI = new cdk.aws_apigateway.RestApi(this, "mockPetsAPI", {
  defaultCorsPreflightOptions: {
    allowOrigins: cdk.aws_apigateway.Cors.ALL_ORIGINS,
    allowMethods: cdk.aws_apigateway.Cors.ALL_METHODS
  }
});

mockPetsAPI.root.addMethod(
  "POST",
  new cdk.aws_apigateway.MockIntegration({
    passthroughBehavior: cdk.aws_apigateway.PassthroughBehavior.NEVER,
    requestTemplates: {
      // For this particular request (in our case every request that is made to this endpoint)
      // respond with integration response defined for statusCode 201.
      "application/json": `{
            "statusCode": 201
        }`
    },
    integrationResponses: [
      {
        statusCode: "201",
        responseTemplates: {
          "application/json": `{
                "id": "$context.requestId",
                "createdAt": $context.requestTimeEpoch,
                "updatedAt": $context.requestTimeEpoch
            }`
        },
        // These definitions would not be possible without the definition within the `responseParameters` section.
        responseParameters: {
          "method.response.header.Access-Control-Allow-Methods":
            "'OPTIONS,GET,PUT,POST,DELETE,PATCH,HEAD'",
          "method.response.header.Access-Control-Allow-Headers":
            "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,X-Amz-User-Agent'",
          "method.response.header.Access-Control-Allow-Origin": "'*'"
        }
      }
    ]
  }),
  {
    methodResponses: [
      {
        // Everything defined in this section is applicable to the integration response with `statusCode` of 201.
        statusCode: "201",
        responseParameters: {
          // What kind of response parameters are allowed to be defined within the `responseParameters` section.
          "method.response.header.Access-Control-Allow-Origin": true,
          "method.response.header.Access-Control-Allow-Methods": true,
          "method.response.header.Access-Control-Allow-Headers": true
        }
      }
    ]
  }
);
リクエスト本文を使用していないことに注意してください.
私は、MOCKインテグレーションの文脈でリクエスト本文の部分を返す方法に関する公式ドキュメンテーションの情報を見つけることができませんでした.ありがたいことに、非常に有用な人はどのように行うことができる方法を発表した.Please refer to this post on StackOverflow .
それがそうであるので、解決はhaackyを感じます.悲しいことに、モックアップの統合は、要求体の操作と参照に関して制限されます.
完全な実装のために、ポストリクエストに対する応答として体のリターン部分を含むために、あなたは私がgithubに持っている例を参照することができました.

ウーチチャツマシュスキー / Apigw mockintegration


Acquito Authorizerによるapigw模擬統合を作成する例。


認知権付与者との統合


展開

  • cd backend
  • npm run bootstrap
  • npm run deploy
  • 人口を占めるfrontend/index.tsx 出力値
  • cd frontend
  • npm start
  • 学習


    認知


  • The autoVerifiedAttributes これらの属性に対して自動的に検証を開始することを意味します
    これは、ユーザーがサインアップするたびに、“ここにあなたのコード”メールは彼の電子メール受信トレイに送信されることを意味します.

    Verification requires users to retrieve a code from their email or phone to confirm ownership. Verification of a phone or email is necessary to automatically confirm users and enable recovery from forgotten passwords. Learn more about email and phone verification.


    したがって、確認するコードをユーザーにメールを送信しないことを確認するにはautoVerifiedAttributes を返します.

  • デフォルトでは、CDKを介して(少なくともAPIの残りの部分)を作成することができますAuthorizer
    これは・・・
  • View on GitHub

    概要


    APIゲートウェイは非常に強力です.私はこのブログのポストを書きました.私にとって利用可能である異なった変化と統合についての学習は、確かに私をより良い開発者にしました.
    私はこのガイドはあなたに役立つように役立つことを願ってそれは私のために有用だった書いてください.
    質問?したいアウトに到達するには?多分、私が書いた何かは、必ずしも正しいというわけではありません?(是正してうれしい.
    あなたはTwitterで私を見つけることができます
    あなたの時間をありがとう.
    サムネイルSam Moqadam からunsplash