首页 > 解决方案 > 将基于资源的策略添加到 AWS Lambda 函数的正确 JSON 格式是什么?

问题描述

我有一个现有的 Lambda 函数 Lambda1 ,它附加了一个资源策略。此资源策略提供对 AWS API Gateway 的 Lambda 函数的访问,特别是对资源 API Authorizer 的访问。如果我在 Lambda 函数控制台上查看资源策略,我会看到以下 JSON 文本

    {
      "Version": "2012-10-17",
      "Id": "default",
      "Statement": [
        {
          "Sid": "333380d7-2251-452f-8640-d919e5d3d1bf",
          "Effect": "Allow",
          "Principal": {
            "Service": "apigateway.amazonaws.com"
          },
          "Action": "lambda:InvokeFunction",
          "Resource": "arn:aws:lambda:eu-west-1:492572502211:function:Lambda1",
          "Condition": {
            "ArnLike": {
              "AWS:SourceArn": "arn:aws:execute-api:eu-west-1:492572502211:kkwykrocn2/authorizers/98sqsv"
            }
          }
        }
      ]
    }

我想附加一个类似于Resource based policy我的另一个 Lambda 函数 Lambda2。我想执行以下命令

aws lambda add-permission --cli-input-json file://C:\script\policy.json

如果我将 JSON 文本粘贴到 policy.json 文件中并执行上述命令,则会收到以下错误:

Parameter validation failed:
Missing required parameter in input: "FunctionName"
Missing required parameter in input: "StatementId"
Unknown parameter in input: "Version", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Unknown parameter in input: "Id", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Unknown parameter in input: "Sid", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Unknown parameter in input: "Effect", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Unknown parameter in input: "Resource", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Unknown parameter in input: "Condition", must be one of: FunctionName, StatementId, Action, Principal, SourceArn, SourceAccount, EventSourceToken, Qualifier, RevisionId
Invalid type for parameter Principal, value: {'Service': 'apigateway.amazonaws.com'}, type: <class 'dict'>, valid types: <class 'str'>

在检查add-permission AWS CLI 命令的文档时,我发现使用--generate-cli-skeleton正确格式应如下的选项:

    {                           
        "StatementId": "",      
        "Action": "",           
        "Principal": "",        
        "SourceArn": "",        
        "SourceAccount": "",    
        "EventSourceToken": "", 
        "Qualifier": "",        
        "RevisionId": ""        
    } 

在上面的 JSON 结构中,没有条件元素,通过它我可以只提供对 API 网关中授权方资源的访问。有人可以帮我理解如何添加上述 JSON 结构的条件元素吗?(请参阅粘贴在本问题开头的 JSON 文本以查看条件元素)

标签: amazon-web-servicesaws-lambda

解决方案


如果您指定和/或,将自动创建条件。SourceArnSourceAccount

你不能创造其他条件。您可以使用这些参数检查文档以创建权限,例如:

aws lambda add-permission --function-name my-function --action lambda:InvokeFunction --statement-id sns-my-topic \
--principal sns.amazonaws.com --source-arn arn:aws:sns:us-east-2:123456789012:my-topic

推荐阅读