Используйте Qa, Dev и Prod как среду в Cloudformation - PullRequest
0 голосов
/ 05 августа 2020

Я создал этот вложенный стек. Я хочу реализовать тот же стек со средой {prod, dev, qa}. Как будто я хочу поднять один и тот же стек, но у него нет конфликтов имен друг с другом. Я хочу развернуть один и тот же стек в трех разных средах. Какие изменения мне нужно сделать для его достижения?

Root:

---
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  bucketname:
    Type: String
    Description: Path to the bucket
    Default: webserver
  bucketpath:
    Type: String
    Description: Path to the bucket
    Default: /env #/mysql
  Env:
    Type: String
    Description: Select the appropriate environment
    AllowedValues:
      - dev
      - test
      - uat
      - prod
  Cidr:
    Type: String
    Description: Cidr for vpc
  
  Publicsubnet1:
    Type: String
    Description: public subnet 1

  Publicsubnet2:
    Type: String
    Description: public subnet 2
  
  Privatesubnet1:
    Type: String
    Description: Private subnet 1

  Privatesubnet2:
    Type: String
    Description: Private subnet 2


Resources:
      Vpcstack:
        Type: AWS::CloudFormation::Stack
        Properties:
          TemplateURL: !Sub "https://${bucketname}.s3.us-east-2.amazonaws.com${bucketpath}/vpc.yml"
          Parameters:  
            Env: Ref: Env
            Cidr: !Ref Cidr
            Publicsubnet1: !Ref Publicsubnet1
            Publicsubnet2: !Ref Publicsubnet2
            Privatesubnet1: !Ref Privatesubnet1
            Privatesubnet2: !Ref Privatesubnet2  

Vp c:

---
    AWSTemplateFormatVersion: 2010-09-09
    Parameters:
      Cidr:
        Type: String
        Description: Cidr for vpc
      
      Publicsubnet1:
        Type: String
        Description: public subnet 1
    
      Publicsubnet2:
        Type: String
        Description: public subnet 2
      
      Privatesubnet1:
        Type: String
        Description: Private subnet 1
    
      Privatesubnet2:
        Type: String
        Description: Private subnet 2
      
      Env:
        Type: String
        Description: Select the appropriate environment
    
    Resources:
    
      VPC:
        Type: AWS::EC2::VPC
        Properties:
          CidrBlock: !Ref Cidr
          EnableDnsSupport: true
          EnableDnsHostnames: true
          InstanceTenancy: default
      InternetGateway:
        Type: AWS::EC2::InternetGateway
      VPCGatewayAttachment:
        Type: AWS::EC2::VPCGatewayAttachment
        Properties:
          VpcId: !Ref VPC
          InternetGatewayId: !Ref InternetGateway
      SubnetA:
        Type: AWS::EC2::Subnet
        Properties:
          AvailabilityZone: us-east-2a
          VpcId: !Ref VPC
          CidrBlock: !Ref Publicsubnet1
          MapPublicIpOnLaunch: true
      SubnetB:
        Type: AWS::EC2::Subnet
        Properties:
          AvailabilityZone: us-east-2b
          VpcId: !Ref VPC
          CidrBlock: !Ref Publicsubnet2
          MapPublicIpOnLaunch: true
      SubnetC:
        Type: AWS::EC2::Subnet
        Properties:
          AvailabilityZone: us-east-2a
          VpcId: !Ref VPC
          CidrBlock: !Ref Privatesubnet1
          MapPublicIpOnLaunch: false
      SubnetD:
        Type: AWS::EC2::Subnet
        Properties:
          AvailabilityZone: us-east-2b
          VpcId: !Ref VPC
          CidrBlock: !Ref Privatesubnet2
          MapPublicIpOnLaunch: false
      RouteTable:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
      RouteTable2:
        Type: AWS::EC2::RouteTable
        Properties:
          VpcId: !Ref VPC
      InternetRoute:
        Type: AWS::EC2::Route
        DependsOn: VPCGatewayAttachment
        Properties:
          DestinationCidrBlock: 0.0.0.0/0
          GatewayId: !Ref InternetGateway
          RouteTableId: !Ref RouteTable
      SubnetARouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          RouteTableId: !Ref RouteTable
          SubnetId: !Ref SubnetA
      SubnetBRouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          RouteTableId: !Ref RouteTable
          SubnetId: !Ref SubnetB
      SubnetCRouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          RouteTableId: !Ref RouteTable2
          SubnetId: !Ref SubnetC
    
      SubnetDRouteTableAssociation:
        Type: AWS::EC2::SubnetRouteTableAssociation
        Properties:
          RouteTableId: !Ref RouteTable2
          SubnetId: !Ref SubnetD
      SecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupName: "Internet Group"
          GroupDescription: "SSH traffic in, all traffic out."
          VpcId: !Ref VPC
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: "22"
              ToPort: "22"
              CidrIp: 0.0.0.0/0
          SecurityGroupEgress:
            - IpProtocol: -1
              CidrIp: 0.0.0.0/0
      NAT:
        Type: AWS::EC2::NatGateway
        Properties:
          AllocationId:
            Fn::GetAtt:
              - EIP
              - AllocationId
          SubnetId:
            Ref: SubnetA
          Tags:
            - Key: Name
              Value: !Sub "nat-${Env}"
      EIP:
        DependsOn: VPCGatewayAttachment
        Type: AWS::EC2::EIP
        Properties:
          Domain: VPC
      Route:
        Type: AWS::EC2::Route
        Properties:
          RouteTableId:
            Ref: RouteTable2
          DestinationCidrBlock: 0.0.0.0/0
          NatGatewayId:
            Ref: NAT
    Outputs:
      VpcID:
        Description: VPC id
        Value: !Ref VPC
        Export:
          Name: "VpcID"
      SubnetA:
        Description: public subnet
        Value: !Ref SubnetA
        Export:
          Name: "SubnetA"
      SubnetB:
        Description: public subnet 2
        Value: !Ref SubnetB
        Export:
          Name: "SubnetB"
      SubnetC:
        Description: priavte subnet
        Value: !Ref SubnetC
        Export:
          Name: "SubnetC"
      SubnetD:
        Description: private subnet 2
        Value: !Ref SubnetD
        Export:
          Name: "SubnetD"
    

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Вы можете указать разные имена для ваших стеков верхнего уровня, добавив среду к имени стека верхнего уровня. Вы делаете это во время создания стека, через консоль или программно.

