【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】を選択します。

apigateway_stage
ステージ選択

タブから【Export】を選択、真ん中の【Export as Swagger】から【YAML】を選択します。(JSONでもいいですが、YAMLで説明します。)

apigateway_export
Swaggerをエクスポート

エクスポートされた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を記述していきます。上で切り出した部分を後で貼りけます。

単純にAPI Gatewayを作成して、デプロイするには Type: AWS::ApiGateway::RestApiType: AWS::ApiGateway::Deploymentが必要になります。
さらに、Lambda呼び出しにType: AWS::Lambda::Permissionが必要になります。

実際にコードで例にします。

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での
デプロイですが、上手くデプロイまでいけました。