amazon-web-services - Cloudformation - 将多个堆栈连接在一起

标签 amazon-web-services amazon-ec2 aws-cloudformation

我已经创建了堆栈 VPC、ec2-instance 和 rds。我已成功将 ec2-instance 与 VPC 模板连接,但我面临的问题是如何将 rds 与 vpc 和 ec2-instance 两者连接。我想将 SubnetB 分配给 vpc 模板中的 rds,并将 webserver 分配给 rds 的安全组。

专有网络模板

---
AWSTemplateFormatVersion: 2010-09-09
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 11.0.0.0/16
      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: 11.0.1.0/24
      MapPublicIpOnLaunch: true
  SubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: us-east-2a
      VpcId: !Ref VPC
      CidrBlock: 11.0.0.0/24
      MapPublicIpOnLaunch: false
  RouteTable:
    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
  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
Outputs:
  vpcID:
    Description: VPC id
    Value: !Ref VPC
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-VpcID"
  PublicSubnet:
    Description: public subnet
    Value: !Ref SubnetA
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-PublicSubnet"
   Public1Subnet:
    Description: public1 subnet
    Value: !Ref SubnetB
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-Public1Subnet"

EC2 模板:

---
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  SourceStackName:
    Description: "Source stack name"
    Type: String
    AllowedPattern: "^[a-zA-Z][-a-zA-Z0-9]*$"
    Default: "shifa-vpc"
Resources:
  webserver:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: sg-webserver
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
          Description: For traffic from Internet
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
          Description: For traffic from Internet
      GroupDescription: Security Group for demo server
      VpcId:
        Fn::ImportValue:
          Fn::Sub: "${SourceStackName}-VpcID"
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-2a
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: "true"
            VolumeSize: "8"
            VolumeType: gp2
      ImageId: ami-0bdcc6c05dec346bf
      InstanceType: t2.micro
      IamInstanceProfile: !Ref ListS3BucketsInstanceProfile
      KeyName: ky-webserver
      NetworkInterfaces:
        - Description: Primary network interface
          DeviceIndex: 0
          SubnetId:
            Fn::ImportValue:
              Fn::Sub: "${SourceStackName}-PublicSubnet"
          GroupSet:
            - Ref: sg-webserver
Outputs:
  ec2:
    Description: ec2
    Value: !Ref server
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-server"

Rds 模板

---
AWSTemplateFormatVersion: 2010-09-09
Resources:  
  MyDB:
      Type: AWS::RDS::DBInstance
      DependsOn: myDBSubnetGroup
      Properties:
        VPCSecurityGroups:
          - !Ref DBEC2SecurityGroup
        AllocatedStorage: "5"
        DBInstanceClass: db.t2.micro
        Engine: MySQL
        EngineVersion: "5.7.22"
        DBName: shifadb
        MasterUsername: shifadb
        MasterUserPassword: shifa123a
        MultiAZ: false
        DBSubnetGroupName: MySubnetGroup
    myDBSubnetGroup:
      Properties:
        DBSubnetGroupName: MySubnetGroup
        DBSubnetGroupDescription: subnet group
        SubnetIds:
          - !Ref SubnetA
          - !Ref SubnetB
      Type: "AWS::RDS::DBSubnetGroup"
    DBEC2SecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Open database for access
        VpcId: !Ref VPC
        SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 3306
            ToPort: 3306
            SourceSecurityGroupId: !Ref webserver

我已经了解了如何将一个模板与一个模板连接起来。但将 rds 模板与 2 个模板连接时遇到问题。

最佳答案

模板中存在多个错误。我全部修复,现在它们已部署。我在 us-east-1 区域验证,因此我必须修改它们才能在该区域工作。如果您需要不同区域,则需要进行相应更改。

你可以研究一下模板,你就会知道如何“将多个堆栈连接在一起”。

此外,我没有更改它们的功能,例如如果您可以从实例连接到 rds。我只验证了部署过程。

专有网络

---
AWSTemplateFormatVersion: 2010-09-09
Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 11.0.0.0/16
      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-1a
      VpcId: !Ref VPC
      CidrBlock: 11.0.1.0/24
      MapPublicIpOnLaunch: true
  SubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: us-east-1b
      VpcId: !Ref VPC
      CidrBlock: 11.0.0.0/24
      MapPublicIpOnLaunch: false
  RouteTable:
    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
  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
