【问题标题】:How to configure AWS CDK Account and Region to look up a VPC如何配置 AWS CDK 账户和区域以查找 VPC
【发布时间】:2022-02-08 14:06:46
【问题描述】:

我正在学习 AWS CDK,这是一个我似乎无法弄清楚的问题。 JS/Node 不是我经常使用的语言,所以如果有一些明显的原生我遗漏的东西,请不要太苛刻。我正在尝试将容器部署到现有 VPC/新 ECS 集群。下面的代码不是我的整个脚本,而是一个重要的部分。希望它能给出我想要做什么的想法。

//import everything first

stack_name = "frontend";

class Frontend extends core.Stack {
constructor(scope, id, props = {}) {
    super(scope, id);

    console.log("env variable " + JSON.stringify(props));
    
    const base_platform = new BasePlatform(this, id, props);

    //this bit doesn't matter, I'm just showing the functions I'm calling to set everything up

    const fargate_load_balanced_service = ecs_patterns.ApplicationLoadBalancedFargateService();
    this.fargate_load_balanced_service.taskDefinition.addToTaskRolePolicy();
    this.fargate_load_balanced_service.service.connections.allowTo();
    const autoscale = this.fargate_load_balanced_service.service.autoScaleTaskCount({});
    this.autoscale.scale_on_cpu_utilization();
    }
}

class BasePlatform extends core.Construct {
constructor(scope, id, props = {}) {
    super(scope, id);
    this.environment_name="frontend";
    
    console.log("environment variables " + JSON.stringify(process.env));

    //This bit is my problem child

    const vpc = ec2.Vpc.fromLookup(
        this, "VPC",{
        vpcId: 'vpc-##########'
    });

    //this bit doesn't matter, I'm just showing the functions I'm calling to set everything up

    const sd_namespace = service_discovery.PrivateDnsNamespace.from_private_dns_namespace_attributes();
    const ecs_cluster = ecs.Cluster.from_cluster_attributes();
    const services_sec_grp = ec2.SecurityGroup.from_security_group_id();
    }
}

const app = new core.App();

_env = {account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION };

new Frontend(app, stack_name, {env: _env});

app.synth();

当我运行 CDK 合成器时,它会吐出:

错误:无法从上下文提供程序 vpc-provider 检索值,因为未在堆栈级别指定帐户/区域。在定义堆栈时使用显式帐户和区域配置“env”,或使用环境变量“CDK_DEFAULT_ACCOUNT”和“CDK_DEFAULT_REGION”从 CLI 继承环境信息(不建议用于生产堆栈)

但我不知道为什么。我在这里的用法适合 Stackoverflow 对类似问题的其他几个答案,它不像 AWS 文档中的示例,当我使用 console.log(process.env) 时,它会吐出 CDK_DEFAULT_REGION 和 CDK_DEFAULT_ACCOUNT 的正确/预期值。当我记录“env”时,它也会吐出预期值。

所以我的问题是,如何配置我的环境以便 ec2.Vpc.fromLookup 知道我的帐户信息,或者如何将值正确传递给“env”?

【问题讨论】:

  • @Mithilesh_Kunal 虽然设置了环境变量。当我注销process.env 时,它们就在那里。那么为什么ec2.Vpc.fromLookup 会抛出一个抱怨它们的错误呢?它们已设置。

标签: javascript node.js amazon-web-services aws-cdk


【解决方案1】:

据我了解,如果您想在合成时使用环境细节,必须specify an environment explicitly

AWS CDK 区分根本不指定 env 属性和使用 CDK_DEFAULT_ACCOUNT 和 CDK_DEFAULT_REGION 指定它。前者意味着堆栈应该合成一个与环境无关的模板。在此类堆栈中定义的构造不能使用有关其环境的任何信息。例如,您不能编写 if (stack.region === 'us-east-1') 之类的代码或使用需要查询您的 AWS 账户的 Vpc.fromLookup (Python: from_lookup) 之类的框架工具。如果没有指定明确的环境,这些功能根本不起作用;要使用它们,您必须指定 env。

如果你想与 cli 共享环境变量,你可以这样做:

new MyDevStack(app, 'dev', { 
  env: { 
    account: process.env.CDK_DEFAULT_ACCOUNT, 
    region: process.env.CDK_DEFAULT_REGION 
}});

【讨论】:

    【解决方案2】:

    最简单的方法是使用 aws cli(aws configure)。

    您需要为您的用户提供编程访问权限,并从 aws 控制台生成访问密钥。 AWS CDK documentation

    【讨论】:

    • 这有帮助,谢谢。
    • 感谢您的回复,我已经这样做了。 ~/.aws/config~/.aws/credentials 中有我的帐户信息,正如我在问题中所说,当我 console.log("environment variables " + JSON.stringify(process.env)); 时,日志中存在正确的环境变量。但是,当我实际尝试使用 ec2.Vpc.fromLookup 时,我得到了上面提到的错误。那么具体为什么vpc-provider 无法访问这些信息呢?
    • 刚刚遇到这个问题,因为我的超级没有使用道具。将您的 super(scope, id); 替换为 super(scope, id, props);
    【解决方案3】:

    由于我无法发表评论,因此我在此处发布我的查询。

    从外观上看,只有一个堆栈frontend。所以我相信你也可以尝试在代码中对 account-id 和 region 进行硬编码,看看它是否有效。 我也很好奇

    的输出是什么
    console.log("environment variables " + JSON.stringify(process.env));
    

    【讨论】:

    • 我也尝试过硬编码帐户 ID 和区域代码,得到的结果与我的帖子相同。就日志输出而言,它是环境中的所有内容,当我搜索它时,我发现 CDK_DEFAULT_REGION 和 CDK_DEFAULT_ACCOUNT 都在环境中正确设置。
    【解决方案4】:

    Nick Cox 所述,将带有env 的道具显式传递给父构造构造函数

    class BasePlatform extends core.Construct {
            constructor(scope, id, props = {}) {
                super(scope, id, props);

    【讨论】:

      【解决方案5】:

      super(scope, id) 替换为super(scope, id, props);

      props 需要传递给 super 以供 vpc-provider 使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 2020-09-21
        • 2017-09-13
        • 2018-02-27
        • 2020-06-28
        • 2022-06-23
        相关资源
        最近更新 更多