web-dev-qa-db-ja.com

ラムダプロキシ統合でAPIゲートウェイリソースをクラウドフォームする方法

私は、Lambdaプロキシ統合を使用して、Lambda関数統合タイプを持つAPIゲートウェイリソースを(cloudformationで)表現する方法を模索しています。

選択できるチェックボックスがあるため、これはAWSコンソールで簡単に実行できます。 API gateway console showing the Use Lambda Proxy Integration checkbox

ただし、AWS :: ApiGateway :: Method CloudFormationリソースに対応するフィールドはありません( Integrationプロパティ にある必要があります)。

これをcloudformationでどのように構成できますか?

19
sihil

統合タイプはAWS_PROXYに設定する必要があります。動作しているYAML CloudFormationテンプレートのメソッドのサンプルスニペットを以下に示します。

ProxyResourceAny:
  Type: AWS::ApiGateway::Method
  Properties:
    AuthorizationType: NONE
    HttpMethod: ANY
    ResourceId:
      Ref: ProxyResource
    RestApiId:
      Ref: API
    Integration:
      Type: AWS_PROXY
      IntegrationHttpMethod: POST
      Uri: !Sub
        - arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Arn}/invocations
        - Arn:
            Fn::GetAtt:
            - RestorerLambda
            - Arn

私がこれをどのように理解したかを言うのは価値があります...

しばらく頭を悩ませた後、aws apigateway get-method CLIコマンドの出力を調べ、コンソールを使用してこのように構成されたメソッドを探しました。これにより、次のJSONが得られ、チェックボックスが型にエンコードされる可能性があることに気付きました。私は私の想定をテストし、上記のCloudFormationを思いつきました。

{
    "apiKeyRequired": false,
    "httpMethod": "ANY",
    "methodIntegration": {
        "integrationResponses": {
            "200": {
                "responseTemplates": {
                    "application/json": null
                },
                "statusCode": "200"
            }
        },
        "passthroughBehavior": "WHEN_NO_MATCH",
        "cacheKeyParameters": [],
        "uri": "arn:aws:apigateway:eu-west-1:lambda:path/2015-03-31/functions/arn:aws:lambda:eu-west-1:XXXXXXXXX:function:Shildrew-Restorer-Play-Lambda/invocations",
        "httpMethod": "POST",
        "cacheNamespace": "64bl3tgw4g",
        "type": "AWS_PROXY"
    },
    "requestParameters": {},
    "authorizationType": "NONE"
}
15
sihil

私たちはこの正確な問題に直面しました。インフラストラクチャにはAnsibleを使用しています。 CLI、Cloudformation、またはSDKにも適用できます

この問題の解決策は、使用しようとしているラムダのAPI Gatewayのエンドポイント動詞に対してLambdaポリシーが細かく定義されていることを確認することでした。

たとえば、複数のルートがありました。各ルート(またはルートのセット)には、lambda:InvokeFunctionを許可する独自のラムダポリシーが定義されている必要があります。これは、AnsibleのLambdaポリシーモジュールで定義されています。これにより、ラムダトリガーが自動的に有効になります。

1
Don U

私は単純に変更することでこの同じ問題を解決しました

Integration:
Type: AWS_PROXY

Integration:
Type: AWS

現在、クラウドフォーメーションのドキュメントは不足しており、APIゲートウェイのクラウドフォーメーションのドキュメントは、コンソールに表示されるものと一致しないため、問題を解決しようとしている人を妨げています。

お役に立てれば!

1
Alex Johnston