在无服务器框架中,我想将部署存储桶设置为
<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设置为自定义变量吗?
答案 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}
注意到您的主题标签吗?