前書き
長いことはじまりの世界のデータサーバーは一つ
AWS Elastic Beanstalk で環境を用意して運用して半年~1年が過ぎようとしてます
ここでモチベーションがあがる機能追加案がありまして、世界を広げるという操作をプレイヤーが行えるようにする
具体的にはプレイヤーがお金を払い、サーバー運用費を越える額がたまった後、それをトリガーに一つとなりのワールドのデータサーバーが立ち上がり
これを編集できるようになるというものです。
ec2 インスタンスに docker 環境を作る
こちらの記事を参考に手を動かしてみます。
Amazon Linux2にDockerをインストールする - Qiita
AWS ec2 インスタンスを作る
ssh 接続はセキュリティーグループで自宅の IP アドレスからのアクセスからのみ許可
秘密鍵を自身の .ssh/aws フォルダに配置して、これを指定して ec2-user というディフォルトユーザー名で、出来上がった ec2 インスタンスの DNS アドレスにたいして ssh 接続を成功させます。
この時点で、自宅と同じ IP アドレスであり、インスタンス作成時に作った自分しか知らない秘密鍵を持ち、これを指定した者だけが
この ec2 インスタンスに入って自由に操作できるようになります。
とりあえず最新状態にして docker エンジンのコマンドを打てるようにしてみましょう
sudo yum update
で y 押す
docker をインストール
sudo yum install -y docker
インストールした docker をスタート
sudo service docker start
sudo 打たなくて良いように ec2-user アカウントを docker グループに追加(※有効化されるのは次のログインからだから注意)
sudo usermod -a -G docker ec2-user
インスタンス再起動時に docker コマンドが打てるよう自動起動を有効
sudo systemctl enable docker
docker-compose 実行ファイルをダウンロードして、実行権限付与
sudo curl -L https://github.com/docker/compose/releases/download/1.26.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
動作確認
docker --version
docker-compose -v
どちらもバージョン番号が出力されれば ec2 インスタンスを起動して Amazon Linux 2 にて docker 環境整えるはクリア
docker 環境に ECR から pull してアプリの動作確認
まずローカルで docker image を作成します。
FROM golang:1.14 AS build RUN apt-get update && apt-get install -y \ python3-dev \ python3-pip RUN go get -u github.com/aws/aws-sdk-go WORKDIR /app COPY . . RUN GOOS=linux CGO_ENABLED=0 go build -o /tmp/cubedataserver application.go FROM alpine:3.12 COPY --from=build /tmp/cubedataserver /bin/cubedataserver ENTRYPOINT ["cubedataserver"]
この Dockerfile には go build した成果物をビルドに必要なライブラリのないスリムな alpine image 上で実行 という
コンテナを小さくするアイディアが記載されています。
ecr にログインして、docker push して、IAM で ecr リソース指定アクセス権限ポリシーをつけておけば docker pull できました。
いざ、ローカルテストと同じように docker コンテナが機能し、セキュリティーグループで自宅から指定ポートのインバウンド設定すれば
自宅からキューブ情報の操作ができること確認しました。(アプリ層でトークンが正しいこと確認してます)
lambda でインスタンスを stop, start する
できれば ALB のルールもつけたり、消したりしてほしい
参考にした記事はこちら
dev.classmethod.jp
docker run するときに --restart=always オプション付けていれば、インスタンスの起動完了と同時にサーバーとして機能をはじめました。
IAM ロールで、指定リージョンの指定インスタンスIDに関してのみの start, stop ポリシーを付けたので、暴走する関数にはならない
lambda を実行すれば機能したので、これを PlayFab から呼び出せるので、すべての技術課題は解決した
完成はしてないが、あとは調査いらずの作業だけになったぞ
参考
PlayFab Cloud Script → API Gateway → Lambda(python) → EC2 start, stop