【问题标题】:How to make different AWS API gateway environments point to different aliases of a lambda function?如何让不同的 AWS API 网关环境指向 lambda 函数的不同别名?
【发布时间】:2017-10-27 04:16:13
【问题描述】:

在我的 AWS API Gateway API 中,我设置了 2 个环境,“dev”和“prod”。我还有一个名为“dev”和“prod”的 AWS lambda 函数的别名。现在,我想将 API 的“dev”环境指向函数的“dev”别名,并将“prod”环境指向函数的“prod”别名。

我读到了一个暂时找不到的教程,在集成配置中,您可以以<functionName>:<alias>的形式指定功能,所以我将集成设置为指向:SlackCommands:${stageVariables.lambdaAlias} .

我在 API 的 prod 环境中添加了一个名为 lambdaAlias 且值为“prod”的阶段变量,并在 dev 环境中添加了一个具有相同名称的变量,其值为“dev”。但是当我将 APi 切换为使用最新部署时,它引入了从简单的 lambda 函数名称到名称到别名的这种变化,我在调用 API 时在 cloudWatch 中看到了这个错误:

由于配置错误导致执行失败:Lambda 函数的权限无效

这首先发生在 prod 和 dev 上。然后,我发现每个别名都设置了 lambda 触发器。所以我从 $LATEST 版本中删除了我的 API 触发器,并将其添加到“prod”别名:

然后我转到“dev”别名,并想添加相同的触发器,但由于某种原因,现在我无法从下拉列表中选择“dev”环境:

我假设这是因为 awzs 想要将集成设置为专门指向“dev”别名,但集成已经存在。如果我了解 AWS 的文档,我需要做的是设置一个 lambda 策略,授予我的 API 的“开发”环境访问此别名,但控制台只有一个“查看函数策略”部分,似乎没有地方手动设置。

那么我该如何按照我想要的方式进行设置呢?最好通过控制台,因为我不经常使用 AWS,也不想安装 CLI。

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-api-gateway


    【解决方案1】:

    很遗憾,这是您需要使用 CLI 命令设置的权限。原因是当您在函数名称中使用阶段变量时,API Gateway 无法推断授予权限所需的完整函数名称。

    您需要运行的示例命令如下所示:

    $ aws lambda add-permission \
    --function-name LambdaFunctionOverHttps \
    --statement-id apigateway-test-2 \
    --action lambda:InvokeFunction \
    --principal apigateway.amazonaws.com \
    --source-arn "arn:aws:execute-api:region:aws-acct-id:api-id/*/POST/DynamoDBManager"
    --principal apigateway.amazonaws.com
    

    有关详细信息,请参阅此文档:http://docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example-configure-event-source.html#with-on-demand-https-add-permission

    【讨论】:

      【解决方案2】:

      如果您有许多 lambda 函数,则可以使用以下脚本。您可以指定数组中的所有函数,它会自动添加权限。您还可以使用此脚本为不同的别名函数添加权限。

      import os
      
      # Values to set 
      region = "us-east-2"  # aws region on which api and lambda are deployed
      prefix = ""           # function prefix
      alias = ""            # function alias to call
      accountId = ""        # aws account id
      gatewayId = ""        # api gateway id
      
      # Add all the functions here
      data = [
          ["POST/GET", "Lambda function name", "api resource name"],
      ]
      
      # Update this if need be
      
      principal = "apigateway.amazonaws.com"
      statementId = "api_gateway_" + alias + "_alias_access_policy"
      print "Generated Statment ID: " + statementId
      
      # Below this you can edit as per need
      
      print "---------------------"
      for item in data:
          funcName = item[1]
          funcMethod = item[0]
          endpoint = item[2]
          cmd = "aws lambda add-permission --function-name " + prefix + funcName + ":" + alias + " --principal " + principal + " --statement-id " + statementId + " --action lambda:InvokeFunction" + " --source-arn \"arn:aws:execute-api:" + region + ":" + accountId + ":" + gatewayId + "/*/" + funcMethod + "/" + endpoint + "\""
      
          if len(endpoint) == 0:
              print "---------------------"
              print "Skipping: " + funcName
              continue   
          print "---------------------"
          print cmd
          print "result: "
      
          os.system(cmd)
      

      要运行此脚本,请使用上述源创建一个名为 app-permission.py 的文件。进入终端并运行以下命令:

      export AWS_PROFILE=<aws profile name>
      python app-permission.py
      

      如果您没有配置 aws 配置文件,请运行以下命令:

      aws configure --profile <profile name>
      

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 1970-01-01
        • 2020-04-16
        • 2018-10-29
        • 2020-12-08
        • 2019-07-05
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        相关资源
        最近更新 更多