Google Cloud FunctionsはいわゆるFaaS(Functions as a Service)になります。JavaやC#、Node.js、Pythonなどに対応していましたが、2021年1月からRuby(2.6または2.7系)にも対応しました。
今回はCustomers Mail CloudのRubyライブラリを使って、Google Cloud Functionsからメール送信を試してみます。
Google Cloud SDKのセットアップ
Google Cloudでは各機能を使いこなすためのCLIツールを提供しています。Google Cloud SDK のインストール | Cloud SDK のドキュメントより、各OSに合わせてインストールを行ってください。セットアップが完了すると、gcloudというコマンドが使えるようになります。
ベースを準備
まず適当なディレクトリを作成し、その中にGemfileを作成します。内容は次の通りです。
source "https://rubygems.org" gem "functions_framework", "~> 0.7" gem 'customers_mail_cloud' gem 'multipart-post' gem 'mime-types', '~> 2.99'
ライブラリをインストールします。
bundle install
次に app.rb を作成します。内容は次の通りです。
require "functions_framework" require 'customers_mail_cloud' require 'json' # 関数名は hello_cmc としています FunctionsFramework.http "hello_cmc" do |_request| # POST以外は拒否 unless _request.post? return [405, {}, ["Only POST requests are accepted."]] end # POSTされた情報を読み込み params = JSON.parse(_request.body.read, symbolize_names: true) # Customers Mail Cloudの準備 client = CustomersMailCloud::Client.new(ENV['API_USER'], ENV['API_KEY']) # Fromのメールアドレスを設定 client.from = CustomersMailCloud::MailAddress.new(ENV['FROM_ADDRESS'], ENV['FROM_NAME']) # 契約情報を設定 client.trial # 宛先を設定 client.to << CustomersMailCloud::MailAddress.new(params[:to], params[:name]) # 件名を設定 client.subject = 'テストメール from Google Cloud Functions by Ruby' # 本文を設定 client.text = 'これはテストメールの本文です' # 送信 client.send end
これをテスト起動します。環境変数を準備した上で実行します。
API_USER=api@smtps.jp \ API_KEY=API_KEY \ FROM_ADDRESS=info@smtps.jp \ FROM_NAME=Admin \ bundle exec functions-framework-ruby --target hello_cmc
ローカルでは http://localhost:8080/ で実行できるようになります。
$ curl -XPOST -H "application/json" -d '{"to": "to@smtps.jp", "name": "ユーザ"}' http://localhost:8080/
これでメールが送れれば問題ありません。
Google Cloud Functionsへデプロイ
ではデプロイ操作です。まず .env.yaml というファイルを用意します。これはGoogle Cloud Functionsの環境設定情報を書いたファイルです。内容は次のようになります。
API_USER: api@smtps.jp API_KEY: API_KEY FROM_ADDRESS: info@smtps.jp FROM_NAME: Admin
ファイルを設置したら、デプロイします。今回は認証なしでも実行できるようにしていますが、必要に応じて制御してください。
gcloud functions deploy hello_cmc \ --runtime ruby26 \ --trigger-http \ --allow-unauthenticated \ --env-vars-file .env.yaml
デプロイしたら実行してみます。
curl -XPOST \ -H "Content-Type: application/json" \ -d '{"to": "user@smtps.jp", "name": "ユーザ"}' \ https://us-central1-aaaaa.cloudfunctions.net/hello_cmc
結果、メールの送信IDが返ってくれば完成です。
{"id":"<ba81ea70-6d36-11eb-9ae3-9ca3ba30b181@mta04.sandbox.smtps.jp>"}
まとめ
Google Cloud Functionsを使えばスケーラブルなメール送信が容易に実現できます。急激にアクセスが増えるお問い合わせフォームでも問題なく運用できるでしょう。Customers Mail Cloudも大量のメール配信を安定して実現します。
ぜひGoogle Cloud FunctionsとCustomers Mail Cloudを組み合わせてメール送信を行ってください。