[GCP] GCEにGo Revelの環境を構築してデプロイ

### 環境構築
1.ローカルにGCloudをインストール
$ curl -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-363.0.0-linux-x86_64.tar.gz
$ tar -zxvf google-cloud-sdk-363.0.0-linux-x86_64.tar.gz
$ ./google-cloud-sdk/install.sh
$ ./google-cloud-sdk/bin/gcloud init
Your Google Cloud SDK is configured and ready to use!
$ pwd
/home/vagrant/gcp/

$ cd ~
$ sudo vi .bash_profile

source /home/vagrant/gcp/gcpgoogle-cloud-sdk/completion.bash.inc
source /home/vagrant/gcp/gcpgoogle-cloud-sdk/path.bash.inc
$ source ~/.bashrc

2.GCPでGCEの作成
Region: asia-northeast1(Tokyo)
Zone: asia-northeast1-a
Machine Series: E2
Machine Type: e2-micro(2 vCPU, 1GB memory)
Boot disk: Ubuntu20.04LTS ※defaultだとDebianになっているので、 ubuntuに変更する
Access Scope: Allow default access
Firewall: Allow HTTP traffic
-> create
-> 設定した内容で作られているかinstancesのviewで確認できる

gcloudによる接続確認
$ gcloud compute ssh instance-3

3.GCE(ubuntu20.04)にGoのインストール
$ sudo apt install golang-go
$ sudo apt-get install –reinstall ca-certificates
$ git config –global http.sslverify false
$ go get github.com/revel/revel
$ go get github.com/revel/cmd/revel
$ go get github.com/cbonello/revel-csrf
$ go get github.com/vansante/go-ffprobe
$ go get github.com/aws/aws-sdk-go
$ go get github.com/go-sql-driver/mysql

$ cd go/src/github.com
$ mkdir me

4.GCEにデプロイ
$ gcloud compute scp –recurse go/src/github.com/me/prd instance-3:/home/vagrant/go/src/github.com/me –zone asia-northeast1-a

5.GCEにmysqlインストール
$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql –defaults-file=/etc/mysql/debian.cnf
mysql> ALTER USER ‘root’@’localhost’ IDENTIFIED WITH mysql_native_password BY ‘${new password}’;
$ mysql -u root -p
mysql> create database test;
mysql> use test;

create table users(
id int primary key auto_increment,
name varchar(255) unique,
email varchar(255),
password varchar(255),
filepath varchar(255),
message text
);
insert user
mysql> insert into users(name, password) values (‘user1’, ‘5f4dcc3b5aa765d61d8327deb882cf99’);

sudo vi /home/vagrant/go/src/github.com/me/prd/conf/app.conf
http.port = 80

firewall設定
GCPホーム > ネットワーキング > VPCネットワーク > ファイアウォールルール

項目 入力例
名前 default-allow-9000
説明 Allow 9000 from anywhere
ログ オフ
ネットワーク default
優先度 1000
送信 / 受信 上り
一致したときのアクション 許可
ターゲット タグ use-9000
IP 範囲 0.0.0.0/0
プロトコルとポート tcp:9000

GCE
GCPホーム > コンピューティング > Compute Engine > VMインスタンス
ファイアウォール ネットワークタグ に先ほどのターゲットタグである「use-9000」追記

/home/vagrant/go/bin/revel run -a prd
${externalIP}:9000 で動作確認

ぎゃああああああああああああああああああああああああああああ

[GCP] Load balancerにより冗長化構成にする

1. Create Snapshot
cloneしたいGCEのsnapshotを作成する
source diskでinstanceを選択する

2. snapshotからCREATE INSTANCEでデータを復元
Boot diskがsnapshotとなる。
その他の設定は、入力していく。

3. Compute Engineのメニューからinstance groupの作成
L VMをtemplateではなく、一つ一つ指定する為、unmanaged instance groupにする
Name: instance-group-1
Location: multiple asia-northeast1-a (zoneが一つしか設定できない為、VMは同じゾーンの必要がある)
Network: default
Subnetwork: default
VM Instances: instance1, instance2

4. loadbalancerの作成
Network service -> Load blancing -> Create Load Balancer
HTTP(S) Load Balancingを選択する
Name: lb-1
Create backend service -> Name: lb-backend-service1
L Backendでinstance groupを選択する
L health-check1を作成する
Host and path ruleはURLによって振り分けることができる
Review and finalizeで確認してCreate
Create

5. LoadbalancerのIPを叩くと、接続される

6.(optional) LoadBalancerのipをCloud CDNに接続

一応、GCPの基礎は出来たかな。

7. SSL化
front-end configurationでprotocolをhttpsとし、ドメインを入力
nameはmanagedssl-sslcertなどにする

よっしゃあああああああああああああああああああああ

Google Siteでサイトを制作

Google Site
> 社内プロジェクトのハブサイト、チームサイト、一般公開のウェブサイトなどを、デザイナー、プログラマー、IT スタッフの力を借りずに構築できます。新しい Google サイトを使用すると、コンテンツを必要な場所にドラッグするだけで簡単にウェブサイトを構築できます。

サイトを簡単に構築できるのね。

1. サイト名を作成
-> 「hpscript」
2. ページのタイトル
-> 「音声認識アプリケーション」
3. レイアウトを選択
-> 2カラムの画像、テキストにします
4. 背景画像を変更

5. コンテンツ、ページを追加
6. サイトを公開
https://sites.google.com/view/hpscript/

他のサイトからのコンテンツ追加は、「埋め込む URL」もしくは「埋め込みコード」だけの様だな…
他でサーバーを立てて、読み込みって感じだろうか。

