如何将 AccountId 作为 serverless.yml 文件中的变量获取?
How do I get the AccountId as a variable in a serverless.yml file?
我想在我的文件中动态构建一个 ARN,但我需要获取我当前的 AccountId。如何将其作为变量访问?
例如:
example: arn:aws:states:${region}:${accountId}:stateMachine:${self:service}-${self:custom.stage}-example
引用当前 region
和 accountId
的正确方法是什么?
Serverless 本身无法引用这些变量,因为它们是在 CloudFormation 中定义的,但未在 Serverless 中公开。
如果您需要资源部分中的那些内容,您可以通过 "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"
编辑:这个问题可能已经过时了。考虑 and .
AWS CloudFormation 提供 some variables,如 AWS::AccountId
和 AWS::Region
,但您不能在 serverless.yml 中使用它们像 ${AWS::AccountId}
这样的文件。不支持这些。
是对的。您必须使用 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"
有一个方便的无服务器插件 https://www.npmjs.com/package/serverless-pseudo-parameters 添加了引用 aws 参数(例如区域和帐户 ID)的功能,我刚刚开始使用它并取得了很大成功。
Serverless Framework 现已原生支持此功能。
函数示例
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。
从 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}
我想在我的文件中动态构建一个 ARN,但我需要获取我当前的 AccountId。如何将其作为变量访问?
例如:
example: arn:aws:states:${region}:${accountId}:stateMachine:${self:service}-${self:custom.stage}-example
引用当前 region
和 accountId
的正确方法是什么?
Serverless 本身无法引用这些变量,因为它们是在 CloudFormation 中定义的,但未在 Serverless 中公开。
如果您需要资源部分中的那些内容,您可以通过 "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"
编辑:这个问题可能已经过时了。考虑
AWS CloudFormation 提供 some variables,如 AWS::AccountId
和 AWS::Region
,但您不能在 serverless.yml 中使用它们像 ${AWS::AccountId}
这样的文件。不支持这些。
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"
有一个方便的无服务器插件 https://www.npmjs.com/package/serverless-pseudo-parameters 添加了引用 aws 参数(例如区域和帐户 ID)的功能,我刚刚开始使用它并取得了很大成功。
Serverless Framework 现已原生支持此功能。
函数示例
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。
从 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}