运行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地址发生变化,也不需要进行应用程序的连接地址更改。