【问题标题】:AWS CloudFomation: fail to create RDS resource alongside with ElasticBeanstalkAWS CloudFormation:无法与 ElasticBeanstalk 一起创建 RDS 资源
【发布时间】:2020-12-12 09:49:07
【问题描述】:

我正在使用 CloudFormation 将我的 Laravel 应用程序部署到 AWS。我正在创建一个 ElasticBeanstalk 资源和一个 RDS 数据库资源。但是当我尝试部署它时,我的模板无法创建 RDS 数据库资源。

这是我的模板。

AWSTemplateFormatVersion: '2010-09-09'
Description: "Pathein Directory web application deployment template."
Parameters:
  KeyName:
    Default: 'PatheinDirectory'
    Type: String
  InstanceType:
    Default: 't2.micro'
    Type: String
  SSHLocation:
    Description: The IP address range that can be used to SSH to the EC2 instances
    Type: String
    MinLength: '9'
    MaxLength: '18'
    Default: 0.0.0.0/0
    AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
    ConstraintDescription: Must be a valid IP CIDR range of the form x.x.x.x/x
  DBInstanceIdentifier:
    Type: String
  DBName:
    Type: String
  DBUsername:
    Type: String
  DBClass:
    Type: String
    Default: 'db.t2.micro'
  DBAllocatedStorage:
    Type: String
    Default: '5'
  DBPassword:
    Type: String

Mappings:
  Region2Principal:
    us-east-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    us-west-2:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    us-west-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    eu-west-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    eu-west-2:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    eu-west-3:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-southeast-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-northeast-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-northeast-2:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-northeast-3:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-southeast-2:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ap-south-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    us-east-2:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    ca-central-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    sa-east-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    cn-north-1:
      EC2Principal: ec2.amazonaws.com.cn
      OpsWorksPrincipal: opsworks.amazonaws.com.cn
    cn-northwest-1:
      EC2Principal: ec2.amazonaws.com.cn
      OpsWorksPrincipal: opsworks.amazonaws.com.cn
    eu-central-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com
    eu-north-1:
      EC2Principal: ec2.amazonaws.com
      OpsWorksPrincipal: opsworks.amazonaws.com

Resources:
  WebServerSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security Group for EC2 instances
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '80'
          ToPort: '80'
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp:
            Ref: SSHLocation

  DBSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Database security group
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '3306'
          ToPort: '3306'
          SourceSecurityGroupId: !Ref WebServerSecurityGroup

  WebDatabase:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceIdentifier: !Ref DBInstanceIdentifier
      DBName: !Ref DBName
      DBInstanceClass: !Ref DBClass
      AllocatedStorage: !Ref DBAllocatedStorage
      Engine: MySQL
      MasterUsername: !Ref DBUsername
      MasterUserPassword: !Ref DBPassword
      VPCSecurityGroups:
        - !Ref DBSecurityGroup

这是我在日志中遇到的错误。

 {
            "StackId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/566c9fa0-e55d-11ea-a9aa-06d4f42323aa",
            "EventId": "630d0ba0-e55d-11ea-ad8b-06dbc2ac1616",
            "StackName": "patheindirectory",
            "LogicalResourceId": "patheindirectory",
            "PhysicalResourceId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/566c9fa0-e55d-11ea-a9aa-06d4f42323aa",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "2020-08-23T16:26:24.461000+00:00",
            "ResourceStatus": "ROLLBACK_IN_PROGRESS",
            "ResourceStatusReason": "The following resource(s) failed to create: [DBSecurityGroup]. . Rollback requested by user."
        },
        {
            "StackId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/566c9fa0-e55d-11ea-a9aa-06d4f42323aa",
            "EventId": "DBSecurityGroup-CREATE_FAILED-2020-08-23T16:26:23.732Z",
            "StackName": "patheindirectory",
            "LogicalResourceId": "DBSecurityGroup",
            "PhysicalResourceId": "patheindirectory-DBSecurityGroup-1CEIY8676LHK2",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2020-08-23T16:26:23.732000+00:00",
            "ResourceStatus": "CREATE_FAILED",
            "ResourceStatusReason": "Invalid id: \"patheindirectory-WebServerSecurityGroup-188BHLOGKHGJ\" (expecting \"sg-...\") (Service: AmazonEC2; Status Code: 400; Error Code: InvalidGroupId.Malformed; Request ID: c2bd97d8-b31b-
4024-8bc2-6eb34cdf873e)",
            "ResourceProperties": "{\"GroupDescription\":\"Database security group\",\"SecurityGroupIngress\":[{\"FromPort\":\"3306\",\"ToPort\":\"3306\",\"IpProtocol\":\"tcp\",\"SourceSecurityGroupId\":\"patheindirectory-WebServerS
ecurityGroup-188BHLOGKHGJ\"}]}"
        },

我该如何解决?

我还尝试将 WebDatabase 的 VPCSecurityGroups 更改为 !GetAtt DBSecurityGroup.GroupId。这次我得到了以下错误。

