kavo’s diary

備忘録

ISUCON9予選問題の開発環境をGCP上に作る(再整理)

時間が経って忘れてしまったので再度まとめ直した。

TL;DR

GCPでISUCARI(ISUCON9予選問題)を構築する手順。公式の以下の記事をGCPでやるときに、記事に書いてない部分を手順化したもの。

isucon.net

成果物

  • ISUCON9予選問題とベンチマーカーが動くGCPVM(Ubuntu)

作業リスト

  • GCPコンソール
  • VM設定
    • isuconユーザ作成
    • SSH鍵配置
    • ソフトウェアインストール
  • 構築・疎通
    • rLogin
    • VSCode
    • アプリ
    • ベンチマーカー

作業詳細

GCPコンソール

ファイアウォールルール作成

https://console.cloud.google.com/networking/firewalls/add

ISUCARIで使うポート(5555,7000,8000)、後でnetdataで使う19999を開けておく

f:id:kavohtn:20200627180843p:plain

VM作成

https://console.cloud.google.com/compute/instancesAdd

静的IP作成

https://console.cloud.google.com/networking/addresses/list

動的IPだと書き換えが手間なので発行。有料。 さっき作ったVMを選択する。

f:id:kavohtn:20200627180421p:plain

VM設定

isuconユーザ作成

GCPVM一覧から、SSH機能を使ってログイン。

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。

  • ホスト:GCPで作った静的IP
  • ログインユーザー名:isucon
  • パスフレーズ:***
  • SSH認証鍵:さっき作った秘密鍵をダウンロードして指定

f:id:kavohtn:20200627193551p:plain

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":[]}