typescript 如何使用cdk获取帐户ID

gcuhipw9  于 2023-02-10  发布在  TypeScript
关注(0)|答案(3)|浏览(177)

我用AWS CDK编写了一个简单的 typescript ,并尝试获取帐户ID

import cdk = require("@aws-cdk/core");

const app = new cdk.Stack();

console.log(app.account);

但产量低于

$ tsc index.ts 
$ node index.js 
${Token[AWS::AccountId.0]}

那么Token在这里是什么意思呢?如何得到真实的的账户id呢?

更新

$ cdk init app --language=typescript

# replace lib/<name>-stack.ts with @Rob Raisch 's code

$ cdk synth
${Token[AWS::AccountId.0]}
Outputs:
  MyStackAccount:
    Description: Account of this stack
    Value:
      Ref: AWS::AccountId
Resources:
  CDKMetadata:
    Type: AWS::CDK::Metadata
    Properties:
      Modules: aws-cdk=1.2.0,@aws-cdk/core=1.8.0,@aws-cdk/cx-api=1.8.0,jsii-runtime=node.js/v10.15.3

$ cdk deploy
${Token[AWS::AccountId.0]}
MyStack: deploying...
MyStack: creating CloudFormation changeset...
 0/2 | 11:58:59 AM | CREATE_IN_PROGRESS   | AWS::CDK::Metadata | CDKMetadata Resource creation Initiated
 1/2 | 11:58:59 AM | CREATE_COMPLETE      | AWS::CDK::Metadata | CDKMetadata 
 2/2 | 11:59:00 AM | CREATE_COMPLETE      | AWS::CloudFormation::Stack | MyStack 

 ✅  MyStack

Outputs:
MyStack.MyStackAccount = 123456789012
2lpgd968

2lpgd9681#

我遇到了完全相同的问题,直到我意识到,在运行cdk deploy之前,没有这样的值,只有占位符(如${Token[AWS::AccountId.0]})将在部署期间填充。
可以这样想,您的CDK堆栈是一个创建大量资源的计划,但是在运行cdk deploy之前,这些资源并不存在,因此无法查询它们的值。
获取所需值的一种方法是将其添加到堆栈构造函数中:

// Publish the custom resource output
new cdk.CfnOutput(this, "MyStackAccount", {
  description: "Account of this stack",
  value: this.account
});

例如:

class MyStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, "MyStack", props);

    new cdk.CfnOutput(this, "MyStackAccount", {
      description: "Account of this stack",
      value: this.account
    });
  }
}

当你运行cdk deploy的时候,它会输出:

MyStack.StackAccount = 987XXXXXX456
bwleehnv

bwleehnv2#

问题是“如何获得帐户ID”,但你没有提到为什么。
如果您希望获取IAM用途的帐号,例如仅允许您的帐户使用API Gateway(举例来说),则您还可以使用始终指向“当前”帐户的主体类型AccountRootPrincipal

const policy = new PolicyStatement({
      effect: Effect.ALLOW,
      actions: ['execute-api:Invoke'],
      resources: ['arn:aws:execute-api:*:*:*/*'],
      principals: [new AccountRootPrincipal()], // <-- Your account only
    });
zwghvu4y

zwghvu4y3#

在Rob Raisch的回答中,我认为应该是

`MyStack.MyStackAccount = 987XXXXXX456`

`MyStack.StackAccount = 987XXXXXX456`

相关问题