2017-07-06 9 views
0

ラムダ関数とそれにアクセスできるAPIGatewayを作成するCloudFormationテンプレートを設定しようとしています。しかし、ラムダを設定するにもかかわらず:I場合InvokeFunction権限を、以下に示す(および他のSOの質問に推奨されているように、太陽の下ですべての順列を試みる)として、私はメッセージExecution failed due to configuration error: Invalid permissions on Lambda function.ApiGateway Lambdaを取得できません:CloudFormationで動作するInvokeFunction権限

を取得し、私はそれが仕事を得ることができる唯一の方法ですAWSコンソールに入り、APIGatewayの宛先をラムダに手動で設定解除して再設定します。私はまた、効果なしにCLIを試みた

aws lambda add-permission --function-name $updatedFunction.FunctionName --statement-id "AllowExecutionFromAPIGateway" --action "lambda:InvokeFunction" --principal "apigateway.amazonaws.com" --source-arn $api.StackId 

誰もがこれらのアクセス権が機能しない理由に任意の洞察力を持っていますか?

... 
"Get":{ 
    "Type":"AWS::Lambda::Function", 
    "Properties":{ 
     "Code":{ 
      "S3Bucket":"webapistack-bucket-org0oolyde9v", 
      "S3Key":"webapi/webapistack-636349410359047808.zip" 
     }, 
     "Tags":[ 
      { 
       "Value":"SAM", 
       "Key":"lambda:createdBy" 
      } 
     ], 
     "MemorySize":256, 
     "Environment":{ 
      "Variables":{ 
       "AppS3Bucket":{ 
       "Fn::If":[ 
        "CreateS3Bucket", 
        { 
         "Ref":"Bucket" 
        }, 
        { 
         "Ref":"BucketName" 
        } 
       ] 
       } 
      } 
     }, 
     "Handler":"webapi::webapi.LambdaEntryPoint::FunctionHandlerAsync", 
     "Role":{ 
      "Fn::GetAtt":[ 
       "GetRole", 
       "Arn" 
      ] 
     }, 
     "Timeout":30, 
     "Runtime":"dotnetcore1.0" 
    } 
},  
"GetPutResourcePermissionTest":{ 
    "Type":"AWS::Lambda::Permission", 
    "Properties":{ 
    "Action":"lambda:invokeFunction", 
    "Principal":"apigateway.amazonaws.com", 
    "FunctionName":{ 
     "Ref":"Get" 
    }, 
    "SourceArn":{ 
     "Fn::Sub":[ 
      "arn:aws:execute-api:WS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/ANY/*", 
      { 
       "__Stage__":"*", 
       "__ApiId__":{ 
       "Ref":"ServerlessRestApi" 
       } 
      } 
     ] 
    } 
    } 
}, 
... 
"ServerlessRestApi":{ 
    "Type":"AWS::ApiGateway::RestApi", 
    "Properties":{ 
     "Body":{ 
     "info":{ 
      "version":"1.0", 
      "title":{ 
       "Ref":"AWS::StackName" 
      } 
     }, 
     "paths":{ 
      "/{proxy+}":{ 
       "x-amazon-apigateway-any-method":{ 
        "x-amazon-apigateway-integration":{ 
        "httpMethod":"POST", 
        "type":"aws_proxy", 
        "uri":{ 
       "Fn::Sub":"arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${Get.Arn}/invocations" 
         } 
        }, 
        "responses":{ 

        } 
       } 
       } 
      }, 
      "swagger":"2.0" 
     } 
    } 
    } 

答えて

1

AWS::Lambda::Permissionが間違っているようです。

参照しているFunctionNameは論理IDですが、仕様では物理IDまたはARNが必要です。

SubのSourceArnパターンに、Region置換の文字が欠落しています。

「ANY」操作がARNに有効かどうかわからないので、私はそれを「*」に置き換えます。

ここで許可の変更されたバージョン:

"GetPutResourcePermissionTest":{ 
    "Type":"AWS::Lambda::Permission", 
    "Properties":{ 
    "Action":"lambda:invokeFunction", 
    "Principal":"apigateway.amazonaws.com", 
    "FunctionName":{ 
     "Fn::GetAtt": [ "Get" , "Arn" ] 
    }, 
    "SourceArn":{ 
     "Fn::Sub":[ 
      "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${__ApiId__}/${__Stage__}/*/*", 
      { 
       "__Stage__":"*", 
       "__ApiId__":{ 
       "Ref":"ServerlessRestApi" 
       } 
      } 
     ] 
    } 
    } 
}, 
+0

これは働いていた - 感謝を。他の人のためのメモ - ANY演算子は、言及したように削除しなければならなかった。 –

関連する問題