Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使VPC创建成为可选的_Amazon Web Services_Amazon Cloudformation_Amazon Vpc - Fatal编程技术网

Amazon web services 使VPC创建成为可选的

Amazon web services 使VPC创建成为可选的,amazon-web-services,amazon-cloudformation,amazon-vpc,Amazon Web Services,Amazon Cloudformation,Amazon Vpc,我试图在我的cloudformation脚本中设置创建VPC的条件。例如,如果参数中提供了VPC id,则我希望创建此VPC中的所有资源,否则创建一个新资源 当我想重用现有的VPC时,问题就开始了,但我无法推断出我的一个资源所需要的子网。所以我想,我必须提供它们作为参数。但是如果我提供它们作为参数,在我想要创建一个新的VPC的情况下,它会抱怨,因为子网ID列表是空的,必须是有效的 错误为参数验证失败:参数名称VpcPrivateSubnetIds的参数值不存在。用户请求回滚。不可能给出任何伪值。

我试图在我的cloudformation脚本中设置创建VPC的条件。例如,如果参数中提供了VPC id,则我希望创建此VPC中的所有资源,否则创建一个新资源

当我想重用现有的VPC时,问题就开始了,但我无法推断出我的一个资源所需要的子网。所以我想,我必须提供它们作为参数。但是如果我提供它们作为参数,在我想要创建一个新的VPC的情况下,它会抱怨,因为子网ID列表是空的,必须是有效的

错误为
参数验证失败:参数名称VpcPrivateSubnetIds的参数值不存在。用户请求回滚。
不可能给出任何伪值。有什么办法可以做到这一点吗

以下是我的CF脚本:

VpcId:
  Type: String
  Description: Give the VPC id if you want to use an existing one. Leave empty for creating a new one.

VpcPublicSubnetIds:
  Type: List<AWS::EC2::Subnet::Id>
  Description: List of 3 public SubnetIds for the given VPC. 

VpcPrivateSubnetIds:
  Type: List<AWS::EC2::Subnet::Id>
  Description: List of 3 private SubnetIds for the given VPC. 


Conditions:
  CreateVPC: !Equals [ !Ref VpcId, ""]


Resources: 
  (...)
    Properties:
      PrivateSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PrivateSubnets
        - !Join [',', [!Select [0, !Ref VpcPrivateSubnetIds], !Select [1, !Ref VpcPrivateSubnetIds], !Select [2, !Ref VpcPrivateSubnetIds]]]
      PublicSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PublicSubnets
        - !Join [',', [!Select [0, !Ref VpcPublicSubnetIds], !Select [1, !Ref VpcPublicSubnetIds], !Select [2, !Ref VpcPublicSubnetIds]]]
