【问题标题】:How do I get the AccountId as a variable in a serverless.yml file?如何在 serverless.yml 文件中获取 AccountId 作为变量?
【发布时间】:2017-07-25 13:09:13
【问题描述】:

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

例如:

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

引用当前regionaccountId 的正确方法是什么?

【问题讨论】:

  • 接受的答案现在已经过时了,这个native solution 为我工作
  • 我将接受的答案更改为原生解决方案。向下滚动查看!

标签: amazon-web-services serverless-framework


【解决方案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}

【讨论】:

【解决方案2】:

编辑:这个问题可能已经过时了。考虑this commentthis answer


AWS CloudFormation 提供 some variablesAWS::AccountIdAWS::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,它有效。在下面查看我的答案:stackoverflow.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 中解释的那样,这确实在无服务器框架中得到了支持。
猜你喜欢
  • 2020-10-09
  • 2019-08-27
  • 2019-04-13
  • 1970-01-01
  • 2012-06-23
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多