趣味エンジニアの技術メモ


GCP

1 年おきの記事投稿

※この記事はためしに zenn にも投稿しています。

AmongUs を Discord で VC を介してプレイする際に、ゲーム状況に応じて自動で参加メンバーの音声 ON/OFF を制御してくれるAutoMuteUsという超便利 Bot があります。 こちら、README にある通りパブリック公開されている DiscordBot をサーバーに招待することで簡単に利用できます。

が、AmongUs 自体が人気なためか、または日本からのアクセスになるためか、時間帯によって動作が非常に遅く遊びづらいことがあります。 それを解決するため、GCP 上に自分専用の AutoMuteUs Bot を無料でホスティングしたので、今回はその方法メモです。

事前の準備

  • AutoMuteUs の README に沿って、適切な権限を持った DiscordBot トークンを取得しておきます

    • ※Bot は 2 つ作成して、Token も 2 つあると便利です。後述しますが BOT を 2 つ設定することで音声 ON/OFF 操作が高速になります。
  • 上記の Bot を Discord サーバーに招待しておく
  • gcloud コマンドが使えること

1. GCP のインスタンスを構築する

GCP の仮想マシンサービスである ComputeEngine は、特定のリージョン、スペックだと無期限で無料になるため、それを利用します。

ポイント

  • 無料リージョンに立てる

    • 自分は us-west1 に設定して快適に遊べています。
  • マシンタイプは無料対象である シリーズ N1 の f1-micro を選びます。
  • HTTP トラフィックを許可する にチェックを入れます。

イメージ: GCPインスタンスリージョン設定イメージ GCPインスタンスファイアウォール設定イメージ

2. GCP インスタンス上での設定

Docker をインストールする

docker-compose を利用したいので、Docker 公式を参考にインストールします。(多分デフォルトだと debian なのでリンク先は debian 手順)

AutoMuteUs のソースコードを取得する

https://github.com/denverquane/automuteus

これを任意の場所におきます。自分は /opt/automuteus に配置しています。 (以降、本記事も /opt/automuteus に配置されている前提の記載となります。)

.env ファイルを作成する。

このあたりは AutoMuteUs の README にも記載されている内容なので困ったらそちらへ。

cp sample.env .env

で .env ファイルを作成し、以下のあたりを編集します。

AUTOMUTEUS_TAG=6.5.5
GALACTUS_TAG=2.4.1

DISCORD_BOT_TOKEN=事前準備で作成したDiscordBotTokenその1
GALACTUS_HOST=http://GCPインスタンスの外部IPアドレス (※後で書き変えます)
GALACTUS_EXTERNAL_PORT=80

WORKER_BOT_TOKENS=事前準備で作成したDiscordBotTokenその2

AUTOMUTEUS_TAGGALACTUS_TAGAutoMuteUs の ReleasesGalactus の Tags から任意のもの(基本最新で良さそう)を指定します。(記載してるのは自分の設定です)

実行

設定がうまくできていれば、docker-compose up コマンドで起動できます。 起動すると、事前準備で作成した Bot を招待している Discord サーバーに、Bot がオンラインになります。(WORKER_BOT_TOKENSをセットしていれば合計 2 つの Bot)

あとは、 .au help でヘルプを見るなり、AutoMuteUs でググると出てくる他のわかりやすいサイトに出てくる使い方通りに利用できます。

3. Bot をサービス化する

ところで、このままだとインスタンスを起動し直すたびに ssh で接続して Bot を起動する必要があります。 また、GCP インスタンスの IP アドレスは起動のたびに変更される可能性があるので .env も修正の手間があります。

以下の手順で、サービス化を試みます。(もっといいやり方もあると思います!一例です。)

systemd でサービス化

単純に docker-compose コマンドの実行をサービス化するだけです。

GCP インスタンス上で、以下のような automuteus.service ファイルを作成して

/opt/automuteus/ に配置されてる前提

[Unit]
Description=AutoMuteUs

[Service]
EnvironmentFile=/opt/automuteus/.env
ExecStart=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml up
ExecStop=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml down
ExecReload=/usr/local/bin/docker-compose -p automuteus -f /opt/automuteus/docker-compose.yml restart
Restart=always

