3

我一直在網絡搜索這個答案。從本質上講,我們使用Swagger旋轉了一個API,這很棒,並且效果很好,但是有一件事情是行不通的......當我們調用一個Endpoint時,我們得到一個500錯誤(這不是我們提供的這個500錯誤是來自AWS的錯誤)。錯誤狀態爲「由於配置錯誤導致執行失敗:Lambda函數的權限無效」(https://youtu.be/H4LM_jw5zzs < - 這是來自其他用戶的視頻,是我收到的錯誤)。如何授予API網關通過CloudFormation調用lambda函數的權限?

我已經走了許多ratholes,並且已經找到了答案......這涉及到使用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版本有點阻礙,所以任何幫助都將不勝感激。 :)

+0

難道我的回答可以幫助您?如果是這樣,你能接受並贊成嗎?謝謝! – kixorz

+0

對於它的價值,您也可以通過AWS SDK來實現。我將它用於Go,所以它在這裏:http://docs.aws.amazon.com/sdk-for-go/api/service/lambda/#Lambda.AddPermission ...我看不到有什麼方法列出現有權限。所以我只是容忍我的部署工具中已經存在的錯誤。奇怪的。我的意思是我什至都沒有看到需要這個權限的任何東西,也沒有在任何導出的Swagger中。 – Tom

回答

5

有一個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 Gateway權限啓動您Lambda功能。這段代碼中需要更改的變量是Lambda(第4行)和API(第11行)。

0

您可以使用具有AWS :: Lambda :: Permission的CloudFormation模板來執行此操作。更多詳情here

0

對於調用權限:

"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}/*/*/*" 
    } 
    } 
},