在我的AWS API网关API中,我设置了2个环境,“dev”和“prod”。我还为名为“dev”和“prod”的AWS lambda函数提供了2个别名。现在,我想将我的API的“dev”环境指向我的函数的“dev”别名,以及我的函数的“prod”别名中的“prod”环境。
我在教程中读到了我目前无法找到的内容,在集成配置中,您可以使用<functionName>:<alias>
形式指定函数,因此我将集成设置为指向:{ {1}}。
我在API的prod环境中添加了一个名为lambdaAlias且值为“prod”的stage变量,并在dev环境中添加了一个带有“dev”值的同名变量。但是,当我将APi切换为使用最新部署时,将最新部署从简单的lambda函数名称引入名称再转换为别名,我在调用API时会在cloudWatch中看到此错误:
由于配置错误导致执行失败:Lambda函数的权限无效
这首先发生在prod和dev上。然后,我发现lambda触发器是按别名设置的。所以我从$ LATEST版本中删除了我的API触发器,并将其添加到“prod”别名:
然后我去了“dev”别名,想要添加相同的触发器,但由于某种原因,现在我无法从下拉列表中选择“dev”环境:
我假设这是因为awzs想要将集成设置为专门指向“dev”别名,但是已经存在集成。如果我理解AWS的文档,我需要做的是设置一个lambda策略,授予我对这个别名的API访问的“dev”环境,但是控制台只有一个“查看功能策略”部分,看似没有地方手动设置它。
那么如何按照我想要的方式设置它呢?最好通过控制台,因为我不经常使用AWS,也不想安装CLI。
答案 0 :(得分: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
答案 1 :(得分:0)
如果您有许多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>