![](/img/trans.png)
[英]AWS - How to pass ARN from cloud formation template to aws lambda function
[英]How do I get the ARN of an AWS Lambda function for a Cloud Formation specific resource property?
我似乎无法让Ref
或Fn:GetAtt
返回用于设置资源的有效值。
无服务器.yml
...etc...
functions:
bearerTokenAuthentication:
handler: app.bearerTokenAuthentication
name: ${self:service}-auth-bearer
resources:
- ${file(./serverless_resources.yml)}
serverless_resources.yml
Resources:
ApiGateway:
Type: AWS::ApiGateway::RestApi
Properties:
Name: restapi-${self:provider.stage}
Description: Endpoints
ApiKeySourceType: HEADER # (to read the API key from the X-API-Key header of a request)
ApiGatewayBearerAuthorizer:
Type: AWS::ApiGateway::Authorizer
Properties:
Type: token
IdentitySource: method.request.header.Authorization
Name: BearerAuthorization
AuthorizerResultTtlInSeconds: 300
AuthorizerUri: !Join #arn:aws:apigateway:${self:provider.region}:lambda:path/${self:functions.bearerTokenAuthentication.name}
- ''
- - 'arn:aws:apigateway:'
- !Ref 'AWS::Region'
- ':lambda:path/2015-03-31/functions/'
- !GetAtt
- bearerTokenAuthentication # also tried !Ref bearerTokenAuthentication and '${self:functions.bearerTokenAuthentication.name}'
- Arn
- /invocations
RestApiId: !Ref ApiGateway
无论我做什么, GetAtt
都找不到在bearerTokenAuthentication
声明的 Lambda 函数的 ARN。 我只是不断收到此错误:
错误:CloudFormation 模板无效:模板错误:Fn::GetAtt 的实例引用未定义的资源 bearerTokenAuthentication
... 或者如果尝试Ref
...
错误:CloudFormation 模板无效:模板格式错误:模板的资源块中未解析的资源依赖关系 [bearerTokenAuthentication]
是否可以从资源部分引用 Lambda ARN? 从错误消息看来,它正在寻找“资源”名称。 我一直认为 lambda 函数声明也被认为是一种资源(当然除了明显的Resources:
块),也许我误解了一些东西。
我想到了。 我有一个 NodeJS 项目,并且正在使用“无服务器”命令行(sls)使用serverless.yml
进行部署。 事实证明,它创建了一个.serverless
子目录,其中包含一些文件。 其中之一是 AWS Cloud Formation 的编译模板,称为cloudformation-template-update-stack.json
。 该实用程序似乎喜欢通过使第一个字符大写并将“LambdaFunction”添加到所有函数名称(无论出于何种原因)来破坏名称。 在这种情况下, bearerTokenAuthentication
被重命名为BearerTokenAuthenticationLambdaFunction
(实际资源名称)。 查看编译的模板后,一切都变得清晰了。 该实用程序似乎还可以计算出依赖关系,这很高兴知道。 这是最后的结果:
AuthorizerUri: !Join
- ''
- - 'arn:aws:apigateway:'
- !Ref 'AWS::Region'
- ':lambda:path/2015-03-31/functions/'
- !GetAtt [ BearerTokenAuthenticationLambdaFunction, Arn ]
- '/invocations'
其他“陷阱”:
如果您还在函数中使用event
映射,请不要定义AWS::ApiGateway::RestApi
资源(就像我在我的问题中所做的那样),否则您将创建 2 个 API。 event
条目会自动创建一个名为“ApiGatewayRestApi”的 API——这是由sls
实用程序生成的资源名称。 最后一个文件的最后一行改成了这样:
RestApiId: !Ref ApiGatewayRestApi
我的ApiGateway:
部分已删除。
归功于这篇文章,这有助于让我更清楚到底发生了什么: https : //forum.serverless.com/t/fixed-how-do-i-get-reference-api-gateway-restapi-id -in-serverless-yml/3397/5
上一个答案:
我也找到了另一种方法。 这就是我一直在做的事情,直到我找到了合适的(更短的)方法。 我能够提取 lambda 名称并手动将所需的 URI 拼接在一起:
AuthorizerUri: !Join
- ''
- - 'arn:aws:apigateway:'
- !Ref 'AWS::Region'
- ':lambda:path/2015-03-31/functions/arn:aws:lambda:'
- !Ref 'AWS::Region'
- ':'
- !Ref 'AWS::AccountId'
- ':function:'
- '${self:functions.bearerTokenAuthentication.name}'
- '/invocations'
我希望这有助于节省一些时间来尝试理解复杂的 .yml 文件。 我也无法理解为什么让它变得简单易懂如此困难。 有人只需要说(对我来说)是“sls 需要一个‘serverless.yml’文件和可选的包含文件(例如特定于云系统本身的声明,如 AWS Cloud Formation),并生成一个模板 JSON 文件目标云服务系统使用它来部署您的解决方案。此外,您提供的名称可能会被破坏,因此请检查模板。 我也很惊讶现在没有人创建一个编辑器来让这一切变得更容易——也许有一天我会研究一下自己。 ;)
您始终可以转到已部署的 lambda 并查找 aws:cloudformation:logical-id 标记。 这样您就可以获得应该在 serverless.yaml 中使用的逻辑 ID。 (也不喜欢这种幕后花招……)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.