首页 > 解决方案 > AWS CDK Java - 模板格式错误:映射元素计数 0 应大于 0

问题描述

我想将 AWS CDK 与 Java 一起使用来创建一个简单的 VPC,其中包含一个公共子网、一个安全组和一个 EC2 实例。Java类如下,很简单:

public class CDKStack extends Stack {
public CDKStack(final Construct scope, final String id) {
    this(scope, id, null);
}

public CDKStack(final Construct scope, final String id, final StackProps props) {
    super(scope, id, props);

    // Create public subnet
    SubnetConfiguration publicSubnet = SubnetConfiguration.builder()
            .name("public-subnet")
            .subnetType(SubnetType.PUBLIC)
            .cidrMask(24)
            .build();
    List<SubnetConfiguration> subnetList = new ArrayList<>();
    subnetList.add(publicSubnet);
 
    // Create VPC with subnet above
    Vpc vpc = new Vpc(this, "vpc-from-ckd", VpcProps.builder()
            .cidr("10.0.0.0/16")
            .maxAzs(1)
            .subnetConfiguration(subnetList)
            .build());

    // Create the Security Group inside the VPC
    SecurityGroup securityGroup = new SecurityGroup(this, "sg-cdk-java", SecurityGroupProps.builder()
            .vpc(vpc)
            .allowAllOutbound(true)
            .build());
    
    // Create image and EC2 instance
    final GenericLinuxImage genericLinuxImage = new GenericLinuxImage(Collections.emptyMap());

    Instance.Builder.create(this, "EC2 from CDK")
            .instanceType(new InstanceType("t2.micro"))
            .machineImage(genericLinuxImage)
            .securityGroup(securityGroup)
            .vpc(vpc)
            .build();
  }
}

但是,当我cdk deploy(在 Windows 10 上)运行时,我收到以下我不理解的错误:

CDKStack: deploying...
CDKStack: creating CloudFormation changeset...

 ❌  CDKStack failed: Error [ValidationError]: Template format error: Mappings element count 0 should be greater than 0

任何可以澄清我做错了什么的帮助都将不胜感激,因为我正在浏览示例和 API 文档,但我无法弄清楚。

标签: amazon-web-servicesaws-cdk

解决方案


经过一番搜索,我更加注意错误消息,并意识到Mappings指的是Cloudformation Mappings(现在想想听起来很明显,但从错误消息中完全不清楚,它似乎更像是一个动词句子)并且从他们在官方文档中的示例中,我认为它可能与环境变量有关。因此,我在 Java 类中明确设置它们,现在它可以工作了:

.env(Environment.builder()
    .account("1234567890")
    .region("aws-region-name")
    .build())

推荐阅读