Type=simple

[Install]
WantedBy=multi-user.target

/etc/systemd/system ディレクトリにぶち込みます。

sudo cp automuteus.service /etc/systemd/system

あとはサービスを有効化してあげます。

sudo systemctl daemon-reload
sudo systemctl enable automuteus

# 確認

## start
sudo systemctl start automuteus

## stop
sudo systemctl stop automuteus

## restart
sudo systemctl restart automuteus

この時点でインスタンスを実行すると Bot が起動するようになっていると思います。

インスタンス起動時に IP アドレスを .env に記入する

次に、起動時にインスタンス自身の外部 IP アドレスを取得して .env に書き出すようにします。 IP アドレスを固定してもいいのですが、そうすると多少料金が発生してしまうのでがんばります。

IP アドレスは GALACTUS_HOST に記載する必要があるので、これを置換するようなスクリプトを書きます。

#!/bin/bash

envfile=/opt/automuteus/.env

external_ip=$(curl -H "Metadata-Flavor: Google" 'http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip')
envfile_new_row="GALACTUS_HOST=http:\/\/${external_ip}"

sed -e "s/^GALACTUS_HOST=.*/${envfile_new_row}/" ${envfile} >.env.tmp && mv .env.tmp ${envfile}

# Restart after envfile replaced.
systemctl restart automuteus

スクリプトが書けたら、インスタンスの起動スクリプトとして設定してあげます。

↓ 3箇所変更が必要なので注意

gcloud compute instances add-metadata インスタンス名 \
    --metadata-from-file startup-script=./startup-script.sh \
    --project=GCPプロジェクト名 --zone=インスタンスのzone(us-west1-bとか)

おわり

全部の手順が完了できたら、インスタンスを起動 → 停止するたびに

  • Discord サーバーに 2 つの Bot が起動する
  • .au new コマンドを叩くと、インスタンスの外部 IP が正しく設定された「URL」が DM で送られてくる

という形になると思います。

一度設定すればあまり変更する必要はないと思うので、快適に AmongUs を楽しみましょう!


Other

夜型人間 Advent Calendar 2019 の 9 日目の記事です。

週末だけ夜型になる、にわか夜型人間ですが書いてみます。夜型レベルは夜中の12時くらいに掃除機をかけ始めたり(※幸いうちのマンションは防音が十分です)、土曜日に夜ドラクエをやりすぎて日曜日は寝ないでおこうってなる程度です。

今回は、朝確実に起きるためのライフハック「朝ごはん」について書きます。

人間は朝ごはんで朝きられるようになる

皆さんは、朝ごはんをちゃんと食べますでしょうか。 僕は朝しっかり起きるために朝ごはんを食べています。

と言っても、「朝食を食べると栄養が取れて体にいい」だとか、「脳が活性化してすぐに目が覚める」とかそんな話ではなくて。

僕が提唱するライフハックは、朝ごはんに自分が食べたいものを準備しておけば、それが楽しみになるからその日起きられるというものです。

例えば、日曜日に家でお寿司を食べたけど食べきれなくて、翌日の朝に食べようとなったら。そこに自分の好きなお寿司のネタがあったら。なんとなく起きられる気がしてきませんか?

というわけで僕は自分がその時食べたいものを朝ごはんに用意することで、朝起きられるようにしています。毎日は難しいし同じものだと効果が薄れてくので、絶対起きなきゃいけない時などに実行するのがオススメです。

以上で僕の話は終わったので、ここからは僕の最近の朝ごはんを貼っていきます。


frontend

先日、Mercari x Merpay Frontend Tech Talk vol.3 に参加させていただいたのでそのメモです。

感想

  • CSS の管理とか設計は現場ごとに課題があって、それを解決する形になるんだろうなと思いました

    • なので、つらみとかやったこととかを聞けて良かった
  • UNIQLO の Global 対応すごいし面白かった
  • GraphQL は Client にはだいぶ良さそう(Backend 視点だとどうなんだろう・・・)

以下、メモについては自分が気になったところだけ + 殴り書きなんで自分しか読めないかも