GCE(Google Compute Engine)の永久無料枠(2021年4月現在)で、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ブランチをデプロイしました。

アカウントとインスタンス作成

丁寧に書いてくれている人がいるので、ここを参考に。
これから始めるGCP(GCE) 安全に無料枠を使い倒せ

f1-microが直ぐに見つからなかったが、N1シリーズの中にありました。

後からでも変更できるが、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を連絡したドメイン以外にしても送れました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です