VpcId:
类型:字符串
描述:如果要使用现有专有网络id,请提供专有网络id。留空以创建新的。
VpcPublicSubnetIds:
类型:列表
描述:给定VPC的3个公共子网列表。
VPCPrivate子网:
类型:列表
描述:给定VPC的3个专用子网列表。
条件:
CreateVPC:!等于[!Ref VpcId,“]
资源:
(...)
特性:
私有子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PrivateSubnet
- !加入[',',[!选择[0,!Ref-VpcPrivateSubnetIds],!选择[1,!Ref-VpcPrivateSubnetIds],!选择[2,!Ref-VpcPrivateSubnetIds]]
公共子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PublicSubnets
- !加入[',',[!选择[0,!Ref VpcPublicSubnetIds],!选择[1,!Ref VpcPublicSubnetIds],!选择[2,!Ref VpcPublicSubnetIds]]

一种解决方案是将
子网
参数视为字符串,然后将其保留为空。(但当VPC存在时,用户必须手动输入子网id列表)

如果列表不是空的(要使用的现有VPC),请使用lambda将字符串(逗号分隔)转换为列表并返回到cloudformation以用于资源创建。所以你的堆栈看起来像

Parameters:
  VpcId:
    Type: String
    Description: Give the VPC id if you want to use an existing one. Leave empty for creating a new one.
  VpcPublicSubnetIds:
    Type: String
    Description: List of 3 public SubnetIds for the given VPC.
    Default: ''
  VpcPrivateSubnetIds:
    Type: String
    Description: List of 3 private SubnetIds for the given VPC.
    Default: ''
Conditions:
  CreateVPC: !Equals [ !Ref VpcId, ""]
  CreateList: !Not [!Equals [ !Ref VpcId, ""]]
Resources:
  CreateList:
    Type: AWS::CloudFormation::CustomResource
    Condition: CreateList
    Properties:
      ServiceToken:<some token>
      Public: !Ref VpcPublicSubnetIds
      Private: !Ref VpcPrivateSubnetIds
  SomeResource:
    Properties:
      PrivateSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PrivateSubnets
        - !GetAtt CreateList.PrivateSubnetIds
      PublicSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PublicSubnets
        - !GetAtt CreateList.PublicSubnetIds
参数:
VpcId:
类型:字符串
描述:如果要使用现有专有网络id,请提供专有网络id。留空以创建新的。
VpcPublicSubnetIds:
类型:字符串
描述:给定VPC的3个公共子网列表。
默认值:“”
VPCPrivate子网:
类型:字符串
描述:给定VPC的3个专用子网列表。
默认值:“”
条件:
CreateVPC:!等于[!Ref VpcId,“]
CreateList:!不[!等于[!Ref VpcId,“]]
资源:
创建列表:
类型:AWS::CloudFormation::CustomResource
条件:CreateList
特性:
ServiceToken:
公众:!Ref VpcPublicSubnetIds
二等兵:!Ref VPCPrivate子网
一些资源:
特性:
私有子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PrivateSubnet
- !GetAtt CreateList.PrivateSubnetIds
公共子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PublicSubnets
- !GetAtt CreateList.PublicSubnetIds

请注意,我已对该脚本进行了Notes验证,因此您可能需要进行一些更正。

一种解决方案是将
子网
参数视为字符串,然后将其保留为空。(但当VPC存在时,用户必须手动输入子网id列表)

如果列表不是空的(要使用的现有VPC),请使用lambda将字符串(逗号分隔)转换为列表并返回到cloudformation以用于资源创建。所以你的堆栈看起来像

Parameters:
  VpcId:
    Type: String
    Description: Give the VPC id if you want to use an existing one. Leave empty for creating a new one.
  VpcPublicSubnetIds:
    Type: String
    Description: List of 3 public SubnetIds for the given VPC.
    Default: ''
  VpcPrivateSubnetIds:
    Type: String
    Description: List of 3 private SubnetIds for the given VPC.
    Default: ''
Conditions:
  CreateVPC: !Equals [ !Ref VpcId, ""]
  CreateList: !Not [!Equals [ !Ref VpcId, ""]]
Resources:
  CreateList:
    Type: AWS::CloudFormation::CustomResource
    Condition: CreateList
    Properties:
      ServiceToken:<some token>
      Public: !Ref VpcPublicSubnetIds
      Private: !Ref VpcPrivateSubnetIds
  SomeResource:
    Properties:
      PrivateSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PrivateSubnets
        - !GetAtt CreateList.PrivateSubnetIds
      PublicSubnetIds: !If
        - CreateVPC
        - !GetAtt VPCStack.Outputs.PublicSubnets
        - !GetAtt CreateList.PublicSubnetIds
参数:
VpcId:
类型:字符串
描述:如果要使用现有专有网络id,请提供专有网络id。留空以创建新的。
VpcPublicSubnetIds:
类型:字符串
描述:给定VPC的3个公共子网列表。
默认值:“”
VPCPrivate子网:
类型:字符串
描述:给定VPC的3个专用子网列表。
默认值:“”
条件:
CreateVPC:!等于[!Ref VpcId,“]
CreateList:!不[!等于[!Ref VpcId,“]]
资源:
创建列表:
类型:AWS::CloudFormation::CustomResource
条件:CreateList
特性:
ServiceToken:
公众:!Ref VpcPublicSubnetIds
二等兵:!Ref VPCPrivate子网
一些资源:
特性:
私有子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PrivateSubnet
- !GetAtt CreateList.PrivateSubnetIds
公共子网:!如果
-创建专有网络
- !GetAtt VPCStack.Outputs.PublicSubnets
- !GetAtt CreateList.PublicSubnetIds
请注意,我已对该脚本进行了Notes验证,因此您可能需要进行一些更正。

到目前为止,我找到的唯一“解决方案”是在执行脚本时提供一些虚拟现有子网,这些子网在执行后会被忽略,只是为了不让字段变空唯一的“解决方案”到目前为止,我发现在执行它时会给出一些虚拟的现有子网,这些子网在执行之后会被忽略,只是为了不让字段为空