🐙

[Amplify] amplify overrideでAPI GatewayにAPIキーを設定する

2022/12/24に公開

こんにちは @kita3222 です👋
本記事は AWS AmplifyとAWS×フロントエンド Advent Calendar 2022、25日目の記事です。

はじめに

REST APIで外向けにAPIを公開する際は、APIキーを用いた認証を行いたいのではないでしょうか。API Gatewayではメソッドリクエストに対してAPI_KEYを要求するよう設定することが可能です。

しかし、AWSサポートに問い合わせたところ、Amplify CLIからは設定できないとの回答を受けました。(2022年11月18日時点)
また、この問題に該当するissueも開いたままで有効な手段がない状態でした。

そこで、amplify overrideを使って、API Gatewayのメソッドリクエストに対してAPI_KEYを要求するように設定してみようと思います。

手順

Amplifyのドキュメントに記載されているOverride Amplify-generated API Gateway resourcesをベースに書いていきます。

ただし、このドキュメントに記載されている内容はAPI GatewayにCognito User Poolオーソライザーを適用する方法になるので、API_KEYを用いた方法に修正する必要があります。

amplify override apiを実行する

amplify override apiを実行して対象のREST APIを選択します。

すると、amplify/backend/api/<api-name>override.tsファイルが生成されます。

override.tsを編集する

以下のように修正します。

override.ts

import { AmplifyApiRestResourceStackTemplate } from "@aws-amplify/cli-extensibility-helper";

export function override(resources: AmplifyApiRestResourceStackTemplate) {
  resources.restApi.binaryMediaTypes = ["multipart~1form-data"];
  resources.restApi.body.securityDefinitions["api_key"] = {
    type: "apiKey",
    name: "x-api-key",
    in: "header",
  };
  for (const path in resources.restApi.body.paths) {
    resources.restApi.addPropertyOverride(
      `Body.paths.${path}.x-amazon-apigateway-any-method.parameters`,
      [
        ...resources.restApi.body.paths[path]["x-amazon-apigateway-any-method"]
          .parameters,
        {
          name: "x-api-key",
          in: "header",
          required: false,
          type: "string",
        },
      ]
    );
    resources.restApi.addPropertyOverride(
      `Body.paths.${path}.x-amazon-apigateway-any-method.security`,
      [
        {
          api_key: [],
        },
      ]
    );
  }
}


デプロイして確認

amplify pushを実行してデプロイしてみましょう。

デプロイ完了後、API Gatewayのコンソールで確認すると APIキーが必須になっていました。(元々は不要

注意点

この方法ではAPI キーを要求するよう API メソッドを設定しかできていないので、API キーの作成自体はこれまで通りAPI Gatewayのコンソールから行う必要がある点に注意してください。

参考

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-setup-api-key-with-console.html#api-gateway-usage-plan-configure-apikey-on-method
https://docs.amplify.aws/cli/restapi/override/
https://github.com/aws-amplify/amplify-category-api/issues/438

Discussion