こちらの記事 で AWS の基礎をある程度把握できた気がするので、以下のような構成のサンプルアプリを作ってみることにしました。アプリ自体は、「Web画面で入力したコメントをDBに登録する」だけの超シンプルなものです。

最終的には、以下のようにいろんなサービスを一通り使ってみる予定です。なかなか大変そうですが、頑張っていきたいと思います。

今回(part1)では、赤枠部分(VPC を作成し、RDS で MariaDB のデータベースを作成して、テーブルを作成するところ)までをやってみたいと思います。

今回利用するサービス

  • Amazon VPC
    • 今回のシステムを構成するコンポーネント全体を所属させる Virtual Private Cloud を作成する
    • 特定IPアドレスからの RDS へのアクセス、https アクセスのみ公開する
  • Amazon RDS
    • 今回は MariaDBを使ってみる
    • commentsというテーブルを作るだけ

VPCの作成

こちら を参考に、プライベートサブネットおよびパブリックサブネットを持つ VPC を作成したいと思います。
プライベートサブネットにはDBなどを、パブリックサブネットにはWebサーバなどを割り当てる想定です。

Elastic IP コンソール で Elastic IP アドレスを取得する

  • Elastic IP アドレスの割り当てをクリック
  • パブリック IPv4 アドレスプールAmazon の IPv4 アドレスプールを選択
  • 割り当てをクリックすると、アドレスを取得できる
  • ちなみに、アドレス一つであれば無料らしい

パブリックとプライベート サブネットを持つ VPC を作成

  • VPC コンソールVPC ウィザードを起動でウィザードを開始する
  • パブリックとプライベート サブネットを持つ VPCを選択
  • デフォルト値から以下を修正して、VPC の作成を実行
    • VPC 名: sample-vpc
    • パブリックサブネットのアベイラビリティーゾーン: us-west-2a
    • パブリックサブネット名: sample-public-subnet
    • プライベートサブネットのアベイラビリティーゾーン: us-west-2a
    • プライベートサブネット名: sample-private-subnet
    • Elastic IP 割り当て ID: 先ほど作成した Elastic IP アドレスのID

同じルートテーブルを利用するプライベートサブネットを追加

  • VPC コンソール > サブネット > サブネットを作成 でサブネット作成画面を表示し、以下を入力してサブネットを作成
    • VPC ID: 先ほど作成した VPC のID
    • サブネット名: sample-private-subnet2
    • アベイラビリティーゾーン: us-west-2b
    • IPv4 CIDR ブロック: 10.0.2.0/24
  • 二つのプライベートサブネットが同じルートテーブルを利用するようにする
    • 一つ目のサブネット(sample-private-subnet)のルートテーブルの値をコピー
    • 二つ目のサブネットの詳細画面のルートテーブルタブで、ルートテーブルの関連付けを編集をクリックし、ルートテーブル IDに先ほどコピーした値を設定して保存

プライベートサブネットのルートテーブルを編集して、インターネットゲートウェイ経由でアクセスするようにする

  • 【重要】 チュートリアルにはないがインターネット経由でRDSにアクセスする場合は、この設定が必須
  • VPC コンソール > サブネット > sample-private-subnetのルートテーブルリンク
  • ルートタブ > ルートの編集
  • 送信先: 0.0.0.0/0, ターゲット: igw-xxxx(Internet Gateway)

パブリック WEB サーバーの VPC セキュリティグループを作成

  • VPC コンソール > セキュリティグループ > セキュリティグループを作成をクリック
  • 以下を入力して、セキュリティグループを作成
    • セキュリティグループ名: sample-public-securitygroup
    • 説明: for public access
    • VPC: 先ほど作成した VPC のID
    • インバウンドルール > ルールを追加
      • タイプ: HTTP, ソース: 任意の場所
      • タイプ: HTTPS, ソース:任意の場所

プライベート DB インスタンスの VPC セキュリティグループを作成

  • パブリック WEB サーバーと同じ手順でセキュリティグループを作成する
  • 入力パラメータは以下の通り
    • セキュリティグループ名: sample-private-securitygroup
    • 説明: for private access
    • VPC: 先ほど作成した VPC のID
    • インバウンドルール > ルールを追加
      • タイプ: MySQL/Aurora, ソース: sample-public-securitygroupのID
      • タイプ: MySQL/Aurora, ソース: マイIP

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

  • RDS コンソール > サブネットグループ > DB サブネットグループを作成
  • 以下を入力して作成
    • 名前: sample-db-subnet-group
    • 説明: Sample DB Subnet Group
    • VPC: 先ほど作成したsample-vpc
    • サブネットを追加
      • アベイラビリティーゾーン: us-west-2aus-west-2b
      • サブネット: 先ほど作成したsample-private-subnetsample-private-subnet2のID

思ったよりだいぶ大変でしたが、おそらくこれで VPC の設定は終わりのはず...
もし設定が足りてなければ後で追記します。

