C#で出●館インセンティブ情報を通知するbot作ってみた番外編(インフラ・クラウドど素人がAWSでクラウドサーバを立ててみた)
押忍!お久しぶりです
鎖骨打ちのサトJです!
ってか
あけましておめでとうございます!
今年もよろしくおねがいします!!
去年は近年の中では一番いい年だったんで、今年悪くならないか心配ですが
今年もなんとか乗り切っていきます!
今回は前の記事
にちなんだ番外編
出●館インセンティブ情報を通知するBotを動かすサーバを立ててみたです
■なぜサーバを立てることにしたのか
このテーマで記事書き始める前(2022/08)から一応既に運用してたんですが、当初は自宅PCをサーバ代わりに使ってました。
それから色々あって2022/10頃にクラウドサーバ上で動かすことにしました。
理由は大きく4つ
電気代が結構上がった
Linuxコマンド忘れ過ぎて恥かいた
市場でクラウド操作経験について結構聞かれた
Docker覚えたらインフラエンジニア少し消せるんじゃね
電気代が結構上がった
自宅PCをサーバ代わりにするために電源オプションいじってPC操作してないときでもタスクスケジューラを動くように設定しました。
どういうことかというと、PCは何も操作しないと真っ暗になると思いますが
スリープ→休止という感じで徐々に停止していきます。
見た目は同じ感じですが電源ボタンを押したときに
すぐ立ち上がるのがスリープ
ちょっと遅いのが休止
です
スリープはメモリに内容を記憶して休んでる状態ですが、休止はHDD(SSD)に内容を記憶して休んでる状態です。
一長一短ありますが、サーバとして利用する場合休止状態だとタスクスケジューラが動いてくれません。
なんでスリープはするが休止しないように設定変更したんですが、スリープ状態と休止状態だとスリープ状態のほうが断然電気の消費が大きいです。
そんでもって電気代が結構上がってしまいました。
ただでさえ在宅勤務で日中もパソコン、夜も趣味でパソコンと電気代が高づいてるのでこれ以上負担かけらんないなってのが理由です
Linuxコマンド忘れ過ぎて恥かいた
ちょうど電気代を気にし始めた頃、業務で久々にLinuxサーバを触ることがありました。
自分の部署ではインフラチームと開発チームの2つに分かれており、インフラチームは結構Linux使ってましたが開発チームはWindowsで動かしているシステムをメインに扱っているためあまりLinuxを触ることがありませんでした。
自分はインフラチームから開発チームに途中で異動したため約2年半Linuxを触ってませんでした。
インフラチームにいたときもLinux初心者だったため最低限度の習ったコマンドしか使えませんでした。
そんなときにインフラチームに画面共有で見られながらLinuxを操作することになり、前覚えた簡単なコマンドすら忘れてて馬鹿にされました
ただでさえ、うちの会社はインフラエンジニアが偉いらしく色々開発チームにケチつけてるので笑われたのがかなりイラッとして変な負けず嫌いが発動
この気にLinux操作慣れようと決意しました
市場でクラウド操作経験について結構聞かれた
エンジニアなんで一般的な市場価値を知るべくちょこちょこ面接とか受けてたのですが(なかなか書類選考は通りませんでした)
面接でよく、AWSやGCP,Azureについての経験を問われました。
当然なかったのでありませんと答えていたのですが、よくよく募集要項見ると大体歓迎要項にクラウド経験について書かれてました。
なんでクラウド経験の一環としてクラウドサーバやってみようってのが3つ目です
Docker覚えたらインフラエンジニア少し消せるんじゃね
別のプロジェクトで新規システムをDocker×Django×Nginx×MySqlで作ろうみたいなのが出てきました。
Pythonは触ったことがあったくらいで他のやつはDockerを前の会社で少し触った以外未経験でした。
ちなみにDockerを触れたと言っても当初は研修ぽっと出でDockerってそれ美味しいの?レベルだったので実質ほぼ未経験でした
そんでとりあえず少し触ったことあるDockerについて勉強してみたら、環境構築が容易にできるってことがわかりました
うちの会社ではインフラチームと開発チームが分かれている関係上インフラチームがクラウドサーバを用意して必要なミドルの設定をしてから開発チームに渡して開発チームがコーディングしていく
って流れでした。
そういう関係なため、色々インフラチームが開発言語等に口出ししてくるし、色々偉そうな感じです。(低レイヤーを扱う会社な関係上うちは他の会社よりインフラエンジニアが偉いのかもしれない)
そこでDocker覚えればネットワークエンジニアはともかくサーバエンジニアは消せるんじゃね?って糞な思考に至り負の力でやる気を向上させました
■サービス選定
今回の目的は電気代を減らして、出●館インセンティブ情報を通知するBotを動かすことなので以下を優先しました
C#(.NET6)が動く
安い(できれば無料でやりたい)
この基準で選定しました
仮想マシン or サーバレス
そもそもAWSとかGCPとか全くわかってなくてどんなサービスがあるのかもわからない状態からスタートしました。
とりあえず仮想マシン建てられるのかなくらいの認識でしたが調べてみると
アプリケーション基盤とかファイルストレージとかたくさんあってそれぞれ無料枠が違うようでした
色々サービスあってびっくりしましたw
そんな中見つけたのがサーバレス
仮想マシンの無料枠はどれも12ヶ月までなのに対し、サーバレスは回数制限?があるものの、永久無料っぽい
今回作るのはバッチサーバで一日一回動かせばいいのでサーバレスのがいいな
ってことでサーバレスにしました
AWS or GCP or Azure
サーバレスにするって決まって今度はどの会社のやつ使おうかってところです
無料枠の条件はどれもあんま変わらなそうでどれでも問題なかったので
構築のしやすさ
C#(.NET 6)が使えるか
で選定しました。
まずAzureですが、同じMicrosoftで親和性的にいいかなとは思ったのですが色々記事あさると、
めんどくさい
やら
AWSのが全然マシ
など
結構悪口書かれてて、AWSやGCPに比べて参考記事も少なさそうだったので除外しました。
続いてGCPとAWSだが当初はAWSよりGCPのがなんとなく気に入っていて(特に理由はないですがミーハーの知り合いが対して知識ないくせにAWSがどうのこうの語っててなんとなく嫌ってました)
GCPにしようかと思ったのですが、.NETは対応してるが、C#に対応してる的な記事がなかった
それに対してAWSはLambda用のプロジェクトテンプレがVisualStudioで作れるっぽくてC#対応もしてるって書いてあったのでAWSにすることにしました
なお、Docker上でやればなんとかなりそうだったがまずはDockerなしでやってみたかったので考慮しませんでした
結局何にしたか
AWSアカウントを作ってLambda用プロジェクトに出●館インセンティブ情報を通知するBotのプログラムをコピペして参考記事を見ながらデプロイしてみたがうまくいかない、、、
色々記事を見てもうまくいかない
ちょっと一旦デプロイは置いといて、Seleniumを使うプログラムをLambdaでどう構築していけばいいのかってところを調べてみると
Cloud9にChromeをインストールしてどうのこうの
的な記事が結構出てきました。
Cloud9ってなんやねんって感じだったんだけど更に記事を読んでくとEC2を選択して~的なことが書いてあった
EC2使うん??
確かにSeleniumを動かすにはブラウザ必要だしLambdaだけじゃ無理なんじゃねってのはなんとなく理解できた
色々調べたらCloud9は無料とかの見出しも多かったが結局一年間無料なだけだった
EC2と同じやんけ
どうせ無料枠一年ならEC2でも変わらんし、Lambdaのデプロイもハマってうまくいかんし元のプロジェクトそのまま使えそうなEC2でええわ
ってことで結局
AWS EC2で構築することにしました
■EC2で仮想マシンを構築
ここからはいろんな記事あるのでだいぶ端折ります
インスタンス作成
ここは好きな名前で良いです
ここもお好みで
自分はローカルの仮想環境をUbuntu LTS 20.04にしてるので一番慣れているUbuntu 20.04にしました
インスタンスタイプは無料枠のt2.microにしました。
ちなみに結構しょぼいです
キーペアについて
ここ結構ハマったので見出しにしておきます
自分はインスタンス生成後TeraTarmでのSSH接続を想定していたのですが、
TeraTarmからSSH接続したい場合はキーペアのタイプは絶対ED25519で作ってください
いろんな記事見ても当たり前でしょ的な感じでRSAを選択しろ的な感じばっかりですが2022/05あたりから仕様が変わったようでRSAで作った鍵ではアクセスできなくなったぽいです
詳しいことは知りません
なおvscodeでのSSH接続に関しては試してませんがおそらく同様でしょう
あとはIP制限で自分ちのGIPを設定したくらいでインスタンス作成完了です
TeraTarmから接続
TeraTarmのインストール方法は以下を参考にしてください
インスタンス画面で作成したインスタンスを選択して接続するボタンを押すと写真のような画面が開きます
ホスト名で赤枠で囲った箇所を入力してTCPポートを22でOKを押します
ユーザー名をUbuntu
パスフレーズはなし(入力しなくていい)
認証方式は上から二つ目を選択してED25519で作った鍵を選択
でOK
これで接続できるようになりました
インストール類
とりあえず検証ができるように以下をインストールしました
Docker
DockerCompose
.NET 6 SDK
.NET6 RunTime
GoogleChrome
Git
詳細は割愛します
■おわりに
いかがだったでしょうか
自分もずっとインフラ系は他の人に任せきりでプログラミングばっかしてきたのでいい勉強になりました。
インフラ系に嫌悪感があったのが少しなくなりましたw
次回はいよいよ最終回です
なお有料販売にする予定です