web-dev-qa-db-ja.com

CloudFormationを介してラムダ関数を呼び出す権限をAPI Gatewayに付与するにはどうすればよいですか?

私はこれに対する答えを探すためにウェブの至る所で検索してきました。

基本的に、Swaggerを使用してAPIをスピンアップしています。これは素晴らしくてうまく機能しますが、1つは機能しません...エンドポイントを呼び出すと、500エラーが発生します(500エラーではありません) AWSのいずれかを提供します)。エラーは、「設定エラーが原因で実行に失敗しました:Lambda関数の無効な権限」( https://youtu.be/H4LM_jw5zzs <-これは、別のユーザーからのエラーのビデオですm取得)。

私は多くの穴を掘り下げて、答えを見つけました... AWS CLIを使用することを含み、次のように見えます:

aws lambda add-permission \
--function-name FUNCTION_NAME \
--statement-id STATEMENT_ID \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:us-east-1:ACCOUNT_ID:API_ID/*/METHOD/ENDPOINT"

これはすばらしいことですが、CloudFormationを使用してすべてを起動し、これを自動化したいと考えています。これについてもっと簡単な方法はありますか? CloudFormationに、必要なリソースポリシーを提供するものはありますか?

私はこれで少し壁にぶつかっていますが、私は今日数時間それに取り組んでおり、それは私たちのAPIリリースのための少しのブロッカーですので、どんな助けも大いに感謝します。 :)

17
Sam Bantner

この問題にはCloudFormation解決策があります。次のCloudFormationスニペットを参照してください。

"Permission": {
    "Type": "AWS::Lambda::Permission",
    "Properties": {
        "FunctionName": { "Fn::GetAtt": [ "Lambda", "Arn" ] },
        "Action": "lambda:InvokeFunction",
        "Principal": "apigateway.amazonaws.com",
        "SourceArn": { "Fn::Join": [ "", [
            "arn:aws:execute-api:",
            { "Ref": "AWS::Region" }, ":",
            { "Ref": "AWS::AccountId" }, ":",
            { "Ref": "API" },
            "/*/*/*"
        ] ] }
    }
}

これによりAPI GatewayLambda関数を起動する権限。変更する必要があるこのスニペットの変数は、Lambda(4行目)とAPI(11行目)です。

21
kixorz

呼び出し権限の場合:

    "APIInvokePermission": {
  "Type": "AWS::Lambda::Permission",
  "Properties": {
    "FunctionName": {
      "Ref": "YOUR_LAMBDA_FUNCTION_RESOURCE_NAME"
    },
    "Action": "lambda:InvokeFunction",
    "Principal": "apigateway.amazonaws.com",
    "SourceArn": {
      "Fn::Sub": "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${YOUR_REST_API_RESOURCE_NAME}/*/*/*"
    }
  }
},
1
user6118264