{
            "StackId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/6c67eb50-e5e6-11ea-add8-0236eb75a142",
            "EventId": "79c7afb0-e5e6-11ea-af24-06a6741d3858",
            "StackName": "patheindirectory",
            "LogicalResourceId": "patheindirectory",
            "PhysicalResourceId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/6c67eb50-e5e6-11ea-add8-0236eb75a142",
            "ResourceType": "AWS::CloudFormation::Stack",
            "Timestamp": "2020-08-24T08:47:43.645000+00:00",
            "ResourceStatus": "ROLLBACK_IN_PROGRESS",
            "ResourceStatusReason": "The following resource(s) failed to create: [DBSecurityGroup]. . Rollback requested by user."
        },
        {
            "StackId": "arn:aws:cloudformation:eu-west-1:733553390213:stack/patheindirectory/6c67eb50-e5e6-11ea-add8-0236eb75a142",
            "EventId": "DBSecurityGroup-CREATE_FAILED-2020-08-24T08:47:42.895Z",
            "StackName": "patheindirectory",
            "LogicalResourceId": "DBSecurityGroup",
            "PhysicalResourceId": "patheindirectory-DBSecurityGroup-182TKIWG65TDC",
            "ResourceType": "AWS::EC2::SecurityGroup",
            "Timestamp": "2020-08-24T08:47:42.895000+00:00",
            "ResourceStatus": "CREATE_FAILED",
            "ResourceStatusReason": "Invalid id: \"patheindirectory-WebServerSecurityGroup-JHXG6FOXICS3\" (expecting \"sg-...\") (Service: AmazonEC2; Status Code:
400; Error Code: InvalidGroupId.Malformed; Request ID: 1384f7a7-ee62-4b93-a291-28a460e9d1da)",
            "ResourceProperties": "{\"GroupDescription\":\"Database security group\",\"SecurityGroupIngress\":[{\"FromPort\":\"3306\",\"ToPort\":\"3306\",\"IpProto
col\":\"tcp\",\"SourceSecurityGroupId\":\"patheindirectory-WebServerSecurityGroup-JHXG6FOXICS3\"}]}"
        },

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-rds


    【解决方案1】:

    您正在引用安全组的逻辑 ID(即其名称)。

    SourceSecurityGroupIdVPCSecurityGroups 的参数都需要安全组 ID。

    为此,您需要使用安全组的GroupId 属性,如以下更新的模板所示。

    AWSTemplateFormatVersion: '2010-09-09'
    Description: "Pathein Directory web application deployment template."
    Parameters:
      KeyName:
        Default: 'PatheinDirectory'
        Type: String
      InstanceType:
        Default: 't2.micro'
        Type: String
      SSHLocation:
        Description: The IP address range that can be used to SSH to the EC2 instances
        Type: String
        MinLength: '9'
        MaxLength: '18'
        Default: 0.0.0.0/0
        AllowedPattern: "(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})/(\\d{1,2})"
        ConstraintDescription: Must be a valid IP CIDR range of the form x.x.x.x/x
      DBInstanceIdentifier:
        Type: String
      DBName:
        Type: String
      DBUsername:
        Type: String
      DBClass:
        Type: String
        Default: 'db.t2.micro'
      DBAllocatedStorage:
        Type: String
        Default: '5'
      DBPassword:
        Type: String
    
    Mappings:
      Region2Principal:
        us-east-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        us-west-2:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        us-west-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        eu-west-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        eu-west-2:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        eu-west-3:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-southeast-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-northeast-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-northeast-2:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-northeast-3:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-southeast-2:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ap-south-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        us-east-2:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        ca-central-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        sa-east-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        cn-north-1:
          EC2Principal: ec2.amazonaws.com.cn
          OpsWorksPrincipal: opsworks.amazonaws.com.cn
        cn-northwest-1:
          EC2Principal: ec2.amazonaws.com.cn
          OpsWorksPrincipal: opsworks.amazonaws.com.cn
        eu-central-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
        eu-north-1:
          EC2Principal: ec2.amazonaws.com
          OpsWorksPrincipal: opsworks.amazonaws.com
    
    Resources:
      WebServerSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: Security Group for EC2 instances
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: '80'
              ToPort: '80'
              CidrIp: 0.0.0.0/0
            - IpProtocol: tcp
              FromPort: '22'
              ToPort: '22'
              CidrIp:
                Ref: SSHLocation
    
      DBSecurityGroup:
        Type: AWS::EC2::SecurityGroup
        Properties:
          GroupDescription: Database security group
          SecurityGroupIngress:
            - IpProtocol: tcp
              FromPort: '3306'
              ToPort: '3306'
              SourceSecurityGroupId: !GetAtt WebServerSecurityGroup.GroupId
    
      WebDatabase:
        Type: AWS::RDS::DBInstance
        Properties:
          DBInstanceIdentifier: !Ref DBInstanceIdentifier
          DBName: !Ref DBName
          DBInstanceClass: !Ref DBClass
          AllocatedStorage: !Ref DBAllocatedStorage
          Engine: MySQL
          MasterUsername: !Ref DBUsername
          MasterUserPassword: !Ref DBPassword
          VPCSecurityGroups:
            - !GetAtt DBSecurityGroup.GroupId
    

    同样作为对模板的建议,对于某些参数(例如键名),您可以使用AWS Specific Parameter Types。此外,对于密码等安全信息,请在参数中使用NoEcho 属性。

    【讨论】:

    • 嗨,我用过这个,但还是失败了。
    • 它对我有用,您能分享一下您现在收到的错误消息吗?
    • 嗨,我已经更新了我的问题。请看一看。谢谢。
    • 您是否使用了我在答案中包含的确切模板? :)
    • 很高兴我能帮上忙 :)
    猜你喜欢
    • 2020-11-15
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2017-06-08
    • 1970-01-01
    • 2020-01-28
    • 2019-08-31
    相关资源
    最近更新 更多