Help us understand the problem. What is going on with this article?

EC2インスタンスでDBを運用する際にやっておいたこと

More than 1 year has passed since last update.

諸所の事情があり、EC2インスタンス上にDBを構築し運用するシチュエーションがあると思います。
このような場合、いくつかのチーム(や会社)で共同開発しているなど、一つのDBを共有出来ないような場合、
DBの更新(データなど)があった場合に、更新を起こったDBでAMIを作成し全体に配布することで、
DBのバージョン、スキーマ、データの統一性を割と安易に取れるのかなと思います。

また、EC2インスタンスのDBへ接続するアプリケーションでは、
EC2インスタンス自体にEIPを設定することで、パブリックIPアドレスを固定化することは出来ますが、DBへ接続するアプリケーションがパブリックIPアドレスへ接続するとなると、セキュリティグループの設定などをする必要が出てきます。
ですので、一般的にはDBインスタンスをプライベートなサブネットに配置し、プライベートな口に接続させるのではないかと思います。

EC2インスタンスをCloudFormationで起動

CloudFormationでEC2インスタンスをデプロイさせる場合、以下のようなテンプレートファイルから起動させることでEC2インスタンスのプライベートIPを固定(172.31.46.80)させ起動させることが可能です。

mariadb-instance.yml
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アドレスを接続先として、都度アプリケーションのDB接続先の変更が必要になってしまいます。

インスタンスの更新が発生した場合

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

CloudFormatinoが、途中でエラーが発生しロールバックが走ります。

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で利用するテンプレートファイルに Route53HostedZoneRecordSet を追加します。
HostedZone のドメイン何でもいいですが、今回は instance.local としています。また、プライベートで利用するため、VPCを指定しています。VPCを指定しない場合はパブリックな HostedZone になります。
RecordSet はAレコードを作成します。サブドメインは db.instance.local とし、ResourceRecords にインスタンスのプライベートIPアドレスを指定しています。

また、インスタンスの PrivateIpAddress は使わないように、コメントアウトや削除するなりして下さい。

mariadb-instance.yml
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アドレスが変更することになっても、アプリケーションからの接続先の変更をする必要がなくなります。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした