シンプル・充実なREST APIで送信できる日本向けSMS配信サービス Soracom Cloud SMS Delivery を試してみた

2022.11.21

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。

SMS(ショートメッセージサービス)は元々スマートフォン同士の短いテキストメッセージのやりとりに利用されてきましたが、近年は多要素認証のワンタイムパスワードの発行や電話番号の正当性確認などWebシステムとの連携に用途が広がってきています。このようなシステム連携用途のSMSのことをA2P(Application to Phone)と呼び、REST APIで手軽にA2Pを実装できるSMS配信サービスがSoracom Cloud SMS Deliveryです。

Soracom Cloud SMS Delivery の特徴

あまたあるSMS A2Pサービスの中でSoracom Cloud SMS Deliveryは後発にはなりますが、以下の特徴があります。

  • シンプルで充実したAPI: SDKなど追加コンポーネントは不要で好みのHTTPライブラリを用いて手軽に実装できます。SORACOMのAPIは設計がシンプルで一貫性があり、扱いやすさに定評があります
  • 日本国内キャリア専用: 国内からの送信なので、安定した送達が期待できます

今回評価させていただく機会がありましたので、試してみた様子をご紹介します。

手順1. SAMユーザー作成とトークン取得

SORACOMのAPIにはAWS IAMのような認証認可の仕組みとしてSAM(SORACOM Access Management)があり、SMS DeliveryのAPIを許可するSAMユーザーを事前に作成しておきます。以下のポリシーを権限設定タブの直接指定画面に貼り付けて保存します。

{
  "statements": [
    {
      "api": "SmsA2p:*",
      "effect": "allow"
    }
  ]
}

[保存]ボタンで権限設定を保存、[認証情報]タブ - [認証キーを生成]をクリックし認証キーIDと認証キーシークレットをコピーしておきます。

SORACOM APIの呼び出しには、APIキーと一次認証情報であるAPIトークンを利用します。APIキーおよびAPIトークンはAuth APIで取得するほかに、WebブラウザでSORACOM APIリファレンスにアクセスし取得する方法があります。今回はAPIリファレンスで試してみます。

画面上部の[注意点を理解して認証する]ボタンをクリックし先ほど控えておいた認証キーIDと認証キーシークレットを貼り付け、[認証]をクリックします。

認証が成功すると、元の画面のテキストボックスとテキストエリアにAPIキー(api-で始まる文字列)とAPIトークン(長い文字列)が表示されます。

この2つの文字列を、SMS A2P APIの呼び出しに付与して利用します。

手順2. SMS A2P APIの呼び出し

ではSMS A2P APIを呼び出してSMSメッセージを送ってみましょう。今回はMacbookのcURL(HTTPのコマンドラインクライアント)で試してみます。

リクエストの要件は以下の通りです。

  • リクエストパス: POST /v1/sms_a2p
  • X-Soracom-API-Keyヘッダ: 手順1で控えておいたAPIキー
  • X-Soracom-Tokenヘッダ: 手順1で控えておいたAPIトークン
  • リクエストボディー: JSON形式で以下の要素を含めます
    • to: 送信先電話番号を国番号(+81)から090の1桁目を省略し、配列で指定する。最大10件まで
    • payload: メッセージ本文の文字列。UTF-8で記述し、SORACOM側でUCS-2にエンコードし送信します *1
% curl -X POST 'https://api.soracom.io/v1/sms_a2p' \
  -H 'X-Soracom-API-Key: api-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' \
  -H 'X-Soracom-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
  -H 'Content-Type: application/json' \
  -d '{ "to": [ "+8190XXXXXXXX"], "payload": "hello world" }'

[{"messageId":"sms-5629d611-ce04-4a94-95dc-2349a06b4892","to":"+8190XXXXXXXX","status":"pending","numberOfSegments":1}]%

SMSメッセージの送信は非同期で行われるため、送達確認はレスポンスに含まれるメッセージIDを含むステータスAPIを呼び出して確認できます。

% curl https://api.soracom.io/v1/sms_a2p/sms-5629d611-ce04-4a94-95dc-2349a06b4892 \
  -H 'X-Soracom-API-Key: api-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' \
  -H 'X-Soracom-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
  -H 'Content-Type: application/json'

