Skip to content

Latest commit

 

History

History
207 lines (144 loc) · 8.72 KB

00.setup.md

File metadata and controls

207 lines (144 loc) · 8.72 KB

環境構築

AWS 環境を使うことが前提。

本戦 (WIP)

配布された CloudFormation から EC2 立てるだけ? そこに、各種ツールを流し込めるようにすれば OK?

準備担当分け

  • AWS の環境構築
    • ssh (.ssh/authorized_keys)
    • 計測ツール系
    • リポジトリにソースを突っ込む
  • 当日のマニュアル確認
    • レギュレーション確認
    • アプリの内容把握
    • どこがボトルネックになりそうか確認
  • ローカル (全員)
    • ssh config
    • DB クライアント

過去問

aws-isucon を参考に、過去問環境の構築ができる

AMI から EC2 インスタンスのセットアップ

  1. AMI から試したい過去問のものを選択
  2. AWS コンソールから「AMI からインスタンスを起動」を選択
  3. インスタンスの各種設定して起動
  • インスタンスタイプ: c5.large を選択 (理由: 基本本番では c5.large でインスタンス配布されることが多いため)
  • キーペア: 適切な名前をつけて pem ファイルを作成、ローカルにダウンロード
  • セキュリティグループ: HTTP, HTTPS, ssh を許可するように設定 (インバウンドルール)

ローカルから isucon ユーザー として ssh で繋ぐ

基本的に本戦・過去問では、isucon ユーザーがアプリケーションのファイルの書き込み権限を持っている。

そのため、ローカルから ssh 経由で isucon ユーザーとしてサーバーに入れると手間が省けて楽 (毎回 ubuntu ユーザーで入って、isucon ユーザーに切り替えするのは面倒)

# インスタンスを作った人が、ローカルにダウンロードしたキーペアを使ってsshで繋ぐ
ssh -i {ダウンロードしたpemファイルのパス} ubuntu@{サーバの公開IP}

# 以下のエラーで怒られたら、ファイル権限を修正する (ownerだけread/writeをできる設定に)
# ===================================
# Permissions 0644 for '/Users/k_muta/Downloads/mentos_pem_20241128.pem' are too open.
# It is required that your private key files are NOT accessible by others.
# This private key will be ignored.
# Load key "/Users/k_muta/Downloads/mentos_pem_20241128.pem": bad permissions
# ubuntu@18.176.52.26: Permission denied (publickey).
# ===================================
chmod 600 {ダウンロードしたpemファイルのパス}

# isuconユーザーに切り替え
sudo su - isucon

# ローカルの公開鍵 (ex. id_rsa.pub) をサーバーの .ssh/authorized_keysに記入
mkdir .ssh

# ローカルでssh keyを作成したことがない場合、ローカルにて `ssh-keygen` を実行し、公開鍵・秘密鍵を生成
# ローカルの公開鍵 (デフォルト: `~/.ssh/id_rsa.pub`) の中身をコピペする
vim .ssh/authorized_keys

セットアップ後、ローカルから ssh isucon@{サーバの公開IP} を実行すると、isucon ユーザーでサーバに入れるはず

参考

ssh config の設定

インスタンスが立ち上がった後に、全員が同じ設定をできるようにしたい

# ローカルにて `.ssh/config` を編集/作成
vim .ssh/config

# 以下を追加
# 1人1インスタンスの想定なので、誰がどこのHostに繋ぐかは共有する必要あり
# - Host: isucon (わかりやすくて短ければなんでも)
#   - User: isucon (本戦でアプリのオーナーがisuconでない場合は変更が必要)
#   - Hostname: EC2のインスタンスの公開IP (本戦で必ず変更が必要)
#   - IdentityFile: ~/.ssh/id_rsa (ローカルPCの秘密鍵のパスが異なる場合は変更が必要)
#   - ForwardAgent: yes (リモートでgitを使うために、ローカルのssh-agentに秘密鍵の情報を登録し、sshコマンド実行時にリモートに引き継ぎたいのでForwardAgentはyesにする必要がある)
Host isucon
  User isucon
  Hostname 18.183.170.20
  IdentityFile ~/.ssh/id_rsa
  ForwardAgent yes

# isuconユーザーで入れればOK
ssh isucon

EC2 に置かれているソースを git で ssh 経由で管理する

ローカルにある手元の秘密鍵で ssh 経由で git を扱いたい時 基本は以下リンクの通りやれば OK. (ssh config 使ってるので、その通りやるには各自設定が必要)

  1. (やっていない人は) GitHub にローカル PC の公開鍵を登録
  2. ssh-agent に秘密鍵を登録し、EC2 に ssh する (理由: リモートサーバでローカルの秘密鍵を直に置くのはやりたくないので、ssh-agent 転送の仕組みを使って、ローカルの ssh-agent に秘密鍵を登録し、リモートに引き継ぐ形で実現する)
# ssh-agentに秘密鍵を登録。基本は `.ssh/id_rsa`
ssh-add {ローカルの秘密鍵のパス}

# 確認
ssh-add -l

# 上記に記述したssh configを設定している場合
ssh isucon

# ssh configを設定していない場合
# -A オプションで、ローカルのssh-agentの情報をリモートの接続先に引き継ぐ
# `.ssh/id_rsa` の場合は -i オプションは不要
ssh -A -i {ローカルの秘密鍵のパス} isucon@{インスタンスIP}

-A をつけ忘れる!インスタンス IP を毎度つけたくない!という場合は各自で、.ssh/config に設定を書いてあげましょう

参考 (ssh config を使う方法)

個人の.gitconfig で仕込んでいる 設定を流し込む

ソースを git 管理する場合、ローカルで設定しているエイリアスを使いたくなるので、isucon ユーザーに切り替えて、ホームディレクトリ直下に.gitconfig を作成して流し込むのみ (scp するなりコピペするなりそこはよしなに)

ssh isucon@{サーバの公開IP}

# ローカルの `~/.gitconfig` の設定をコピペ
vim .gitconfig

ソースコードをリポジトリで管理する

  1. リポジトリ作成
  2. リモートサーバで必要なファイルを作ったリポジトリ向けに push
# 適切な階層で
git init
# 不要なファイルがあれば、.gitignoreに追加
# そのまま `git add .` をしちゃうと、サイズが大きいファイルのせいでgitが重くなることがある
vim .gitignore

git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin {リモートリポジトリのURL}
git push -u origin main
  1. push したインスタンス以外では、push されたリモートの main ブランチの変更に追随することで、
# 適切な階層で
git init
git remote add origin {リモートリポジトリのURL}

# リモートの変更をfetch
git fetch origin
# リモートのmainと状態を合わせる
git reset --hard origin/main

# 確認
git log

個人の DB クライアントから MySQL に繋ぐ

ローカルから DB に繋いで、データの中身やテーブル設計の確認、インデックスを GUI の DB クライアント経由で貼って SQL を確認したり、使い所は多い印象

ssh 経由で、ローカルの秘密鍵を使って繋ぐ

ex. Sequel Ace を使って ssh で DB に繋ぐ (.ssh/config を使わず、直で秘密鍵のパスを指定する方法)

DB のユーザー情報は、当日のアプリに設定されているものを指定 sequel-ace-sample-img

参考

サーバに入れたい計測ツールを流し込む (WIP)

以下を ansible で投入できるようにしたい

  • pt-query-digest
  • alp

ちなみに、pprotein なる GUI で pt-query-digest, alp, pprof の結果を見れる OSS があるらしく、優勝チームはそれを利用しているよう

参考

Go のアプリ解析用に pprof 入れる (WIP)