データベース作成

RDS コンソール から、データベースを作成して、テーブルを作成します。

データベース作成

今回は、MariaDBを使ってみることにしました。

  1. 「データベースの作成」ボタンからデータベース作成を開始する
  2. デフォルト値以外で以下を入力し、「データベースの作成」ボタンをクリックする(数分かかる)
    • 作成方法: 標準作成
    • エンジンのタイプ: MariaDB
    • DBインスタンスサイズ : 無料利用枠
    • DB インスタンス識別子: sample-database
    • マスタユーザ名: admin
    • パスワード: 適当な値(今回はとりあえずhogehoge
    • Virtual Private Cloud (VPC): 先ほど作成した sample-vpc
    • サブネットグループ: 先ほど作成した sample-db-subnet-group
    • パブリックアクセス可能: あり(今回は、ローカルPCからDBにアクセスしてテーブル等を作成する予定なので。なしのほうがセキュア)
    • VPC セキュリティグループ: 既存の選択で、先ほど作成したsample-private-securitygroupを選択
    • 最初のデータベース名: sampledb
  3. コンソールでデータベース設定を確認する
    • エンドポイント: sample-database.xxxx.us-west-2.rds.amazonaws.com
    • ポート: 3306
    • エンジンバージョン: 10.4.13
    • ARN: arn:aws:rds:us-west-2:xxxx:db:sample-database

Mac に MariaDB をインストール

brew update
brew info mariadb
brew install mariadb
mariadb --version
> mariadb  Ver 15.1 Distrib 10.5.9-MariaDB, for osx10.16 (x86_64) using readline 5.1

アクセス確認

以下のコマンドでアクセスできると思います。

mariadb -h sample-database.xxxx.us-west-2.rds.amazonaws.com -P 3306 -D sampledb -u admin -p

> Welcome to the MariaDB monitor.  Commands end with ; or \g.
> Your MariaDB connection id is 33
> Server version: 10.4.13-MariaDB-log Source distribution
> Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

とはいえ、初回うまく接続できない可能性があります。その場合は こちら を参考に一つ一つ設定を確認してみてください。

  • ERROR 2002 (HY000): Can't connect to MySQL server on 'sample-database.xxxx.us-west-2.rds.amazonaws.com' (36)
    • nslookup sample-database.xxxx.us-west-2.rds.amazonaws.comserver can't findエラー
      • エンドポイントのコピペミス
      • パブリックアクセシビリティがありになっていない(デフォルトはいいえ
    • telnet sample-database.xxxx.us-west-2.rds.amazonaws.com 3306 or nc sample-database.xxxx.us-west-2.rds.amazonaws.com 3306でエラー
      • セキュリティグループのインバウンド設定が足りない
      • ルートテーブルがInternet Gatewayを利用する設定になってない(デフォルトだとNAT Gateway利用)
      • ネットワーク ACL の設定で、ローカルPCからの経路を拒否している
  • ERROR 1045 (28000): Access denied for user 'admin'@'xx.xx.xx.xx' (using password: NO)
    • mariadbコマンドの-pオプションつけ忘れ
  • ERROR 1049 (42000): Unknown database 'sampledb'
    • RDS のデータベースを作成した際に、 Maria DB のデータベースを作成し忘れ。もしくはデータベース名をミスっている
      • mariadbコマンドの-Dオプションを削除して、SQLでデータベースを作成する
      • もしくは、RDS データベースを削除して作り直す。

テーブルの作成

今回は、idcommentの2カラムのcommentsテーブルを作りたいと思います。
ここまで来れば、テーブル作成自体は一瞬で完了ですね。

MariaDB [sampledb]> create table comments (
    id int auto_increment
    , comment text not null
    , primary key(id)
  );
Query OK, 0 rows affected (0.132 sec)

MariaDB [sampledb]> show columns from comments;
+---------+---------+------+-----+---------+----------------+
| Field   | Type    | Null | Key | Default | Extra          |
+---------+---------+------+-----+---------+----------------+
| id      | int(11) | NO   | PRI | NULL    | auto_increment |
| comment | text    | NO   |     | NULL    |                |
+---------+---------+------+-----+---------+----------------+
2 rows in set (0.114 sec)

さいごに

これで VPC を作成し、RDS で MariaDB のデータベースを作成して、テーブルを作成するところまでの作業が無事完了しました。
RDS にローカル PC から接続できない理由がわからず、時間がかかってしまいましたが、トラブルシューティングをやっているうちに VPC/サブネット/ルートテーブル/インターネットゲートウェイ/セキュリティグループあたりの理解が深まって逆に良かった気がします。
逆に、RDS の方は、あまり難しいところもなく、すんなり導入できたので理解が甘い感じはあります。

次回は、
「EKS で API サーバを立てて、RDS のテーブルにデータを追加する」
ところまでをやってみたいと思います。

Posted in: aws