ISUCON9予選問題の開発環境をGCP上に作る(再整理)
時間が経って忘れてしまったので再度まとめ直した。
TL;DR
GCPでISUCARI(ISUCON9予選問題)を構築する手順。公式の以下の記事をGCPでやるときに、記事に書いてない部分を手順化したもの。
成果物
作業リスト
作業詳細
GCPコンソール
ファイアウォールルール作成
https://console.cloud.google.com/networking/firewalls/add
ISUCARIで使うポート(5555,7000,8000)、後でnetdataで使う19999を開けておく
VM作成
https://console.cloud.google.com/compute/instancesAdd
- asia-northeast1-b
- n1-standard-1
- Ubuntu 18.04 LTS
- 20GB
- HTTP トラフィックを許可する
- HTTPS トラフィックを許可する
- 作ったファイアウォールルールのタグ
静的IP作成
https://console.cloud.google.com/networking/addresses/list
動的IPだと書き換えが手間なので発行。有料。 さっき作ったVMを選択する。
VM設定
isuconユーザ作成
sudo adduser isucon
sudo gpasswd -a isucon sudo
SSH鍵配置
ユーザを切り替えてssh鍵作成、配置。 ついでに
su - isucon ssh-keygen -t rsa -C "isucon" -f isucon mkdir .ssh touch .ssh/authorized_keys cat isucon.pub >> .ssh/authorized_keys chmod 600 .ssh/authorized_keys timedatectl set-timezone Asia/Tokyo sudo visudo #`isucon ALL=NOPASSWD: ALL` vi ~/.bash_profile # export GOPATH=$HOME/go
ソフトウェアインストール
ISUCARIに使う諸々をインストール。
sudo apt-get update sudo apt-get install -y gcc make unzip golang mysql-server mysql-client go get -u github.com/go-sql-driver/mysql go get -u github.com/gorilla/sessions go get -u github.com/jmoiron/sqlx go get -u goji.io go get -u goji.io/pat go get -u golang.org/x/crypto/bcrypt go get -u github.com/morikuni/failure go get -u github.com/skip2/go-qrcode sudo apt-get -y install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable" sudo apt-get install docker-ce docker-ce-cli containerd.io sudo docker run hello-world
構築・疎通
rLogin
rlogin/telnet/ssh(クライアント)ターミナルソフトを使う。ログインできたらOK。
VSCode
Developing on Remote Machines using SSH and Visual Studio Codeを使う。サーバのフォルダが見えたらOK。
Host isu9 HostName 35.221.xx.xx User isucon IdentityFile C:\Users\xxx\.ssh\isucon
アプリ
ローカル環境でISUCON9予選の問題を動かす : ISUCON公式Blogの外部サービスの起動までを実施。 このままだと購入時にFailed to fetchになる。
以下のようなjsonファイルを作る。
{ "payment_service_url":"http://35.221.xx.xx:5555", "shipment_service_url":"http://35.221.xx.xx:7000" }
それを使って初期化する。
$ curl -XPOST http://127.0.0.1:8000/initialize -H 'Content-Type: application/json' -d @init.json {"campaign":0,"language":"Go"}
いちいちこれを実施するのは非常に手間だが、jsonのIPはlocalhostではダメだった。誰か原因がわかる人がいたら教えてほしい。 ブラウザ上で、2ユーザを使って出品・購入・配送して問題なく終わることを確認する。
ベンチマーカー
無事スコアが出たら完成。
{"pass":true,"score":1410,"campaign":0,"language":"Go","messages":[]}