{"messageId":"sms-5629d611-ce04-4a94-95dc-2349a06b4892","to":"+8190XXXXXXXX","status":"delivered","numberOfSegments":1}%

レスポンスのstatusdelivered(送信完了)になっていることがわかりますね。また、送達確認はWebhookによるプッシュ通知に対応しています。メッセージ送信時にHTTPSのエンドポイントを指定すると、ステータス変更時にPOSTリクエストで通知されます。今回はAWS Lambda関数URLを用意して試してみました。実行ログにイベントオブジェクトを表示するシンプルなプログラムです。

index.js

exports.handler = async (event) => {
    console.log(event);
    const response = {
        statusCode: 200,
        body: 'well done!',
    };
    return response;
};

SMSメッセージ送信時にcallbackパラメータでLambda関数URLを指定します。

% curl -X POST 'https://api.soracom.io/v1/sms_a2p' \
  -H 'X-Soracom-API-Key: api-XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' \
  -H 'X-Soracom-Token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
  -H 'Content-Type: application/json' \
  -d '{ "to": [ "+8190XXXXXXXX"], "payload": "hello world", "callback": "https://XXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/" }'

[{"messageId":"sms-5b000e82-54d5-4f90-96db-f733a8843b1c","to":"+8190XXXXXXXX","status":"pending","numberOfSegments":1}]%

Lambdaの実行ログに以下が表示されました。リクエストボディ(body要素)にステータスAPIと同等のJSONが入っているのがわかりますね。

2022-10-27T11:42:32.280Z	e35655e6-31df-404f-ac90-e0edd9424bef	INFO	{
  version: '2.0',
  routeKey: '$default',
  rawPath: '/',
  rawQueryString: '',
  headers: {
    'content-length': '119',
    'x-amzn-tls-cipher-suite': 'ECDHE-RSA-AES128-GCM-SHA256',
    'x-amzn-tls-version': 'TLSv1.2',
    'x-amzn-trace-id': 'Root=1-635a6ea8-1b20fb240afe9b3d04945122',
    'x-forwarded-proto': 'https',
    host: 'XXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws',
    'x-forwarded-port': '443',
    'content-type': 'application/json',
    'x-forwarded-for': 'XX.XX.XX.XX',
    accept: 'application/json, text/plain, */*',
    'user-agent': 'SORACOM'
  },
  requestContext: {
    accountId: 'anonymous',
    apiId: 'XXXXXXXXXXXXXXXXXXXXXXXXXX',
    domainName: 'XXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws',
    domainPrefix: 'XXXXXXXXXXXXXXXXXXXXXXXXXX',
    http: {
      method: 'POST',
      path: '/',
      protocol: 'HTTP/1.1',
      sourceIp: 'XX.XX.XX.XX',
      userAgent: 'SORACOM'
    },
    requestId: 'e35655e6-31df-404f-ac90-e0edd9424bef',
    routeKey: '$default',
    stage: '$default',
    time: '27/Oct/2022:11:42:32 +0000',
    timeEpoch: 1666870952275
  },
  body: '{"messageId":"sms-5b000e82-54d5-4f90-96db-f733a8843b1c","to":"+8190XXXXXXXX","status":"delivered","numberOfSegments":1}',
  isBase64Encoded: false
}

何通か送信してみたところで、SMSの送信先電話番号である手元のスマートフォンを確認してみると...

参考 キャンペーンAPIによるバッチ送信

先ほどのSMS A2Pの送信APIは宛先指定が最大10件のため、多数の電話番号宛てにSMSメッセージを一斉送信する用途には不向きです。Soracom Cloud SMS Deliveryには一斉送信向けのキャンペーンAPIがあり、一度の送信リクエストで最大100件へのSMSメッセージを送信が可能です。

まとめ

REST APIで手軽にA2Pを実装できるSMS配信サービスSoracom Cloud SMS Deliveryを試してみた様子をご紹介しました。 Limited Preview(申請して利用するサービス)なので、興味を持たれた方はソラコムに問い合わせてみましょう!あと、ソラコムさん(SMSではなくセルラーですが)500万回線突破&上場申請おめでとうございます!

参考URL

脚注

  1. パラメータ指定でGSM-7も選択可