Outputs:
  vpcID:
    Description: VPC id
    Value: !Ref VPC
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-VpcID"
  PublicSubnet:
    Description: public subnet
    Value: !Ref SubnetA
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-PublicSubnet"
  Public1Subnet:
    Description: public1 subnet
    Value: !Ref SubnetB
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-Public1Subnet"


ec2

---
AWSTemplateFormatVersion: 2010-09-09
Parameters:
  SourceStackName:
    Description: "Source stack name"
    Type: String
    AllowedPattern: "^[a-zA-Z][-a-zA-Z0-9]*$"
    Default: "shifa-vpc"
Resources:
  webserver:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: webserver-sg
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
          Description: For traffic from Internet
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
          Description: For traffic from Internet
      GroupDescription: Security Group for demo server
      VpcId:
        Fn::ImportValue:
          Fn::Sub: "${SourceStackName}-VpcID"
  EC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            DeleteOnTermination: "true"
            VolumeSize: "8"
            VolumeType: gp2
      ImageId: ami-09d95fab7fff3776c # ami-0bdcc6c05dec346bf
      InstanceType: t2.micro
      #IamInstanceProfile: !Ref ListS3BucketsInstanceProfile
      #KeyName: ky-webserver
      NetworkInterfaces:
        - Description: Primary network interface
          DeviceIndex: 0
          SubnetId:
            Fn::ImportValue:
              Fn::Sub: "${SourceStackName}-PublicSubnet"
          GroupSet:
            - !Ref webserver
Outputs:
  ec2:
    Description: ec2
    Value: !Ref EC2Instance
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-server"

  sgGroupId:
    Description: ec2
    Value: !GetAtt webserver.GroupId
    Export:
      Name:
        Fn::Sub: "${AWS::StackName}-sgid"        

rds

---
AWSTemplateFormatVersion: 2010-09-09

Parameters:
  SourceStackName:
    Description: "Source stack name"
    Type: String
    AllowedPattern: "^[a-zA-Z][-a-zA-Z0-9]*$"
    Default: "shifa-vpc"

  Ec2StackName:
    Description: "Ec2 Source stack name"
    Type: String
    AllowedPattern: "^[a-zA-Z][-a-zA-Z0-9]*$"
    Default: "ec2"    

Resources:  
  MyDB:
      Type: AWS::RDS::DBInstance
      DependsOn: myDBSubnetGroup
      Properties:
        VPCSecurityGroups:
          - !Ref DBEC2SecurityGroup
        AllocatedStorage: "5"
        DBInstanceClass: db.t2.micro
        Engine: MySQL
        EngineVersion: "5.7.22"
        DBName: shifadb
        MasterUsername: shifadb
        MasterUserPassword: shifa123a
        MultiAZ: false
        DBSubnetGroupName: !Ref myDBSubnetGroup
  myDBSubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupName: MySubnetGroup
      DBSubnetGroupDescription: subnet group
      SubnetIds:
        - Fn::ImportValue:
            Fn::Sub: "${SourceStackName}-PublicSubnet"
        - Fn::ImportValue:
            Fn::Sub: "${SourceStackName}-Public1Subnet"
  DBEC2SecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Open database for access
      VpcId: 
        Fn::ImportValue:
          Fn::Sub: "${SourceStackName}-VpcID"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 3306
          ToPort: 3306
          SourceSecurityGroupId: 
            Fn::ImportValue:
              Fn::Sub: "${Ec2StackName}-sgid"


关于amazon-web-services - Cloudformation - 将多个堆栈连接在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62722556/

相关文章:

python lambda无法检测打包的模块

php - 无法更改 phpmyadmin 的时区

amazon-web-services - 在 AWS 的 EC-2 实例中的 IIS 上配置免费 SSL 证书

amazon-s3 - AWS 云形成 : Creating S3 bucket with credential outputs and CORS does not work

amazon-web-services - AWS Cloudformation - 使用安全组名称创建 EC2 实例

c# - 在 IIS 下运行时无法连接到 Elasticsearch(访问 key 和 secret 不被尊重)

amazon-web-services - AWS CloudFormation 配置... UserData 与 Ansible 之类的?

azure-devops - azure pipeline 步骤 - 如何在进一步的任务中使用 CreateStack cloudformation 模板输出

node.js - 结合使用AWS Lambda和Elastic Search,从搜索客户端获取未定义

Hadoop 包 : how to specify a region? 中的 hadoop-ec2