[画像認識] 非局所平均値フィルタを実装

$ pip3 install scikit-image

元画像

非局所平均値フィルタ

import numpy as np
import matplotlib.pyplot as plt
from skimage import img_as_float
from skimage.restoration import denoise_nl_means, estimate_sigma
from skimage.util import random_noise

img = plt.imread('src/face.jpg')
original = img_as_float(img)

sigma = 0.1
noisy = random_noise(original, var=sigma**2)

sigma_est = np.mean(estimate_sigma(noisy, multichannel=True))

patch_kw = dict(patch_size=5,	# ノイズ除去のパッチサイズ 5x5
				patch_distance=6, # パッチを検索する距離 13x13 searchera
				multichannel=True)

denoise = denoise_nl_means(original, h=1.15*sigma_est, fast_mode=False, **patch_kw) # hはカットオフ

fig, ax = plt.subplots(figsize=(8, 6.5), sharex=True, sharey=True)

ax.imshow(denoise)
ax.axis('off')
ax.set_title('ノイズ除去')

fig.tight_layout()
plt.savefig('local_denoise_mangf.jpg',dpi=100)

かなり綺麗になってるのはわかります。

[GCP] Cloud BuildでGithubからGCEにデプロイ

AWSのCode Deployの様に、GithubからGCEにdeployするのに、Git cloneではなくCloud Buildでデプロイをする

1. Cloud BuildでGithubの対象レポジトリをauthorizeする
2. IAMから、Cloud Buildのユーザ(*@cloudbuild.gserviceaccount.com)に、「Compute Admin」「Service Account User」の権限を付与する
3. cloudbuild.yamlにspcコマンドを書く

steps:
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args: ['compute', 'scp', '--recurse', 'index.html', 'instance-1:/var/www/html/index.html' , '--zone','asia-northeast1-a']

4. git pushすると、pushをtrigerにファイルがGCEにコピーされる

GCEのexternal ipを叩くと、pushした内容が反映されていることがわかる

cloud source repositoryは特に必要ないですね。。

全体は大分できてきた

あとはELBか…

[GCP] Cloud Source Repositoryを利用

1. Add a repositoryでConnect external repositoryを選択

2. Githubをaurthorizeする

3. Cloud Source Repositories APIをenableにする
 
4. RepositoryとConnectする

5. テキストを追加してGit push

<p>Paragraph added!</p>

$ git add .
$ git commit -m “text added”
$ git push -u origin master

6. Githubの変更が自動的に反映
Cloud Source Repositoryにミラーリングされているのがわかる

なるほど、githubみたいなもんだな
これをGCEにデプロイしたい

[GCP] お名前.comのドメインを使いたい

1. CloudDNSを開く

2. Create DNS Zone
zone name: test
dns name: ${お名前.comのdomain}
DNSSEC: off

3. Create A record
GCEのExternal IPをIPv4 Addressに割り当てる

4. GCP DNSのNSをお名前.comの対象ドメインに割り当てる
ns-cloud-e1.googledomains.com.
ns-cloud-e2.googledomains.com.
ns-cloud-e3.googledomains.com.
ns-cloud-e4.googledomains.com.

5. GCEにapache2をインストール
$ ssh ${external ip} -i id_rsa
$ sudo apt update
$ sudo apt install apache2
$ sudo systemctl status apache2
$ sudo systemctl enable apache2

// NS反映までしばらく待ちます。

6. 動作確認
– GCEのExternal IPを叩いて、apacheの画面が表示されるか確認
– 続いて、お名前.comのドメインを叩いてApacheの画面が表示されるか確認

きたあああああああああああああああああああああああ
完全に理解した

次は、GithubからGCEへのDeploy
最後にELBとしたい

[GCP] SQLでMySQLを作成してローカルから接続

1. GCPでSQLを選択します
2. CREATE INSTANCE
L mysqlを選択します

allo accessで自分のIPを入力する

3. ローカルから接続
UserはGCP SQLのコントロールパネルから編集する

mysqlのinstance typeなどはEditで編集できる

### 接続
$ mysql -u root -h ${public ip} -P 3306 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 110
Server version: 5.7.36-google-log (Google)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| performance_schema |
| sys |
+——————–+
4 rows in set (0.29 sec)

ぬおおおおおおおおおおお
意外と簡単に行けるやんかああああああああああああ

次はドメイン、ELB、デプロイだが

[GCP] GCS(cloud storage)を使ってみよう

### Basic
– GCS : GCPが提供するストレージ
– バケット : データを格納するコンテナ、ロケーションやストレージクラスの設定が可能
– オブジェクト : GCSに保存する個々のデータ
– ストレージクラス : Multi-Regional, Regional, Nearline, Coldine
– ライフサイクル : 有効期限、アーカイブ、コスト管理などができる

### 1. バケット作成

img upload

permissionはpublic accessになってますね。。
なるほど、まあ割と簡単ですね。続いてSQLを使いたい。

[GCP] シンプルな設計

もっともシンプルな設計は、projectの中にGCEがあるって状態

さて、ここからどうするか
-> ひとつひとつサービスを触っていく
-> Google App Engineはマネージドサービス、Cloud Runはコンテナ基盤、Firestoreはno sql, Cloud SQLはRDS, kubernetisはGKE
-> GCEからCloud SQLに接続する場合はVPCを経由する
-> LBはcloud loadbalancer
-> 監視、ログ集計、CDNのほか、BigQueryなども充実

まずはGCPのストレージからか..GCS(Google Cloud Strage)からか…