AWS Aurora PostgreSQL 使ってみた

# 初めに

Aurora を使う機会があったので自分なりに触ってみたことのメモです。

# データベースの作成

マネジメントコンソールから「データベースの作成」をクリックし、作成方法とエンジンのタイプを選択します。エディションは PostgreSQL 互換を選択します。

![create-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/883f241c-37ce-e45a-2288-14e409155083.png)

エンジンバージョンは最新の 13.6 を選択します。検証用なのでテンプレートは「開発/テスト」を選択します。

![create-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/c234f52a-52fc-05ec-f4b6-2f085bf377bb.png)

以下、必要な情報を入力します。認証情報はログイン時に必要になります。

![create-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/cbfc344f-3536-9ee5-be9d-cdafd59fed75.png)

検証用のため、汎用の小さいインスタンスタイプを選択します。

![create-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/4db34abc-3b8e-22f8-f650-6c663b93a34e.png)

VPC などは適切なものを選択します。

![create-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/cd501753-5b4d-df4b-1f2e-5a292701ab03.png)

以下はデフォルトのまま進めます。

![create-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/449bac2a-5c41-1943-3bab-e66f53273e39.png)

データベース名はデフォルトで作成されるデータベースです。空欄にすると作成されません。ログイン後、手動で作成するので空欄にします。

![create-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/1a452a22-7eda-1e8c-340b-1fff60d3088c.png)

検証用ため、暗号化や Perfomance Insight や無効化しておきます。

![create-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/3c00ff13-cdfe-f991-ef0b-2cae76edbdbc.png)

メンテナンスウィンドウを「選択ウィンドウ」にすると、メンテナンス期間をカスタマイズできます。

![create-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/87105d85-ac46-6165-63d1-0caae8151955.png)

「データベースの作成」をクリックします。

![create-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/b9f62a07-1af7-b857-50e8-a74eaf6fc14e.png)

# Aurora データベース に接続する

## Aurora クラスターのエンドポイントを取得する

ライターインスタンスのエンドポイントをコピーします。

![connect-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/59d9db14-2bbb-c304-36b9-80136fad078e.png)

## PostgreSQL クライアントのインストール

- PostgreSQL クライアントをインストールする

```
sudo amazon-linux-extras install -y postgresql13
```

なお、特定のバージョンでインストールし直したいときは以下の手順で行います。`postgresql13` をアンインストールし、`postgresql12` をインストールします。

- `postgresql13` クライアントをアンインストールする

```
sudo yum remove $(yum list installed | grep amzn2extra-postgresql13 | awk '{ print $1 }')
```

- アンインストールされたことを確認する

```
[ec2-user@ip-172-31-8-7 ~]$ psql
-bash: /usr/bin/psql: No such file or directory
```

- `amazon-linux-extras` でインストール可能なトピックを確認する

```
[ec2-user@ip-172-31-8-7 ~]$ amazon-linux-extras list | grep 'postgresql'
  5  postgresql9.6            available    \
  6  postgresql10             available    [ =10  =stable ]
 41  postgresql11             available    [ =11  =stable ]
 58  postgresql12             available    [ =stable ]
 59  postgresql13=latest      enabled      [ =stable ]
```

- `postgresql13` トピックを非有効化する

```
sudo amazon-linux-extras disable postgresql13
```

- `postgresql12` クライアントをインストールする

```
sudo amazon-linux-extras install -y postgresql12
```

※非有効化しない状態で `postgresql12` をインストールしても、`postgresql13` がインストールされます。

```
[ec2-user@ip-172-31-8-7 ~]$ psql --version
psql (PostgreSQL) 13.3
```

## サーバにログインする

