2

ローカルでテストしてからデプロイしようとしている 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 ゲートウェイがエラーをスローすると予想されますが、そうではなく、通過させます。

みんなありがとう!

4

1 に答える 1