GCE(Google Compute Engine)の永久無料枠(2022年3月現在)で、Railsアプリを動かせるか試してみました。
m1 MacからAnsibleで自動構築(CentOS7 Vagrantfile+Ansible playbook提供(Railsアプリ対応)のrails_developブランチ)し、Ruby on Railsベースアプリケーション(Ruby 3.0.0, Rails 6.0.3.4)のspace_developブランチをデプロイしました。
追記:対象がf1-microからe2-microに変わっています
改めて作り直してみました。
月間予想の金額も表示されますが、これが出ているので無料枠って事かな。
アカウントとインスタンス作成
丁寧に書いてくれている人がいるので、ここを参考に。
これから始めるGCP(GCE) 安全に無料枠を使い倒せ
f1-microが直ぐに見つからなかったが、N1シリーズの中にありました。
対象がe2-microに変わっています。
後からでも変更できるが、HTTP(80)とHTTPS(443)を空けておく。
ちなみにSSH(22)はデフォルトで空いている。
ファイアウォールの設定でのポート番号はカンマ区切りで複数指定できる。
公開鍵の登録
EC2(AWS)ではec2-userでクラウド側で作る事も可能でしたが、GCE(GCP)ではローカルで作成した鍵(公開鍵)を登録する。
$ ssh-keygen -t rsa -b 4096 -C gce-user -f ~/.ssh/railsapp_gce-user Enter file in which to save the key (/User/xxx/.ssh/railsapp_gce-user): (空のままEnter) Enter passphrase (empty for no passphrase): (空のままEnter) Enter same passphrase again: (空のままEnter) 公開鍵 $ cat ~/.ssh/railsapp_gce-user.pub
公開鍵に記載されたユーザ名でユーザーが作られ~/.sshに設置される仕組み。
ちなみにコンソールから鍵を削除した場合は、鍵ファイルだけ削除されユーザーは残る。
SSH接続をwheelやusersグループで縛っている場合、接続できなくなるので注意。
# id gce-user uid=1000(gce-user) gid=1001(gce-user) groups=1001(gce-user),4(adm),39(video),1000(google-sudoers) wheelに変更 # usermod -g wheel gce-user
DNSレコード作成
(今回はGCPではなく、既に導入済みのサービスに追加)
HTTPSでLet’s EncryptのSSH証明書を入れるので、DNSレコードを作成しておきます。
SSH接続でもIPを意識しなくて良くなるので便利。
railsapp.nightonly.com A 300 35.230.79.101 railsapp.nightonly.com TXT 300 v=spf1 +ip4:35.230.79.101 ~all *.railsapp.nightonly.com CNAME 300 railsapp.nightonly.com.
SSH疎通確認とサーバー初期設定
$ ssh gce-user@railsapp.nightonly.com -i ~/.ssh/railsapp_gce-user [gce-user@railsapp ~]$ sudo -s [root@railsapp ~]#
よくやる内容を下記に記載しています。
サーバー初期設定(CentOS[RedHat系]) – Night Only Project.
エージェントをインストール
コンソールのモニタリングで、メモリ使用率とディスク使用率を出すには、エージェントをインストールする必要があります。
下記の手順通りでOK
単一の VM に Cloud Monitoring エージェントをインストールする | Google Cloud
rootで実行しているので、sudo外しています。
# curl -sSO https://dl.google.com/cloudagents/add-monitoring-agent-repo.sh # bash add-monitoring-agent-repo.sh # yum install -y stackdriver-agent # systemctl start stackdriver-agent
自動起動のみ追加
# systemctl enable stackdriver-agent stackdriver-agent.service is not a native service, redirecting to /sbin/chkconfig. Executing /sbin/chkconfig stackdriver-agent on
Ansibleで自動構築とRailsアプリデプロイ
cloneして、README.mdを参照してください。
https://dev.azure.com/nightonly/vagrant-ansible-origin/_git/vagrant-ansible-centos7?version=GBrails_develop&path=%2FREADME.md
無事動きました。意外とサクサク動きます。
https://railsapp.nightonly.com/
[root@railsapp ~]# w 19:19:25 up 1 day, 8:10, 1 user, load average: 0.00, 0.01, 0.05 [root@railsapp ~]# free total used free shared buff/cache available Mem: 600204 396172 45628 3768 158404 90152 Swap: 2047996 179456 1868540 [root@railsapp ~]# df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs 291340 0 291340 0% /dev tmpfs 300100 0 300100 0% /dev/shm tmpfs 300100 16892 283208 6% /run tmpfs 300100 0 300100 0% /sys/fs/cgroup /dev/sda2 31240240 6825744 24414496 22% / /dev/sda1 204580 11464 193116 6% /boot/efi tmpfs 60024 0 60024 0% /run/user/1001
気になった点
特にRubyのコンパイルに時間が掛かった
貧弱なインスタンスという事もあり、待ち時間が長くなるのは仕方がない。
仕事で使うならコスパを考えて、東京リージョンで少しコストを払った方が良さそう。
SSH接続が切れるのが早い
/etc/ssh/sshd_config に下記を追加して、ある程度接続が維持されるようにしました。
ClientAliveInterval 60 ClientAliveCountMax 5
# systemctl restart sshd
irqbalanceがインストールされていない
インポートしたディスクを手動で構成する | Compute Engine ドキュメント | Google Cloud
高パフォーマンスのネットワーク機能とディスク機能を確保するには、irqbalance デーモンを無効にするか、削除します。このデーモンは、仮想マシン(VM)インスタンス上のゲスト オペレーティング システムに対する IRQ リクエストを正しく分散しません。仮想 CPU に対する IRQ 設定を正しく分散するには、代わりにゲスト環境の一部であるスクリプトを使用します。
一旦、インストールしない事にした。
Ansibleのplaybookに[ignore_errors: yes]を追加
- name: systemctl start irqbalance; systemctl enable irqbalance systemd: name=irqbalance state=started enabled=yes ignore_errors: yes
メール送信が出来ない
mailqに溜まって行ってます。
# mailq -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- AA92B21B3A7B 84850 Sun Apr 18 17:11:47 crond@railsapp.nightonly.com (connect to aspmx3.googlemail.com[142.250.128.26]:25: Connection timed out) admin+notice@g.nightonly.com 192D12210647 3048 Sun Apr 18 18:09:40 noreply@railsapp.nightonly.com (connect to mail.nightonly.com[27.120.88.140]:25: Connection timed out) admin@nightonly.com
インスタンスからのメールの送信 | Compute Engine ドキュメント | Google Cloud
不正使用のリスクがあるため、宛先 TCP ポート 25 が VPC ネットワークの外部にある場合、その宛先への接続は常にブロックされます。これには、Google Workspace での SMTP リレーの使用が含まれます。
なんと!
2525ポートを開ける例に従って、25ポートを設定してみましたが、ダメでした。
VPCで構築済みのメールサーバーに接続するか、SendGrid、Mailgun、Mailjet などを使えとの事らしい。
後日、これを試してみる。
SendGrid でのメールの送信 | Compute Engine ドキュメント | Google Cloud
SendGrid登録
画面から登録したが、即有効化されず審査があるようだ。メールで返答して連絡待ち。
→ 無事、アカウント発行の連絡が来ました。
後で気付きましたが、こっちでも申し込める。
https://console.cloud.google.com/marketplace/product/sendgrid-app/sendgrid-email
今回はこっちで登録しました。日本の代理店なのかな?
https://sendgrid.kke.co.jp/
使えるSMTPサーバーは同じ。管理画面も一緒っぽい。
差出人に「自社システムの通知メール(問合せフォームの受付完了通知など)」をご選択いただきましたが、 SendGridは下記のいずれで利用されますか? 1.法人や任意団体(屋号ありの個人事業含む) 2.個人(屋号なしの個人事業含む) 検証用途であっても、1に該当する場合は 法人/任意団体/屋号の情報をご登録いただく必要がございますので、上記ご回答をお願いいたします。
■ご登録いただいた送信元メールアドレス(From)のドメインについて <ドメイン名> がお客様のドメインであることを示す情報をご提供いただけないでしょうか? 下記いずれかのご対応をお願いいたします。 ・お客様の御名前が記載されている、当該ドメインのWebサイト内の利用規約やプライバシーポリシーなどのURLをお送りいただく ・お客様の御名前とドメイン名が併記されているレジストラ設定画面のキャプチャ画像をお送りいただく ※併記されている画面がなければ、キャプチャが複数枚になっても構いません。 その場合、ログインIDなどで各キャプチャの紐付けを確認させていただければと存じます。 ※不要な部分(クレジットカード情報など)にはマスク処理やトリミングをお願いいたします。 ・当該ドメインのWebサイトに「SendGrid」と記載されたページを作成していただく ※こちらのページは弊社での確認が済み次第、削除していただいて構いません。 ・当該ドメインのDNSのTXTレコードに「SendGrid<番号>」を設定していただく ※TXTレコードは弊社での確認が済み次第、削除していただいて構いません。
SMTPリレー設定
GoogleのドキュメントでもSMTPリレーしているだけですね。
SendGridにログインして、Integration GuideからSMTP Relayを選択し、APIキーを作成。
API Key Nameは何でも良さそう。メール認証のユーザー名はapikey、パスワードは自動生成される。
# cd /etc/postfix # vi main.cf
relayhost = [smtp.sendgrid.net]:2525 smtp_tls_security_level = encrypt smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd header_size_limit = 4096000 smtp_sasl_security_options = noanonymous
# vi sasl_passwd
[smtp.sendgrid.net]:2525 apikey:<自動生成されたパスワード>
# postmap sasl_passwd # postfix check # postfix reload # echo "test" | mail -s "test for `hostname`" <メールアドレス> # mailq Mail queue is empty
ちなみに別に借りているWebサーバーでも良かった
ドキュメントに習ってポートを2525にしてみましたが、587でも行けます。
# vi /etc/postfix/main.cf
relayhost = [<リレー先のサーバー名 or IP>]:587
# postfix check # postfix reload
リレー先のサーバー
# cd /etc/postfix # vi main.cf
#inet_interfaces = localhost inet_interfaces = all mynetworks = 127.0.0.0/8, <GCEのIP>/32
# vi master.cf
submission inet n - n - - smtpd
# postfix check # postfix reload
ファイヤーウォールやfirewalld使ってたら、submissionポート(587)も空けてね。
hosts.allowは追加不要でした。
自前ではSPFレコード必要ですが、SendGridはDKIM使っているので不要ですね。
あと、fromを連絡したドメイン以外にしても送れました。
“GCP事始め。Compute EngineでRailsアプリを動かす” に対して1件のコメントがあります。