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はなんと無くわかったので、後は実践するのみですね。

AWS ECSを始める

ECSとはDockerを簡単に実行、停止、管理できるサービス

management console ECS

Task Definition
create task definition -> EC2 -> json

{
  "family": "myContainer",
  "containerDefinitions": [
    {
      "volumesFrom": [],
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "command": null,
      "environment": [],
      "essential": true,
      "entryPoint": null,
      "links": [],
      "mountPoints": [
        {
          "containerPath": "/usr/local/apache2/htdocs",
          "sourceVolume": "my-vol",
          "readOnly": null
        }
      ],
      "memory": 300,
      "name": "simple-app",
      "cpu": 10,
      "image": "httpd:2.4"
    },
    {
      "volumesFrom": [
        {
          "readOnly": null,
          "sourceContainer": "simple-app"
        }
      ],
      "portMappings": [],
      "command": [
        "/bin/sh -c \"while true; do echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>' > top; /bin/date > date ; echo '</div></body></html>' > bottom; cat top date bottom > /usr/local/apache2/htdocs/index.html ; sleep 1; done\""
      ],
      "environment": [],
      "essential": false,
      "entryPoint": [
        "sh",
        "-c"
      ],
      "links": [],
      "mountPoints": [],
      "memory": 200,
      "name": "busybox",
      "cpu": 10,
      "image": "busybox"
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": null
      },
      "name": "my-vol"
    }
  ]
}

create

### Cluster
ECS Cluster -> Create
Launch type: EC2

Jsonでupdateできる。
とりあえず触ってみたという感じか。

Getting startedでECSを触ってみる