Затем, когда каждый стек c, специфичный для среды верхнего уровня, запускается, он создает необходимые вложенные стеки без конфликтов имен. Вы не сможете управлять именами стеков для вложенных стеков, но вы можете получить имя, используя выходы.

См. Следующее:

Вы можете добавлять выходные значения из вложенного стека внутри содержащего шаблона. Вы используете функцию GetAtt с логическим именем вложенного стека и именем выходного значения во вложенном стеке в формате Outputs.NestedStackOutputName.

Если вам нужно использовать разные значения ресурсов для разных сред, вы можете использовать сопоставления , чтобы указать настройки, соответствующие выбранной среде. Вот пример сопоставлений:

Mappings:
  EnvTypeMap:
    prod:
      vpc: vpc-a6842gb0
      subnet: subnet-hjk23553
    dev:
      vpc: vpc-b7742gb0
      subnet: subnet-abc23553
    qa:
      vpc: vpc-c2542gb0
      subnet: subnet-uio23553

Затем, чтобы ссылаться на одно из этих значений сопоставления, вы должны сделать это следующим образом:

VpcId: 
  Fn::FindInMap:
    - EnvTypeMap
    - Ref: Env
    - vpc
1 голос
/ 05 августа 2020

Стек CF идентифицируется по имени стека. Все, что вам нужно сделать, это указать это имя стека при развертывании шаблона CF.

aws cloudformation deploy --stack-name <value> --template-file <value> ...

Если вы укажете имя существующего стека, этот стек будет обновлен. Если вы укажете новое имя, вы создадите новый стек из заданного шаблона.

Вы можете создать столько стеков, сколько захотите, из одного шаблона, каждый раз выбирая новое имя стека. Вам не нужно беспокоиться о конфликтах именования, потому что имя каждого ресурса в данном стеке уникально идентифицируется на основе имени стека, которое будет отличаться.

aws cloudformation deploy --stack-name dev --template-file the-same-template.yaml ...
aws cloudformation deploy --stack-name test --template-file the-same-template.yaml ...
aws cloudformation deploy --stack-name uat --template-file the-same-template.yaml ...
aws cloudformation deploy --stack-name prod --template-file the-same-template.yaml ...

Это создаст 4 отдельных стека (dev, test, uat, prod).

Обратите внимание, что, поскольку вы жестко кодируете диапазоны IP-адресов, ресурсы в этих стеках не смогут обмениваться данными между собой из-за перекрытия сетей (что, вероятно, вы и так хотите), но если для по какой-то причине они нужны вам для связи, вам также потребуется создать Parameters для блоков CIDR (VP C, подсети).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...