如何在无服务器框架中将AWS账户ID作为自定义变量?

时间:2019-10-09 19:51:11

标签: amazon-web-services serverless-framework

在无服务器框架中,我想将部署存储桶设置为

<project_name>-<stage>-<account_id>

我可以使用自定义变量来获得舞台,例如:

custom:
    stage: ${opt:stage, self:provider.stage}

但是如何获取AWS帐户ID?我已经尝试过使用 serverless-pseudo-parameters ,如下所示,但是没有成功。

custom:
    account_id: #{AWS::AccountId}
plugins:
  - serverless-pseudo-parameters

有人可以帮助我将帐户ID设置为自定义变量吗?

4 个答案:

答案 0 :(得分:5)

根据documentation,要获取帐户ID,您可以使用外部js文件:

// myCustomFile.js
const { STS } = require('aws-sdk');
const sts = new STS();

module.exports.getAccountId = async () => {
  // Checking AWS user details
  const { Account } = await sts.getCallerIdentity().promise();
  return Account;
};

# serverless.yml
service: new-service
provider: aws
custom:
  accountId: ${file(../myCustomFile.js):getAccountId}

答案 1 :(得分:1)

对于使用带有“假定角色”的Serverless的任何人,其中您的IAM用户是在主AWS帐户中定义的,并且您正尝试使用该子帐户中的角色在子帐户中进行部署:已记录的解决方案< / strong>-上面接受的答案之一-不起作用

此设置详细说明:https://theithollow.com/2018/04/30/manage-multiple-aws-accounts-with-role-switching/。当无服务器使用--aws-profile配置为承担另一个帐户中定义的角色时,sts.getCallerIdentity()从默认配置文件中返回主帐户的帐户信息,而不是假定角色的帐户。

要获取假定角色的帐户ID(这是我们要部署到的位置),我执行了以下操作:

const { STS } = require('aws-sdk');

module.exports.getAccountId = async (context) => {
  // This loads the AWS credentials Serverless is currently using
  // They contain the role ARN of the assumed role
  const credentials = context.providers.aws.getCredentials();

  // init STS using the same credentials
  const sts = new STS(credentials);
  const identity = await sts.getCallerIdentity().promise();
  return identity.Account;
};

编辑:

找到了一种更好的方法,该方法比无服务器文档中介绍的方法更简单,并且在假定的角色下也能很好地工作:

module.exports.getAccountId = async (context) => {
  return context.providers.aws.getAccountId();
};

答案 2 :(得分:-1)

您应该能够按照下面的示例https://serverless.com/framework/docs/providers/aws/guide/variables/

访问它们
Resources:


- 'Fn::Join':
      - ':'
      - - 'arn:aws:logs'
        - Ref: 'AWS::Region'
        - Ref: 'AWS::AccountId'
        - 'log-group:/aws/lambda/*:*:*'

答案 3 :(得分:-1)

似乎您的语法错误。试试

custom:
    account_id: ${AWS::AccountId}

至少在您提供的示例中,您正在使用#{AWS::AccountId}

注意到您的主题标签吗?