[AWS RDS] Postgresを作成し、pg_dumpでbackupを取得する

### 前準備
VPC, subnetを作って、EC2の作成

### DB用のネットワーク作成
– Inbound rouleでPostgresとして、セキュリティグループはec2のセキュリティグループにする
 L これにより、ec2しかアクセスできないようになる

– EC2のVPCでpostgres用のsubnetを作成
 L 192.168.x.0/28とする

### RDSでpostgresの作成
– create database, postgres 13.3-R1
– db2.t.micro
– 作成に2~3分かかる。出来たら、endpointをメモ(hoge.fuga.ap-northeast-1.rds.amazonaws.com)

### EC2でpostgresのインストール
$ sudo yum update
$ sudo yum install -y postgresql.x86_64
// 接続
$ psql -h hoge.fuga.ap-northeast-1.rds.amazonaws.com -U root -d postgres
postgres=>

CREATE TABLE playground (
equip_id serial PRIMARY KEY,
type varchar (50) NOT NULL,
color varchar (25) NOT NULL,
location varchar(25) check (location in (‘north’, ‘south’, ‘west’, ‘east’, ‘northeast’, ‘southeast’, ‘southwest’, ‘northwest’)),
install_date date
);

INSERT INTO playground (type, color, location, install_date) VALUES (‘slide’, ‘blue’, ‘south’, ‘2022-04-28’);
INSERT INTO playground (type, color, location, install_date) VALUES (‘swing’, ‘yellow’, ‘northwest’, ‘2022-08-16’);

postgres=> SELECT * FROM playground;
equip_id | type | color | location | install_date
———-+——-+——–+———–+————–
1 | slide | blue | south | 2022-04-28
2 | swing | yellow | northwest | 2022-08-16

### バックアップの取得
$ sudo pg_dump -U root -h hoge.fuga.ap-northeast-1.rds.amazonaws.com -p 5432 postgres -f /home/ec2-user/test.sql
パスワード:
pg_dump: サーババージョン: 13.3、pg_dump バージョン: 9.2.24
pg_dump: サーババージョンの不整合のため処理を中断しています

なんやと! EC2のpostgresのバージョンをRDSのバージョンと合わせないといけないらしい

$ sudo yum install gcc
$ sudo yum install readline-devel
$ sudo yum install zlib-devel
$ cd /usr/local/src
$ sudo wget https://ftp.postgresql.org/pub/source/v13.3/postgresql-13.3.tar.gz
$ sudo tar -xvzf postgresql-13.3.tar.gz
$ cd postgresql-13.3
$ ./configure –prefix=/usr/local/postgresql-13.3/ –with-pgport=5432
$ make
$ sudo make install

再度バックアップの取得
$ /usr/local/postgresql-13.3/bin/pg_dump -U root -h hoge.fuga.ap-northeast-1.rds.amazonaws.com -p 5432 postgres -f /home/ec2-user/test.sql
$ cd /home/ec2-user/
$ ls
test.sql

うおおおおおおおおおおおおおおおおおおお
すげえ感動した

Postgresのデータバックアップとリストア

### tmpフォルダにバックアップ
pg_dump -U ユーザー名 –format=出力形式 –file=出力先 バックアップを取るDB名 と書く

$ sudo -i -u postgres
$ pg_dump –format=p –file=/tmp/test.sql postgres
$ exit
$ cd /tmp
$ ls

### restore
$ psql -f test.sql
$ psql
postgres=# \dt;

OK これをrdsから取得したい

RDSの場合は
$ pg_dump -U USER_NAME -h HOST_NAME -p port DATABASE_NAME -f FILE_NAME

なるほど、ほぼ一緒か。
RDSでpostgresを作成するところからかな。

Ubuntu20.04にPostgreSQLをinstall

### postgresql, pgadminのinstall
$ sudo apt-get install curl ca-certificates gnupg
$ curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add –
$ sudo sh -c ‘echo “deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main” > /etc/apt/sources.list.d/pgdg.list’
$ sudo apt update

$ sudo curl https://www.pgadmin.org/static/packages_pgadmin_org.pub | sudo apt-key add
$ sudo sh -c ‘echo “deb https://ftp.postgresql.org/pub/pgadmin/pgadmin4/apt/$(lsb_release -cs) pgadmin4 main” > /etc/apt/sources.list.d/pgadmin4.list && apt update’