- `psql` コマンドでサーバにログインする。パスワードを聞かれるので入力する。
  - [psql](https://www.postgresql.jp/document/13/html/app-psql.html)
  - `-h` ・・・ サーバのホスト名
  - `-p` ・・・ ポート番号
  - `-U` ・・・ ログインユーザー名
  - `-d` ・・・ 接続先データベース

```
psql -h database-1-instance-1.xxxxxxxx.ap-northeast-1.rds.amazonaws.com -p 5432 -U postgres -d postgres
```

## CRUD - 例

- DB を作成する
  - [CREATE DATABASE](https://www.postgresql.jp/document/13/html/sql-createdatabase.html)

```
postgres=> CREATE DATABASE mydb;
CREATE DATABASE
postgres=> \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 mydb      | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 rdsadmin  | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0 | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin          +
           |          |          |             |             | rdsadmin=CTc/rdsadmin
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(5 rows)
```

- DB を切り替える

```
postgres=> \c mydb
```

- テーブルを作成する。（大文字でテーブル名を作成したい場合、ダブルクォーテーションで囲う）
  - [CREATE TABLE](https://www.postgresql.jp/document/13/html/sql-createtable.html)
  - 作成した後、`\d` でテーブル一覧を表示する。

```
mydb=> CREATE TABLE "movies" (
  title  varchar(100) PRIMARY KEY,
  year   integer
);
CREATE TABLE
mydb=> \d
         List of relations
 Schema |  Name  | Type  |  Owner
--------+--------+-------+----------
 public | movies | table | postgres
(1 row)
```

- 行を挿入する
  - [INSERT](https://www.postgresql.jp/document/13/html/sql-insert.html)

```
mydb=> INSERT INTO movies (title, year) VALUES ('Fight Club', 1999);
INSERT 0 1
mydb=> INSERT INTO movies VALUES ('Frozen', 2013);
INSERT 0 1
```

- テーブルの全データを表示する
  - [SELECT](https://www.postgresql.jp/document/13/html/sql-select.html)

```
mydb=> SELECT * FROM movies;
   title    | year
------------+------
 Fight Club | 1999
 Frozen     | 2013
(2 rows)
```

- テーブルの全行を削除する
  - [DELETE](https://www.postgresql.jp/document/13/html/sql-delete.html)

```
mydb=> DELETE FROM movies;
DELETE 2
```

- テーブルを削除する
  - [DROP TABLE](https://www.postgresql.jp/document/13/html/sql-droptable.html)

```
mydb=> DROP TABLE movies;
DROP TABLE
mydb=> \d
Did not find any relations.
```

- ログアウト

```
mydb=> \q
```

# スナップショットの取得・復元

「スナップショットの取得」をクリックします。

![snapshot-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/3b14db00-fb74-a5b6-dbeb-2fc36b15afb2.png)

必要な情報を入力し、「スナップショットの取得」をクリックします。

![snapshot-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/dccdac5a-8dc2-c38c-9c4b-09786c429a81.png)

復元する場合は、復元したいスナップショットを選択し、「スナップショットを復元」をクリックします。

![snapshot-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/50b72f72-88db-ab39-137e-bc89c18ab847.png)

識別子を入力します。

![snapshot-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/64252a7c-01dd-e06b-b0c5-a3f6e7fc10e2.png)

インスタンスタイプを選択します。

![snapshot-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/cce79755-ae29-667e-b77a-defce3a076bf.png)

最後に「DB クラスターを復元」をクリックします。

# CloudFormation で Aurora PostgreSQl を作成

CloudFormation で Aurora PostreSQL を作成しました。

```aurora-template.yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  AuroraCluster:
    Type: 'AWS::RDS::DBCluster'
    Properties:
      Engine: aurora-postgresql
      EngineMode: provisioned
      EngineVersion: '13.6'
      MasterUsername: postgres
      MasterUserPassword: PostgresAdmin1!
  AuroraInstance:
    Type: 'AWS::RDS::DBInstance'
    Properties:
      Engine: aurora-postgresql
      DBInstanceClass: db.t3.medium
      DBClusterIdentifier: !Ref AuroraCluster
```

以下はテンプレートの実行結果です。

![cfn-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/b5f599b5-6508-b484-492f-b4811bf7906f.png)

# 参考記事

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Connecting.html#Aurora.Connecting.AuroraPostgreSQL

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-rds-dbcluster.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-rds-database-instance.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-ami-basics.html

https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-install-extras-library-software/

https://www.postgresql.jp/document/13/html/index.html