运行EC2实例时进行的操作,以用于运行数据库的处理

由于各种原因,可能存在在EC2实例上构建和运营数据库的情况。
在这种情况下,例如在多个团队(或公司)中进行共同开发,无法共享一个数据库的情况下,
如果数据库有更新(如数据等),可以通过在进行更新的数据库上创建AMI并分发给所有人来相对轻松地实现数据库版本、架构和数据的一致性。

此外,在连接EC2实例的数据库应用程序中,可以通过为EC2实例本身设置EIP来固定其公共IP地址,但是如果应用程序要连接到公共IP地址上的数据库,则需要进行安全组等设置。
因此,通常情况下,我认为应该将数据库实例放置在私有子网中,并连接到私有接口上。

使用CloudFormation启动EC2实例

如果要在CloudFormation中部署EC2实例,可以通过以下模板文件来启动,并将EC2实例的私有IP固定为172.31.46.80,从而实现启动。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  MariaDbAmi:
    Type: String
    Default: ami-98765432109876543

Resources:
  MariaDbInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref MariaDbAmi
      InstanceType: t2.medium
      SecurityGroupIds:
        - sg-10293847561029384
      PrivateIpAddress: 172.31.46.80
      Tags:
        - Key: Name
          Value: MariaDbInstance
aws cloudformation create-stack \
  --stack-name mariadb-instance \
  --template-body file://mariadb-instance.yml

如果不固定私有IP地址,那么在实例启动时自动分配的私有IP地址将成为连接目标,并且每次都需要更改应用程序的数据库连接目标。

如果发生了实例的更新

如果有mariadb-instance.yml文件,你可以按照以下方式指定新实例的AMI(ami-01234567890123456),然后执行CloudFormation堆栈的更新。但是,如果固定了私有IP地址,那么

aws cloudformation update-stack \
  --stack-name mariadb-instance \
  --parameters ParameterKey=MariaDbAmi,ParameterValue=ami-01234567890123456 \
  --template-body file://mariadb-instance.yml

CloudFormation在途中发生错误并执行回滚。

Address 172.31.46.80 is in use. (Service: AmazonEC2; Status Code: 400; Error Code: InvalidIPAddress.InUse; Request ID: 9ce599e8-0317-44d2-9f84-77038eea6819)

因为CloudFormation会在需要更新实例的堆栈更新时,新建一个实例,如果没有问题,就会终止现有的实例。
换言之,这个时候会导致私有IP地址重复,所以在这种情况下,继续使用相同的私有IP地址会变得困难。

私人主机区域的设置

在这里是私有主机区域。
在CloudFormation中,我们将在模板文件中添加Route53的HostedZone和RecordSet。
HostedZone的域名可以任意选择,但在这次示例中我们选择了instance.local。另外,为了私有使用,我们指定了VPC。如果不指定VPC,将会是一个公共的HostedZone。
RecordSet将创建一个A记录。子域名将设置为db.instance.local,并在ResourceRecords中指定实例的私有IP地址。

而且,请在代码中注释掉或删除Instance的PrivateIpAddress。

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  MariaDbAmi:
    Type: String
    Default: ami-98765432109876543
  VPCRegion:
    Description: VPCRegion
    Type: String
    Default: ap-northeast-1

Resources:
  MariaDbInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref MariaDbAmi
      InstanceType: t2.medium
      SecurityGroupIds:
        - sg-10293847561029384
      #PrivateIpAddress: 172.31.46.80
      Tags:
        - Key: Name
          Value: MariaDbInstance
  HostedZone:
    Type: AWS::Route53::HostedZone
    Properties:
      Name: instance.local
      VPCs:
        - VPCId: vpc-abcdefgh
          VPCRegion: !Ref VPCRegion
  RecordSet:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Ref HostedZone
      Name: db.instance.local
      Type: A
      TTL: 60
      ResourceRecords:
        - !GetAtt MariaDbInstance.PrivateIp
aws cloudformation update-stack \
  --stack-name mariadb-instance \
  --template-body file://mariadb-instance.yml

这将更新实例并使其能够通过在私有主机区域创建的域名(db.instance.local)进行连接。

最后,如果需要对实例进行修改。

aws cloudformation update-stack \
  --stack-name mariadb-instance \
  --parameters ParameterKey=MariaDbAmi,ParameterValue=ami-01234567890123456 \
  --template-body file://mariadb-instance.yml

在堆栈更新后,实例已经更新,并且能够顺利通过 db.instance.local 进行连接。

总结

只要在应用程序中指定了此私有主机区域的域名,即使实例进行了更新并且私有IP地址发生变化,也不需要进行应用程序的连接地址更改。

广告
将在 10 秒后关闭
bannerAds