$ sudo apt install postgresql-11 pgadmin4
$ psql -V
psql (PostgreSQL) 14.0 (Ubuntu 14.0-1.pgdg20.04+1)

### postアカウント
$ sudo -i -u postgres
$ psql
// 操作終了
postgres=# \q

// アカウントの切り替えなし
$ sudo -u postgres psql
// パスワード変更
$ ALTER USER postgres PASSWORD ‘hoge’;

### user作成
$ sudo -i -u postgres
$ createuser –interactive

### create table

CREATE TABLE playground (
    equip_id serial PRIMARY KEY,
    type varchar (50) NOT NULL,
    color varchar (25) NOT NULL,
    location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
    install_date date
);

postgres=# \d
List of relations
Schema | Name | Type | Owner
——–+————————-+———-+———-
public | playground | table | postgres
public | playground_equip_id_seq | sequence | postgres
(2 rows)

シーケンスなしの場合
postgres=# \dt

### insert
$ INSERT INTO playground (type, color, location, install_date) VALUES (‘slide’, ‘blue’, ‘south’, ‘2022-04-28’);
$ INSERT INTO playground (type, color, location, install_date) VALUES (‘swing’, ‘yellow’, ‘northwest’, ‘2022-08-16’);

$ SELECT * FROM playground;

### update
$ UPDATE playground SET color = ‘red’ WHERE type = ‘swing’;
$ DELETE FROM playground WHERE type = ‘slide’;

次はpostgresのデータバックアップとリストアの方法

Amazon OpenSearch Serviceを使いたい

Amazon OpenSearch Serviceは、旧Amazon Elasticsearch Service

create domain
– domain name: anything
– deployment type: deployment and test
– instance node: t2.small.search
– number of node: 1
– network: public access
createすると、domainが生成されます。

security policyのところがよくわからんが、ドキュメントが少なく、あまり使われてない印象か。。
さー、sqliteやりますか。

[AWS ECS]ローカルのimageの更新からECS更新までの流れ

### image更新してecrにpush
$ sudo docker run –publish=8080:80 hpscript_fixed
$ sudo docker cp src/index.html a59fc6eee21a:/var/www/html/index.html
$ sudo docker stop a59fc6eee21a
$ sudo docker ps -a
$ sudo docker commit serene_lamport hpscript_v3

$ sudo docker images
$ sudo docker tag hpscript_v3:latest ***.dkr.ecr.ap-northeast-1.amazonaws.com/hpscript:v3
$ sudo docker push ***.dkr.ecr.ap-northeast-1.amazonaws.com/hpscript:v3

### Task Definitions
Create new revisionでECRのレポジトリとtagを指定

### Clusterでserviceをupdate
既にあるtaskで80番ポートが使用されているので、既にあるtaskを削除して新しいtaskをrunしないといけない。
どうやってもダウンタイムは発生してしまう。

OK 次はOpenSearchをやろう

[AWS ECS] ECRのimageの使い方

### 前準備
ローカル(vagrant)のdocker imageをaws ECRにpush済の状態とします。

### ECS clusterの登録
cluster作成時にコンテナの登録で、ECRのimage:tagを登録する
***.dkr.ecr.ap-northeast-1.amazonaws.com/hpscript:latest
L container nameは任意の名前で良い

後は、通常のECRの作成の手順
– タスク定義の登録(コンテナの設定)
– タスクの実行環境となるクラスターの作成(EC2, VPC, セキュリティグループなど)
-サービスの作成(タスクとクラスターを紐づける)
EC2が生成される

後は、imageを更新する場合だな

docker imageをaws ecrにpushする手順

1.awsのECRでレポジトリを作成
2.ubuntuにawscliをインストール
$ sudo apt install awscli
$ pip3 install –upgrade awscli

3. AWS IAMでPowerAccessUser権限のユーザを作成し、access key id, secret access keyをコピー

4. cli configure設定
$ aws configure
AWS Access Key ID [None]: ***********
AWS Secret Access Key [None]: ***********
Default region name [None]: ap-northeast-1
Default output format [None]: json
$ cat ~/.aws/credentials

5. login
aws ecr get-login-password –region ap-northeast-1 | sudo docker login –username AWS –password-stdin ******.dkr.ecr.ap-northeast-1.amazonaws.com
Login Succeeded

