ローカルでテストしてからデプロイしようとしている AWS SAM テンプレートがあります。ローカル テストは実行されますが (sam local start-api)、ペイロードは検証されません。これは、RequestValidator が用意されていることを意味しますが、検証は行いません。
次に、YAML ファイルを AWS にデプロイしてそこでテストしようとすると、次のエラーが表示されます。
「変更セットの作成に失敗しました: ウェイター ChangeSetCreateComplete が失敗しました: ウェイターが端末障害状態のステータスを検出しました: FAILED. 理由: AWS::Serverless-2016-10-31 の変換が失敗しました: 無効なサーバーレス アプリケーション仕様ドキュメント。見つかったエラーの数: 1. ID [BoilerPlateFunction] のリソースは無効です。ID [ApiEvent] のイベントは無効です。Api イベントの RestApiId プロパティは、同じテンプレート内の有効なリソースを参照する必要があります。"
これは私の yaml ファイルなので、最初に RequestValidator をローカルで機能させたいと考えています。それが完了したら、何が間違っているのか、なぜ展開できないのかを知ることができます。
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
sam-app
Sample SAM Template for sam-app
Globals:
Function:
Timeout: 20
Parameters:
operationName:
Type: String
Default: testoperationName
restApiName:
Type: String
Default: testrestApiName
validatorName:
Type: String
Default: testvalidatorName
validateRequestBody:
Type: String
Default: testvalidateRequestBody
validateRequestParameters:
Type: String
Default: true
Resources:
BoilerPlateApi:
Type: AWS::ApiGateway::Api
Properties:
Name: !Ref restApiName
BoilerPlateFunctionMethod:
Type: AWS::ApiGateway::Method
Properties:
HttpMethod: ANY
RestApiId: !Ref BoilerPlateApi
RequestValidatorId: !Ref RequestValidator
RequestParameters:
method.request.querystring.test: true
RequestValidator:
Type: AWS::ApiGateway::RequestValidator
Properties:
Name: !Ref validatorName
RestApiId: !Ref BoilerPlateApi
ValidateRequestParameters: !Ref validateRequestParameters
BoilerPlateFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: boilerplate/apiName
Handler: index.handler
Runtime: nodejs8.10
Events:
ApiEvent:
Type: Api
Properties:
RestApiId: !Ref BoilerPlateApi
Path: /hello
Method: GET
繰り返しますが、これは sam local start-api を使用して実行されます。エンドポイントに到達すると、Lambda が実行されます。しかし、クエリ文字列に「test」パラメーターを含めないと、API ゲートウェイがエラーをスローすると予想されますが、そうではなく、通過させます。
みんなありがとう!