如何在serverless.yml文件中将AccountId作为变量获取?

56

我想动态构建我的文件中的ARN,但我需要获取当前的AccountId。我该如何将其作为变量访问?

例如:

example: arn:aws:states:${region}:${accountId}:stateMachine:${self:service}-${self:custom.stage}-example

如何正确引用当前的regionaccountId


被接受的答案现在已经过时了,这个本地解决方案对我有用。 - C.Lee
1
我将被接受的答案更改为本地解决方案。向下滚动以查看它! - justin.m.chase
5个回答

53

现在,在Serverless Framework中已经原生支持此功能。

函数示例

  functions:
    hello:
      handler: my-function.handler
      environment:
        var: !Sub arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/*:*:*'

iam role示例

  iam:
    role:
      statements:
        - Effect: Allow
          Action:
            - dynamodb:*
          Resource: !Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${AWS::StackName}-*

请参阅伪参数参考获取官方文档。


1
这对我有用。由于它是一种本地解决方案,不依赖插件,因此应该更高效。 - Bihan Viranga
3
对于那些尝试使用这个解决方案的人,请确保在前面包含 !Sub - C.Lee
1
除了答案中的无服务器文档链接外,还请参阅AWS CloudFormation伪参数参考 - Shane Bishop

27

这与被接受的答案有所不同吗?https://dev59.com/UVgQ5IYBdhLWcg3wikeT#64867520 - justin.m.chase
2
被接受的答案使用了Cloudformation伪参数引用*(带有双冒号的AWS::AccountId),并借助于!Sub函数。我的答案本地支持${aws:accountId},但仅在serverless版本>=2.3.0上支持。https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html - John Paulo Rodriguez
在先前的答案中使用!Sub函数是不相关的。然而,使用更新后的aws:accountId确实更好。 - V Maharajh
我能够切换到你提到的那些,但${aws:stackName}似乎不起作用。 - V Maharajh
是的...但是...非常大的问题是...它无法与离线服务器一起使用!!! - Lqueryvg

24

我还没有审核过这个插件,但说实话,这似乎是最好的答案,已经切换为正确答案。 - justin.m.chase
@Madeo,它有效。请查看下面的答案:https://dev59.com/UVgQ5IYBdhLWcg3wikeT#64867520 - V Maharajh
@Madeo,我已经为IAM策略使其工作:Resource: !Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${AWS::StackName}-*。您可以在此处查看完整的serverless.yml文件: https://github.com/vivmaha/blog-server/blob/main/serverless.yml - V Maharajh
@VivekMaharajh 你可能安装了两个版本的无服务器框架?一个是本地安装的,另一个是全局安装的?最好再仔细检查一下。 - Sam J
@Madeo,所以如果您克隆我的存储库并尝试 npm run sls -- package --stage dev,它对您无法成功?SamJ的建议也很有前途,我认为他们是想告诉您而不是告诉我。 - V Maharajh
显示剩余2条评论

9

由于这些变量在CloudFormation中定义但未在serverless中公开,因此Serverless本身无法引用这些变量。

如果您需要在资源部分中使用它们,则可以通过“Ref”调用直接访问它们。

AWS CloudFormation伪变量

如果您需要将这些变量作为函数环境变量,请使用CloudFormation代码覆盖由Serverless生成的函数代码。

因此,要实现这一点,您必须按照以下模式修改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"

请注意,此答案已过时。现在在无服务器框架中支持此功能,如我在此答案中所解释的那样。 - V Maharajh

6

编辑:这个问题可能已经过时了。请考虑这条评论这个答案


AWS CloudFormation 提供了一些变量(some variables),比如 AWS::AccountIdAWS::Region,但你不能像使用 ${AWS::AccountId} 一样在 serverless.yml 文件中使用它们。这些变量不被支持。 @jens 的答案 是正确的。你必须使用 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"    

那行能否替换为 Resource: '!Sub arn:aws:iot:${AWS::Region}:${AWS::AccountId}:topic/foo' - BamaPookie
2
@BamaPookie,我认为不是这样的。只有在添加了这个插件之后才能正常工作此插件 - Zanon
2
我收到了“Partition""不是资源"arn::Join: ["", [ "arn:`的有效值。 - SteveCoffman
1
@BamaPookie,你在这方面真的帮了我很多。这个插件正是我所需要的! - Sigex
1
请注意,此答案已过时。现在在无服务器框架中支持此功能,如我在此答案中所解释的那样。 - V Maharajh
1
@VivekMaharajh 我没有时间测试这个,但我已经点赞了你的答案并编辑了我的答案以引用你的。谢谢。 - Zanon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接