如何在 serverless.yml 文件中获取 AccountId 作为变量?
Posted
技术标签:
【中文标题】如何在 serverless.yml 文件中获取 AccountId 作为变量?【英文标题】:How do I get the AccountId as a variable in a serverless.yml file? 【发布时间】:2017-07-25 13:09:13 【问题描述】:我想在我的文件中动态构建一个 ARN,但我需要获取我当前的 AccountId。如何将其作为变量访问?
例如:
example: arn:aws:states:$region:$accountId:stateMachine:$self:service-$self:custom.stage-example
引用当前region
和accountId
的正确方法是什么?
【问题讨论】:
接受的答案现在已经过时了,这个native solution 为我工作 我将接受的答案更改为原生解决方案。向下滚动查看! 【参考方案1】:现在从 2.3.0 版本开始支持本机。
只需通过$aws:accountId
引用它。您也可以通过$aws:region
引用区域。此处的文档:https://www.serverless.com/framework/docs/providers/aws/guide/variables#referencing-aws-specific-variables
service: new-service
provider: aws
functions:
func1:
name: function-1
handler: handler.func1
environment:
ACCOUNT_ID: $aws:accountId
REGION: $aws:region
【讨论】:
这与接受的答案不同吗? ***.com/a/64867520/12958 接受的答案在!Sub
函数的帮助下使用 Cloudformation 伪参数参考*(AWS::AccountId
带双冒号)。我的答案本机支持$aws:accountId
,但仅支持无服务器版本> = 2.3.0 docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/…【参考方案2】:
编辑:这个问题可能已经过时了。考虑this comment 和this answer。
AWS CloudFormation 提供 some variables 和 AWS::AccountId
和 AWS::Region
,但您不能在 serverless.yml 文件中使用它们,例如 $AWS::AccountId
。不支持这些。
@jens answer 是对的。您必须使用 CloudFormation 语法。在下面的示例中,我提供了另一种使用 CloudFormation 的方法。
service: testing-aws-account-id
provider:
name: aws
runtime: nodejs4.3
region: us-east-1
iamRoleStatements:
- Effect: "Allow"
Action:
- "iot:Publish"
Resource: 'Fn::Join: ["", [ "aws:iot:", "Ref": "AWS::Region" , ":", Ref: "AWS::AccountId" , ":topic/foo" ]]'
functions:
publishIot:
handler: handler.publishIot
行:
Resource: 'Fn::Join: ["", [ "aws:iot:", "Ref": "AWS::Region" , ":", Ref: "AWS::AccountId" , ":topic/foo" ]]'
与硬编码区域和帐户ID相同:
Resource: "arn:aws:iot:us-east-1:1234567890:topic/foo"
【讨论】:
@BamaPookie,我不这么认为。仅当您添加 this plugin 时它才应该工作。 我收到Partition "" is not valid for resource "arn::Join: ["", [ "arn:
@BamaPookie 你真的帮了我这个忙。这个插件正是我需要的!
请注意,此答案已过时。正如我在this answer 中解释的那样,现在无服务器框架确实支持这一点。
@VivekMaharajh 我没有时间对此进行测试,但我已支持您的答案并编辑了我的答案以参考您的答案。谢谢【参考方案3】:
现在无服务器框架原生支持此功能。
函数示例
functions:
hello:
handler: my-function.handler
environment:
var: !Sub arn:aws:logs:$AWS::Region:$AWS::AccountId:log-group:/aws/lambda/*:*:*'
iam 角色示例
iam:
role:
statements:
- Effect: Allow
Action:
- dynamodb:*
Resource: !Sub arn:aws:dynamodb:$AWS::Region:$AWS::AccountId:table/$AWS::StackName-*
有关官方文档,请参阅Pseudo Parameters Reference。
【讨论】:
这对我有用。这应该更高,因为它是一个不依赖插件的原生解决方案。 对于那些尝试使用此解决方案的人,请确保在前面包含!Sub
。【参考方案4】:
有一个方便的无服务器插件https://www.npmjs.com/package/serverless-pseudo-parameters,它增加了引用我刚刚开始使用的aws 参数(例如区域和帐户ID)的能力,并取得了很大的成功。
【讨论】:
我还没有审查过这个插件,但老实说这似乎是最好的答案,已切换为正确答案。 您也可以使用 !Ref 来访问它们。 那个包说它现在在无服务器框架中已被弃用和原生支持。我正在尝试弄清楚如何在本地使用它... @Madeo,它有效。在下面查看我的答案:***.com/a/64867520/1495198 @Madeo,我让它适用于 iam 政策:Resource: !Sub arn:aws:dynamodb:$AWS::Region:$AWS::AccountId:table/$AWS::StackName-*
。您可以在此处查看完整的 serverless.yml 文件:github.com/vivmaha/blog-server/blob/main/serverless.yml【参考方案5】:
无服务器本身无法引用这些变量,因为这些变量是在 CloudFormation 中定义的,但未在无服务器中公开。
如果您需要资源部分中的那些,您可以通过“Ref”-call 直接访问它们。
AWS CloudFormation Pseudo-variables
如果您需要这些变量作为函数环境变量,您可以使用 CloudFormation 代码覆盖无服务器生成的函数代码。
因此,要实现这一点,您必须通过以下模式修改 serverless.yml。
functions:
hello:
handler: handler.hello
resources:
Resources:
HelloLambdaFunction:
Type: AWS::Lambda::Function
Properties:
Environment:
Variables:
accountId:
Ref: AWS::AccountId
region:
Ref: AWS::Region
arn:
Fn::Join:
- ""
- - "arn:aws:states:"
- Ref: AWS::Region
- ":"
- Ref: AWS::AccountId
- ":stateMachine:"
- $self:service
- "-"
- $self:custom.stage
- "-example"
【讨论】:
请注意,此答案已过时。正如我在this answer 中解释的那样,这确实在无服务器框架中得到了支持。以上是关于如何在 serverless.yml 文件中获取 AccountId 作为变量?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?
cloudFormation 模板验证错误:如何拆分 serverless.yml 文件
如何在 serverless.yml 中配置 eventbridge 规则(使用无服务器框架)以在特定时间调用 lambda