[Go言語] jet,patを使った書き方 : static追加

$ tree
├── cmd
│   └── web
│   ├── main.go
│   └── routes.go
├── go.mod
├── go.sum
├── html
│   └── home.jet
├── internal
│   └── handlers
│   └── handlers.go
└── static
├── script.js
└── style.css

routes.go

package main

import (
	"webapp/internal/handlers"
	"net/http"

	"github.com/bmizerany/pat"
)

func routes() http.Handler {
	mux := pat.New()

	mux.Get("/", http.HandlerFunc(handlers.Home))

	fileServer := http.FileServer(http.Dir("./static/"))
	mux.Get("/static/", http.StripPrefix("/static", fileServer))
	return mux
}

home.jet

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<link rel="stylesheet" href="/static/style.css">
</head>
<body>
	<h1>jet test</h1>
	<script src="/static/scripts.js"></script>
</body>
</html>

scripts.js

alert("js is read")

sytle.css

h1 {
	color: orange;
}

なるほど

[Go言語] jetを使ったテンプレート・Handlers

$ go mod init webapp
$ mkdir -p cmd/web
$ mkdir -p internal/handlers
$ mkdir html
$ touch cmd/web/main.go
$ touch cmd/web/routes.go
$ touch html/home.jet
$ touch internal/handlers/handlers.go

home.jetは、Webページのテンプレートファイル
home.jet

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	<h1>jet test</h1>
</body>
</html>

handlers.go

package handlers

import (
	"log"
	"net/http"

	"github.com/CloudyKit/jet/v6"
)

var views = jet.NewSet(
	jet.NewOSFileSystemLoader("./html"),
	jet.InDevelopmentMode(),
)

func Home(w http.ResponseWriter, r *http.Request){
	err := renderPage(w, "home.jet", nil)
	if err != nil {
		log.Println(err)
	}
}

func renderPage(w http.ResponseWriter, tmpl string, data jet.VarMap) error {
	view, err := views.GetTemplate(tmpl)
	if err != nil {
		log.Println(err)
		return err
	}

	err = view.Execute(w, data, nil)
	if err != nil {
		log.Println(err)
		return err
	}
	return nil
}

route.go

package main

import (
	"webapp/internal/handlers"
	"net/http"

	"github.com/bmizerany/pat"
)

func routes() http.Handler {
	mux := pat.New()

	mux.Get("/", http.HandlerFunc(handlers.Home))
	return mux
}

main.go

package main

import (
	"log"
	"net/http"
)

func main(){
	mux := routes()
	log.Println("Starting web server on port 8080")

	_ = http.ListenAndServe(":8080", mux)
}

$ go run cmd/web/*.go

Echoとかを使わずに、jetなど色々な書き方があるんやな
Webサーバーの作成には、bmizerany/patモジュールを使用

[TypeScript] jQueryを使いたい

$ npm install –save jquery @types/jquery

tsconfig.json

"allowSyntheticDefaultImports": true,    
"esModuleInterop": true, 

app.ts

import $ from 'jquery';

$('input[name=password_change]').on('change', function(){
    if($('.changeterm').hasClass('displaynone')){
        $('.changeterm').removeClass('displaynone');
    } else {
        $('.changeterm').addClass('displaynone');
    }           
});

OK いい感じ

[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を作れば良いのだな。