AWS 上的 CloudFormation 模板错误

CloudFormation Template errors on AWS

在我的 AWS 模板上解决这些错误时遇到问题。

这是我的错误:

WobblelandSecurityGroup CREATE_FAILED 属性 GroupName 的值必须是字符串类型

PrivateSubnet CREATE_FAILED 资源 PrivateSubnet 的属性验证失败,消息为:#/AvailabilityZone:预期类型:String,找到:JSONArray

InternetGateway CREATE_FAILED 资源 InternetGateway 的属性验证失败,消息:#: 不允许使用无关密钥 [KeyName]

这是我的模板:

AWSTemplateFormatVersion: 2010-09-09
Description: "Wumbo Jumbo"
Parameters: 
  AvailabilityZone: 
    Type: "AWS::EC2::AvailabilityZone::Name"
  EnvironmentName: 
    Description: "An environment name that is prefixed to resource names"
    Type: String
  KeyName: 
    Default: mongodb
    Type: "AWS::EC2::KeyPair::KeyName"
  PrivateSubnetCIDR: 
    Default: 10.0.2.0/24
    Description: "Please enter the IP range (CIDR notation) for the private subnet in the first Availability Zone"
    Type: String
  PublicSubnetCIDR: 
    Default: 10.0.0.0/24
    Description: "Please enter the IP range (CIDR notation) for the public subnet in the first Availability Zone"
    Type: String
  VpcCIDR: 
    Default: 10.0.0.0/16
    Description: "Please enter the IP range (CIDR notation) for this VPC"
    Type: String
Resources: 
  WobblelandEc2Instance: 
    Properties: 
      ImageId: ami-04505e74c0741db8d
      InstanceType: t2.micro
      KeyName: KeyName
      SecurityGroupIds: 
        - WobblelandSecurityGroup
      UserData: 
        Fn::Sub: |
            #!/bin/bash
            wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
            echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
            sudo apt-get update
            sudo apt-get install -y mongodb-org
            
    Type: "AWS::EC2::Instance"
  WobblelandSecurityGroup: 
    Properties: 
      GroupDescription: "Allow HTTP/HTTPS and SSH inbound and outbound traffic"
      GroupName: 
        - "-"
        - 
          - Wobbleland-security-group
          - dev
      SecurityGroupIngress: 
        - 
          CidrIp: 0.0.0.0/0
          FromPort: 80
          IpProtocol: tcp
          ToPort: 80
        - 
          CidrIp: 0.0.0.0/0
          FromPort: 443
          IpProtocol: tcp
          ToPort: 443
        - 
          CidrIp: 0.0.0.0/0
          FromPort: 22
          IpProtocol: tcp
          ToPort: 22
    Type: "AWS::EC2::SecurityGroup"
  DefaultPrivateRoute: 
    Properties: 
      DestinationCidrBlock: 0.0.0.0/0
      NatGatewayId: NatGateway
      RouteTableId: PrivateRouteTable
    Type: "AWS::EC2::Route"
  DefaultPublicRoute: 
    DependsOn: InternetGatewayAttachment
    Properties: 
      DestinationCidrBlock: 0.0.0.0/0
      InternetGatewayId: !GetAtt InternetGateway.InternetGatewayId
      RouteTableId: PublicRouteTable
    Type: "AWS::EC2::Route"
  InternetGateway: 
    Properties: 
      KeyName: !Ref 'KeyName'
      Tags: 
        - 
          Key: Name
          Value: EnvironmentName
        - 
          Key: Env
          Value: EnvironmentName
    Type: "AWS::EC2::InternetGateway"
  InternetGatewayAttachment: 
    Properties: 
      InternetGatewayId: !GetAtt InternetGateway.InternetGatewayId
      VpcId: VPC
    Type: "AWS::EC2::VPCGatewayAttachment"
  NatGateway: 
    Properties: 
      AllocationId: NatGatewayEIP.AllocationId
      SubnetId: PublicSubnet
    Type: "AWS::EC2::NatGateway"
  NatGatewayEIP: 
    DependsOn: InternetGatewayAttachment
    Properties: 
      Domain: vpc
    Type: "AWS::EC2::EIP"
  PrivateRouteTable: 
    Properties: 
      Tags: 
        - 
          Key: Name
          Value: "${EnvironmentName} Private Routes (AZ1)"
        - 
          Key: Env
          Value: EnvironmentName
      VpcId: VPC
    Type: "AWS::EC2::RouteTable"
  PrivateSubnet: 
    Properties: 
      AvailabilityZone: 
        - 0
      CidrBlock: PrivateSubnetCIDR
      MapPublicIpOnLaunch: false
      Tags: 
        - 
          Key: Name
          Value: "${EnvironmentName} Private Subnet (AZ1)"
        - 
          Key: Env
          Value: EnvironmentName
      VpcId: VPC
    Type: "AWS::EC2::Subnet"
  PublicRouteTable: 
    Properties: 
      Tags: 
        - 
          Key: Name
          Value: "${EnvironmentName} Public Routes"
        - 
          Key: Env
          Value: EnvironmentName
      VpcId: VPC
    Type: "AWS::EC2::RouteTable"
  PublicSubnet: 
    Properties: 
      AvailabilityZone: 
        - 0
      CidrBlock: PublicSubnetCIDR
      MapPublicIpOnLaunch: true
      Tags: 
        - 
          Key: Name
          Value: "${EnvironmentName} Public Subnet (AZ1)"
        - 
          Key: Env
          Value: EnvironmentName
      VpcId: VPC
    Type: "AWS::EC2::Subnet"
  VPC: 
    Properties: 
      CidrBlock: VpcCIDR
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags: 
        - 
          Key: Name
          Value: EnvironmentName
        - 
          Key: Env
          Value: EnvironmentName
    Type: "AWS::EC2::VPC"

您有三个不同的错误。


第一个:

WobblelandSecurityGroup CREATE_FAILED Value of property GroupName must be of type String

这是因为 GroupName 属性 的类型不正确;我想你想要:

  GroupName: !Join
    - "-"
    - - Wobbleland-security-group
      - dev

第二个:

PrivateSubnet CREATE_FAILED Properties validation failed for resource PrivateSubnet with message: #/AvailabilityZone: expected type: String, found: JSONArray

这是因为 AvailabilityZone 属性 的类型不正确;我想你想要:

AvailabilityZone: !Select [ 0, !GetAZs ]

第三个:

InternetGateway CREATE_FAILED Properties validation failed for resource InternetGateway with message: #: extraneous key [KeyName] is not permitted

这是因为 KeyName 不是此资源的有效 属性。您可以从文档中找到更多关于哪些密钥资源支持的信息;在这种情况下,this page.