【AWS】API Gateway cors template
【きっかけ】
過去の記事参照
buffalokusojima.hatenablog.com
1. 使用するサービス
(AWS)
- CloudFormation
2. 概要
前回、作成したAPI GatewayをCloudFormationでテンプレート化するところをやります。
豆知識的な感じなんで一瞬で終わります。API Gatewayの機能でSwaggerファイルをエクスポートするだけです。
AWS公式とかでCORSのtemplate設定は書いてありますが、面倒な時に一発でCORS設定したPAI Gatewayをデプロイするのに便利な技です。
前回の記事は以下参照
buffalokusojima.hatenablog.com
3. 実践
AWSコンソールからAPI Gatewayを選択し、作成したAPI Gatewayのメニューに移ります。メニューから【Stage】を選択します。
タブから【Export】を選択、真ん中の【Export as Swagger】から【YAML】を選択します。(JSONでもいいですが、YAMLで説明します。)
エクスポートされたYAML形式のファイルが表示されるのでpathから以下をコピーします。
paths: /TestMethod: post: responses: 200: description: "200 response" headers: Access-Control-Allow-Origin: type: "string" x-amazon-apigateway-integration: uri: "url" responses: default: statusCode: "200" responseParameters: method.response.header.Access-Control-Allow-Origin: "'*'" passthroughBehavior: "when_no_match" httpMethod: "POST" type: "aws" options: consumes: - "application/json" produces: - "application/json" responses: 200: description: "200 response" 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: "'OPTIONS,POST'" method.response.header.Access-Control-Allow-Headers: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'" method.response.header.Access-Control-Allow-Origin: "'*'" responseTemplates: application/json: "{}\n" requestTemplates: application/json: "{\n \"statusCode\" : 200\n}\n" passthroughBehavior: "when_no_match" type: "mock"
ここからはtemplateを記述していきます。上で切り出した部分を後で貼りけます。
実際にコードで例にします。
Resources: // Lambdaの呼び出しパーミッション TestPermissiondev: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction Principal: apigateway.amazonaws.com FunctionName: !Ref TestFunction // 呼び出すLambdaの名前 SourceArn: !Sub - >- arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/POST/Test // メソッドPOSTにしてます。GETはここをGETに。 - __Stage__: '*' __ApiId__: !Ref RestApi // API Gatewayのデプロイ ApiGatewayDeployment: Type: AWS::ApiGateway::Deployment Properties: RestApiId: Ref: RestApi // デプロイするAPIを設定 Description: "apigateway deployment" StageName: "prod" // デプロイ名設定 // API Gatewayの設定 RestApi: Type: AWS::ApiGateway::RestApi Properties: Body: info: version: '1.0' title: !Ref 'AWS::StackName' paths: // さっきコピーした部分貼り付け
これでYAMLの形式エラー等がなければCloud Formationでデプロイ出来るはずです。
私がデプロイした時はcloud9からcodecommitにコミットしてcodepipeline上でのcloudformationでの
デプロイですが、上手くデプロイまでいけました。