Сделать создание VPC необязательным - PullRequest
1 голос
/ 26 марта 2019

Я пытаюсь сделать создание VPC условным в моем скрипте облачной информации.Например, если в параметрах указан идентификатор VPC, я хочу создать все ресурсы в этом VPC, в противном случае создать новый.

Проблема начинается, когда я хочу повторно использовать существующий VPC, но у меня нет способа определить подсети, которые мне нужны для одного из моих ресурсов.Итак, я полагаю, я должен предоставить их в качестве параметров.Но если я предоставлю их в качестве параметров, в случае, когда я хочу создать новый VPC, он будет жаловаться, потому что список идентификаторов подсетей пуст и должен быть действительным.

Ошибка Parameter validation failed: parameter value for parameter name VpcPrivateSubnetIds does not exist. Rollback requested by user. Невозможно указать фиктивное значение.Есть идеи, как этого добиться?

Вот мой сценарий 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]]]

1 Ответ

0 голосов
/ 26 марта 2019

Одним из решений может быть обработка параметров subnetId как строки, которую затем можно оставить пустой. (но пользователю придется вручную вводить список идентификаторов подсети при наличии VPC).

Если список не пустой (используется существующий VPC), используйте Пользовательский ресурс 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

Пожалуйста, обратите внимание, что я отметил, что этот скрипт проверен, поэтому вам, возможно, придется внести некоторые исправления.

...