☁️

[AWS]EC2からプライベートサブネットのRDSへ接続する

2022/06/01に公開

はじめに

今回はパブリックサブネットのEC2からプライベートサブネットのRDSへ接続する方法についてご紹介します.
この記事を読んでいただければVPCの作成からRDSへの接続までできるようになっています.RDSへの接続方法だけ知りたい方は「接続する」というところからお読みください.

イメージは以下の図のようになります.


AWS構成のイメージ

準備

VPC、サブネットの作成

まず、VPCやサブネットなどを作成していきます.

VPC、サブネットとは

VPC

VPCとは、Virtual Private Cloudの略でAWSアカウント内に構築できる仮想ネットワークのことです.VPCの中で今回使用するEC2やRDSなどが動作します.

サブネット

サブネットとはVPCによって作られたCIDRブロックを分割したネットワーク群のことです.サブネットには、後ほど出てくるパブリックサブネットやプライベートサブネットがあります.このような設定をすることで外部からのアクセスの制御が可能になります.

手順は以下になります.

  1. VPCの作成
  2. 作成するリソースでVPC、サブネットなどを選択
  3. 名前の設定をする
  4. アベイラビリティーゾーン(AZ)は2にする
  5. DNSホスト名を無効化


設定画面

下部のVPCを作成というボタンを押せば画像の右側のような構成でVPCやサブネットなどが自動的に生成されます.
今回は簡単のためこのような方法でVPCやサブネットを作成していますが、実際に使う場合はそれぞれ必要な設定を行い作成してください.

セキュリティグループの作成

EC2のセキュリティグループの作成

手順は以下です.

  1. セキュリティグループの作成
  2. 名前、説明の設定
  3. VPCは先ほど作成したものを選択

    VPCの選択
  4. インバウンドルールを画像のように設定する

    インバウンドルールの設定

RDSのセキュリティグループの作成

手順はEC2のセキュリティグループとほとんど同じで、以下のようになります.

  1. セキュリティグループの作成
  2. 名前、説明の設定
  3. VPCは先ほど作成したものを選択

    VPCの選択
  4. インバウンドルールを画像のように設定する

    インバウンドルールの設定

DBサブネットグループの作成

次に、DBサブネットグループを作成します.手順は以下です.

  1. DBサブネットグループの作成
  2. 名前、説明の設定
  3. VPCは先ほど作成したものを選択

    VPCの選択
  4. AZを選択
    VPC作成時に使われた2つを選択する
  5. サブネットの選択
    作成されたサブネット(プライベート2、パブリック2)のうち、プライベートサブネットを選択する.

    AZ、サブネットの選択
    なお、VPC->サブネットから下の画像のようにどのサブネットがプライベートかを確認することができます.

    作成されたサブネットの一覧

EC2インスタンスの作成

EC2のインスタンスを作成します.手順は以下です.

  1. インスタンスを起動
  2. OSイメージはAmazon Linux 2を選択(無料枠)
  3. キーペアを作成

    キーペアの作成
  4. ネットワーク設定の編集
    VPCは先ほど作成したものを選択
    サブネットはパブリックサブネットを選択
    パブリックIPの自動割り当ては有効化
    既存のセキュリティーグループを選択する -> 先ほど作成したEC2用のセキュリティグループを選択

    ネットワークの設定

RDSの作成

手順は以下です.

  1. データベースの作成
  2. データベースはMySQLを選択(無料枠を使用)
  3. DBインスタンス識別子、マスターユーザー名、パスワードを設定

    設定
  4. 接続の設定
    VPCは今回作成したものを設定
    サブネットグループ、セキュリティグループはRDS用に作成したものを設定
    AZを設定

    接続の設定
    なお、触れていない部分はデフォルトのままで問題ありません.

接続する

まず、EC2インスタンスに接続します.インスタンスを選択し、「接続」というボタンを押します.

EC2への接続方法
遷移先に接続方法が書いてあるので先ほど作成したkeyを使って接続してください.

接続できたら以下のようになると思います.

$ ssh -i .ssh/zenn-test.pem ec2-user@(ec2インスタンスのパブリックIP)

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
2 package(s) needed for security, out of 6 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-10-120 ~]$

また、今回はDockerを使用し、GitHubリポジトリのプロジェクトをデプロイするので以下の手順で必要なものをインストールしてください.

  1. まず、ymuのアップデートを行う
[ec2-user@ip-10-0-10-120 ~]$ sudo yum update
  1. gitのインストール
[ec2-user@ip-10-0-10-120 ~]$ sudo yum install git
  1. Docker関連の設定
[ec2-user@ip-10-0-10-120 ~]$ sudo yum install docker
[ec2-user@ip-10-0-10-120 chat-app]$ sudo service docker start
Redirecting to /bin/systemctl start docker.service
[ec2-user@ip-10-0-10-120 chat-app]$ sudo usermod -a -G docker ec2-user
  1. docker-composeのインストール
[ec2-user@ip-10-0-10-120 ~]$ sudo curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
[ec2-user@ip-10-0-10-120 ~]$ sudo chmod +x /usr/local/bin/docker-compose
[ec2-user@ip-10-0-10-120 ~]$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
  1. MySQLのインストール
[ec2-user@ip-10-0-10-120 ~]$ sudo yum install mysql

次に、GitHubのリポジトリをクローンします.
このリポジトリはDjangoで作成しており、MySQLを使用するように設定してあります.今回はDjangoでMySQLを使用する方法などについて紹介はしません.

最後に、EC2内のDjangoプロジェクトからRDSへ接続する設定です.
まず、Djangoでの設定は以下のようになっています.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'test',
        'USER': os.environ.get('MYSQL_USER'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD'),
        'HOST': os.environ.get('MYSQL_HOST'),
        'PORT': 3306,
    }
}

次に、EC2内のプロジェクトに以下のような.envファイルを追加します.

MYSQL_USER=admin
MYSQL_PASSWORD=xxxxx <- DB作成時に設定したパスワード
MYSQL_HOST=xxxxx <- DBのエンドポイント

SECRET_KEY=xxxxx

DBのエンドポイントは以下のように確認できます.

DBのエンドポイント

次に、MySQLにデータベースを作成します.
まず、以下のようにしてMySQLにログインします.

[ec2-user@ip-10-0-10-120 ~]$ mysql -u admin -p -h xxxxx <- DBのエンドポイント

ログインできたら以下のようにデータベースを作成します.

MySQL [(none)]> create database test;

後は、Djangoプロジェクトを立ち上げるだけでEC2からRDSに接続することができます.

まとめ

以上がEC2からRDSに接続する方法でした.

手順を簡略化しているところもありますので実際に使用する際はそれぞれの設定が必要かとは思いますが、参考になれば幸いです.

少し長くなってしまいましたが、最後までご覧いただきありがとうございました!

Discussion