[Amplify] amplify overrideでAPI GatewayにAPIキーを設定する
こんにちは @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を編集する
以下のように修正します。
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のコンソールから行う必要がある点に注意してください。
参考
Discussion