6. タグ付け
$ sudo docker tag hpscript_test:latest ******.dkr.ecr.ap-northeast-1.amazonaws.com/hpscript:latest

7. push
$ sudo docker push ******.dkr.ecr.ap-northeast-1.amazonaws.com/hpscript:latest

ECR repositoryにpushされています

aws configureの設定をしないと以下のようなエラーが出るので注意
Unable to locate credentials. You can configure credentials by running “aws configure”.

後はECSでdefinitionとclusterを作成してserviceを作れば良いのだな。

docker imageの作成手順

### 前準備
ubuntu20.04にdockerがインストールされている状態

$ sudo docker pull centos/httpd
$ sudo docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos/httpd latest 2cc07fbb5000 2 years ago 258MB

ホストの8080ポートで起動
$ sudo docker run –publish=8080:80 centos/httpd

src/index.htmlファイルをコンテナのvar/www/htmlフォルダにコピー
$ sudo docker ps
$ sudo docker cp src/index.html 2d1b560b580e:/var/www/html/index.html

動作確認
http://192.168.34.10:8080/

$ sudo docker stop 2d1b560b580e
$ sudo docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2d1b560b580e centos/httpd “/run-httpd.sh” 7 minutes ago Exited (137) 11 seconds ago festive_sanderson

コンテナからimage作成
$ sudo docker commit festive_sanderson hpscript_test
$ sudo docker images;
REPOSITORY TAG IMAGE ID CREATED SIZE
hpscript_test latest 926a6d6c6a60 7 seconds ago 258MB
centos/httpd latest 2cc07fbb5000 2 years ago 258MB

OK
このイメージをAWS ECRにpushしたい。
やりたいことの1/3ぐらいは出来た。

ECSの登録方法

1.タスク定義の登録(コンテナの設定)
2.タスクの実行環境となるクラスターの作成(EC2, VPC, セキュリティグループなど)
3.サービスの作成(タスクとクラスターを紐づける)
4.EC2が生成される

コンテナの設定のところを、独自のコンテナで作りたい。
どうやらECRにimageをpushして、そのimageをそのまま使うようだ。

AWS ECRとは

ECSとはElastic Container Registryの略、Dockerのコンテナイメージを保存しておくレジストリ

Edit permission

$ chmod 400 KEYPAIR.pem
$ ssh -i KEYPAIR.pem ec2-user@PublicIP
$ docker pull amazon/amazon-ecs-sample
Using default tag: latest
latest: Pulling from amazon/amazon-ecs-sample
72d97abdfae3: Pull complete
9db40311d082: Pull complete
991f1d4df942: Pull complete
9fd8189a392d: Pull complete
Digest: sha256:36c7b282abd0186e01419f2e58743e1bf635808231049bbc9d77e59e3a8e4914
Status: Downloaded newer image for amazon/amazon-ecs-sample:latest
docker.io/amazon/amazon-ecs-sample:latest
$ REPOSITORY=your-repository-uri
$ docker tag amazon/amazon-ecs-sample:latest $REPOSITORY
$ EC2_REGION=`wget -q -O – http://169.254.169.254/latest/meta-data/placement/availability-zone | sed s/.$//`
$ `aws ecr get-login –region $EC2_REGION –no-include-email`
$ docker push $REPOSITORY

ECS
-> Task definition -> EC2

{
  "family": "ecs-demo",
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "memory": 128,
      "extraHosts": null,
      "dnsServers": null,
      "disableNetworking": null,
      "dnsSearchDomains": null,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80,
          "protocol": "tcp"
        }
      ],
      "hostname": null,
      "essential": true,
      "entryPoint": null,
      "mountPoints": [],
      "name": "ecs-sample",
      "ulimits": null,
      "dockerSecurityOptions": null,
      "environment": [],
      "links": null,
      "workingDirectory": null,
      "readonlyRootFilesystem": null,
      "image": "YOUR-REPOSITORY-URI:latest",
      "command": null,
      "user": null,
      "dockerLabels": null,
      "logConfiguration": null,
      "cpu": 0,
      "privileged": null
    }
  ],
  "volumes": []
}

ECSCluster

ECRからpushしてimageを作ることが出来る

なるほど、ECSとECRはなんと無くわかったので、後は実践するのみですね。