タイトルの通りです。
AWSコンソールでは画面操作で簡単にマッピングテンプレートを設定することができます。
しかし、Swaggerで設定する方法については、まとまった情報があまり無かったため簡単に書いておきます。
設定例
設定対象のoptionsメソッドの部分を抜粋しています。
options:
consumes:
- "application/json"
produces:
- "application/json"
responses:
200:
description: "200 response"
schema:
$ref: "#/definitions/Empty"
headers:
Access-Control-Allow-Origin:
type: "string"
Access-Control-Allow-Methods:
type: "string"
Access-Control-Allow-Headers:
type: "string"
x-amazon-apigateway-integration:
responses:
default:
statusCode: "200"
responseParameters:
method.response.header.Access-Control-Allow-Methods: "'DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT'"
method.response.header.Access-Control-Allow-Headers: "'Content-Type,Authorization,X-Amz-Date,X-Api-Key,X-Amz-Security-Token'"
responseTemplates:
application/json: |
#set($origin = $input.params().header.get('origin'))
#if ($origin.matches("^http(s?)://.*\.example\.com"))
#set($context.responseOverride.header.Access-Control-Allow-Origin = $origin)
#end
requestTemplates:
application/json: '{"statusCode": 200}'
passthroughBehavior: "when_no_match"
type: "mock"
解説
マッピングテンプレートの設定は、リクエストとレスポンスそれぞれ、Swaggerの requestTemplates
と responseTemplates
の項目に対応しています。
AWSコンソールと名称が違うのが分かりにくいですね。
今回はレスポンスについて設定したかったため、上の例では requestTemplates
の設定をしています。
AWSのドキュメントにも情報があります。
x-amazon-apigateway-integration.response
設定例の内容
上の設定例の処理は、example.comのサブドメインからリクエストされた場合は、Access-Control-Allow-Originにリクエスト元のoriginを設定して返却し、それ以外の場合はAccess-Control-Allow-Originヘッダーを返却しないようにしています。CORS対策の設定ですね。
Lambda無しでのAccess-Control-Allow-Originの動的な設定は以下の記事が参考になりました。
Lambda無しでもいけます!!許可されたサイトにだけCORSを許可するためにAPI Gatewayのモックレスポンスを動的に設定してみた
Yamlの | が便利
Yamlの仕様の話なので蛇足ですが、|
を使用することで複数行に渡る文字列を改行を使用して記述できるので認識の負荷が減りうれしいです。
調べ方
はじめは「swagger mapping templates」とかで検索してみたんですが、ぱっと出てきませんでした。なのでAWSコンソールでマッピングテンプレートを設定してAPIをデプロイした後、Swaggerファイルをエクスポートして内容を確認する、ということをしました。
CloudFormationのテンプレートを作るときもこの方法が楽なときがありますね。