自分の環境用にAWS Cloudformationテンプレートを作成していますが、API GatewayメソッドでCORSを有効にする方法が見つかりません。
AWSコンソールを使用して設定できます( こちらは公式ドキュメントです )が、Cloudformationテンプレートでどのように設定できますか?
試行錯誤の後、次のCloudFormationテンプレートスニペットは、CORSコンソールウィザードと比較した場合に同等のOPTIONSメソッドを生成することがわかりました。
OptionsMethod:
Type: AWS::ApiGateway::Method
Properties:
AuthorizationType: NONE
RestApiId:
Ref: MyApi
ResourceId:
Ref: MyResourceOnWhichToEnableCORS
HttpMethod: OPTIONS
Integration:
IntegrationResponses:
- StatusCode: 200
ResponseParameters:
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-Methods: "'POST,OPTIONS'"
method.response.header.Access-Control-Allow-Origin: "'*'"
ResponseTemplates:
application/json: ''
PassthroughBehavior: WHEN_NO_MATCH
RequestTemplates:
application/json: '{"statusCode": 200}'
Type: MOCK
MethodResponses:
- StatusCode: 200
ResponseModels:
application/json: 'Empty'
ResponseParameters:
method.response.header.Access-Control-Allow-Headers: false
method.response.header.Access-Control-Allow-Methods: false
method.response.header.Access-Control-Allow-Origin: false
*注1:これは、POSTのデフォルトを使用する例です。明らかに、必要な値を含めるためにAccess-Control-Allow-Methods
を更新する必要があります。
*注2:最近YAMLサポートを導入したAWS CloudFormationチームへの称賛。 YAML/JSONへ/から変換する必要がある場合は、このサイトが便利であることがわかりました。 http://www.json2yaml.com/
現在、自動CORS構成のAPI Gatewayサポートは、API Gatewayコンソールを介してのみ機能します。 swaggerからAPIをインポートするとき、またはCloudFormationを介してAPIを定義するときは、CORSを自分で設定できますが、OPTIONSメソッドを設定し、他のメソッドにCORS固有のヘッダーを追加するためのすべてのパラメーターを指定する必要があります。
このページ は、swaggerをインポートするときにCORSを設定する方法を示しています。 CloudFormationを介したCORSのセットアップは概念的には似ていますが、スワガー構文ではなくCloudFormation構文を使用します。
それはオプションメソッドを作成するだけで、GET、POSTなどのメソッド応答で行う必要がある作業がまだあります、私は完成したhello world cloudformationを作成しました
https://github.com/seraphjiang/aws-cors-cloudformation/tree/master
これを試して:
OPTIONS:
Type: AWS::ApiGateway::Method
Properties: ApiKeyRequired: false
RestApiId: !Ref YourAPI
ResourceId: !Ref YourResourceName
HttpMethod: OPTIONS
AuthorizationType: NONE
Integration:
Type: MOCK
IntegrationResponses:
- StatusCode: 200
ResponseParameters:
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-Methods: "'GET,OPTIONS'"
method.response.header.Access-Control-Allow-Origin: "'*'"
ResponseTemplates:
application/json: ''
PassthroughBehavior: WHEN_NO_MATCH
RequestTemplates:
application/json: '{"statusCode": 200}'
Type: MOCK
MethodResponses:
- StatusCode: 200
ResponseModels:
application/json: 'Empty'
ResponseParameters:
method.response.header.Access-Control-Allow-Headers: false
method.response.header.Access-Control-Allow-Methods: false
method.response.header.Access-Control-Allow-Origin: false