COLUMN
Amazon ConnectとSMSを使って簡易的な認証機能を実装してみた
こんにちは!平林です!!
今回はAmazon Connectにおけるユーザー認証でSMSを利用した構成を考えてみました。
近年、多くのシステムで認証が重要視されており、ユーザー認証のセキュリティ強化は不可欠です。特に電話番号を使ったSMS認証は、多要素認証の一環として非常に有効です。
このコラムでは、Amazon Connectを利用して電話による問い合わせや確認を行いつつ、SMSを使って簡易的な認証機能を実装する方法について
- Amazon ConnectやAWSを利用した認証システムに興味がある技術者
- シンプルなSMS認証機能を実装したいエンジニア
- AWSサービスを組み合わせてカスタマーサービスを強化したい方
向けにご紹介します。
また、この構成はコールセンターシステムに簡易的なセキュリティ機能を付加することを目的としています。
1. Amazon ConnectとSMSを使った認証の全体構成図
以下の図は、全体的なアーキテクチャのフローを示しています。Amazon Connectが顧客からの電話を受け、AWS Lambdaを使って認証処理を行い、Amazon SNSを介してSMSで認証コードを送信します。また、DynamoDBには認証データが格納されており、認証コードの管理が行われます。
2. AWS End User Messagingのセットアップ【送信者IDの設定】
AWS End User Messagingは、SMSやプッシュ通知などを送信するためのサービスです。
今回はSMSにて認証コードを通知するため設定します。
End User Messagingのダッシュボードにて「SMSを管理」をクリックします。
下記のようなメッセージが出た場合は、「リクエストを作成」をクリックして、サンドボックス解除の申請をして下さい。
なお申請手順は下記公式ドキュメントを参照してください。
リクエストが承認されると、上記メッセージは無くなり、下記のようにアカウント情報が「本稼働」となります。
次に「送信者ID」→「リクエスト発信者」の順にクリックします。
「Japan(JP)」を選択し、「次へ」をクリックします。
下記を選択し、「次へ」をクリックします。
- テキストメッセージ:チェックを入れる
- メッセージ量:5000件未満
- 本社:ローカル
- 双方向SMS:いいえ
「送信者ID」を選択し、任意の送信者IDを入力し、「次へ」をクリックします。
内容を確認し、「リクエスト」をクリックします。
送信者IDが作成されたことを確認します。
これでAWS End User Messagingのセットアップは終了です。
3. Amazon DynamoDBのセットアップ【レコードの作成】
次に、認証コードや電話番号を保存するためのテーブルをDynamoDBに作成します。
DynamoDBのダッシュボードにて、「テーブル」→「テーブルの作成」の順にクリックします。
下記を入力し、「テーブルの作成」をクリックします。
- テーブル名:VerificationCodesTable
- パーティションキー:CustomerID(文字列)
これでAmazon DynamoDBのセットアップは終了です。
4. AWS Lambdaのセットアップ【コードの作成】
AWS Lambdaでは、認証コードの生成と、DynamoDBやSNSとの連携を行います。
まず認証コード生成および通知用のLambdaを下記のように作成します。
- 関数名:GenerateAndSendVerificationCode
- ランタイム:Python 3.12
- 実行ロール:ポリシーテンプレートを選択し、下記ポリシーを選択
シンプルなマイクロサービスのアクセス権限(DynamoDB)
Amazon SNS 発行ポリシー(SNS) - コード:下記を設定
import json
import boto3
import random
import os
# SNSクライアントの作成
sns = boto3.client('sns')
# DynamoDBのリージョンとテーブル名を環境変数から取得
dynamodb_region = os.getenv('DYNAMODB_REGION', 'ap-northeast-1') # デフォルトは東京リージョン
table_name = os.getenv('DYNAMODB_TABLE_NAME')
# 送信者IDを環境変数から取得
sender_id = os.getenv('SNS_SENDER_ID', 'DefaultSender') # デフォルトのSender ID
# DynamoDBクライアントの作成
dynamodb = boto3.resource('dynamodb', region_name=dynamodb_region)
def lambda_handler(event, context):
# デバッグ用にイベントを出力
print("Received event: " + json.dumps(event))
# 顧客の電話番号を取得
customer_number = event['Details']['ContactData']['CustomerEndpoint']['Address']
# 電話番号のフォーマット調整
if not customer_number.startswith('+'):
customer_number = '+81' + customer_number.lstrip('0')
# 認証コードを生成
verification_code = str(random.randint(100000, 999999))
# DynamoDBに認証コードを保存
table = dynamodb.Table(table_name)
response_dynamo = table.put_item(
Item={
'CustomerID': customer_number,
'VerificationCode': verification_code
}
)
print("DynamoDB put_item response: " + json.dumps(response_dynamo))
# SMS メッセージを送信
message = f"あなたの認証コードは {verification_code} です。"
# Sender IDを環境変数から取得して設定
response_sns = sns.publish(
PhoneNumber=customer_number,
Message=message,
MessageAttributes={
'AWS.SNS.SMS.SenderID': {
'DataType': 'String',
'StringValue': sender_id # 環境変数から取得したSender IDを使用
}
}
)
print("SMS sent: " + json.dumps(response_sns))
# 認証コードを返却
return {
'verification_code': verification_code
}
環境変数は下記を設定します。
- DYNAMODB_REGION:ap-northeast-1
- DYNAMODB_TABLE_NAME:VerificationCodesTable
- SNS_SENDER_ID:HIRABAYASHI
次にユーザーが入力したコードと認証コードを確認するLambdaを下記のように作成します。
- 関数名:ValidateVerificationCode
- ランタイム:Python 3.12
- 実行ロール:ポリシーテンプレートを選択し、下記ポリシーを選択
シンプルなマイクロサービスのアクセス権限(DynamoDB) - コード:下記を設定
import json
import boto3
import os
# DynamoDBクライアントの作成
dynamodb_region = os.getenv('DYNAMODB_REGION', 'ap-northeast-1')
table_name = os.getenv('DYNAMODB_TABLE_NAME')
dynamodb = boto3.resource('dynamodb', region_name=dynamodb_region)
def lambda_handler(event, context):
try:
# 受け取ったイベントデータをデバッグ用に出力
print("Received event: " + json.dumps(event))
# Lambda関数に渡された認証コードを取得
entered_code = event['Details']['Parameters'].get('enteredCode')
# enteredCodeがない場合はエラーメッセージを返す
if not entered_code:
raise ValueError("enteredCode is missing from the event parameters")
# 顧客の電話番号を取得
customer_number = event['Details']['ContactData']['CustomerEndpoint']['Address']
if not customer_number.startswith('+'):
customer_number = '+81' + customer_number.lstrip('0')
# DynamoDBから保存されている認証コードを取得
table = dynamodb.Table(table_name)
response = table.get_item(
Key={'CustomerID': customer_number}
)
# DynamoDBに保存されたコードを取得
if 'Item' not in response:
raise ValueError("No verification code found for this customer")
saved_code = response['Item']['VerificationCode']
# 認証コードの確認
if entered_code == saved_code:
return {"status": "success", "message": "認証に成功しました"}
else:
return {"status": "failure", "message": "認証コードが一致しません"}
except Exception as e:
print(f"Error: {str(e)}")
return {"error": str(e)} # エラーを返す
これでAWS Lambdaのセットアップは終了です。
5. Amazon Connectのセットアップ
5-1. 電話番号の取得
まずは使用する電話番号を取得します。手順に関しては下記コラムを参照ください。
【HOW TO】Amazon Connectの電話番号申請について解説
5-2.フローの設定
次にフローを作成します。手順に関しては下記コラムを参照ください。
Amazon Connectで構築してみた(テレワーク対応コールセンター構築・会社代表電話の在宅対応)
フロー図は下記のように作成します。
これでAmazon Connectのセットアップは終了です。
6. やってみる
6-1. 確認コードを間違った場合
早速Amazon Connectで取得した電話番号に発信します。
SMSで認証コードが送られてくるので、間違った認証コードを入力してみます。
電話を受けるとLambdaにて認証コード(今回は940199)が生成され、ユーザーにSMSで送信されます。
{
"ContactId": "a3392411-5e0b-46ba-a0c3-65cf9fac6ef8",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "InvokeExternalResource",
"Identifier": "fab06cdf-4bd8-43bc-b144-c908e4aff830",
"Timestamp": "2024-10-29T04:51:20.219Z",
"ExternalResults": {
"verification_code": "940199"
},
"Parameters": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:GenerateAndSendVerificationCode",
"ResponseValidation": "ResponseType=STRING_MAP",
"TimeLimit": "8000"
}
}
ユーザー側が「111111」と入力します。
{
"ContactId": "a3392411-5e0b-46ba-a0c3-65cf9fac6ef8",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "InvokeExternalResource",
"Identifier": "GenerateAndSendOTPFunction",
"Timestamp": "2024-10-29T04:51:33.254Z",
"ExternalResults": {
"message": "認証コードが一致しません",
"status": "failure"
},
"Parameters": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:ValidateVerificationCode",
"Parameters": {
"enteredCode": "111111"
},
"ResponseValidation": "ResponseType=STRING_MAP",
"TimeLimit": "8000"
}
}
PINコードが間違っている旨のメッセージが流れます。
{
"ContactId": "a3392411-5e0b-46ba-a0c3-65cf9fac6ef8",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "PlayPrompt",
"Identifier": "5e746fee-a6e6-4f71-bd4a-6be0fce422ac",
"Timestamp": "2024-10-29T04:51:34.593Z",
"Parameters": {
"TextToSpeechType": "text",
"Text": "PINコードが間違っています。",
"Voice": "Mizuki"
}
}
今回は3回間違えると、通話は切断されます。
{
"ContactId": "a3392411-5e0b-46ba-a0c3-65cf9fac6ef8",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "PlayPrompt",
"Identifier": "6be066b0-d5eb-48b7-b16c-db78491350f0",
"Timestamp": "2024-10-29T04:51:49.444Z",
"Parameters": {
"TextToSpeechType": "text",
"Text": "PINコードが間違っております。\nお手数ではありますが、改めてお電話して下さい",
"Voice": "Mizuki"
}
}
6-2. 確認コードが合っていた場合
今度は正しい認証コードを入力します。
電話を受けるとLamdaにて認証コード(今回は416524)が生成され、ユーザーにSMSで送信されます。
{
"ContactId": "e3fd17d5-74e1-4a73-842b-c55c81bc2592",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "InvokeExternalResource",
"Identifier": "fab06cdf-4bd8-43bc-b144-c908e4aff830",
"Timestamp": "2024-10-29T04:52:04.234Z",
"ExternalResults": {
"verification_code": "416524"
},
"Parameters": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:GenerateAndSendVerificationCode",
"ResponseValidation": "ResponseType=STRING_MAP",
"TimeLimit": "8000"
}
}
「416524」と入力します。
{
"ContactId": "e3fd17d5-74e1-4a73-842b-c55c81bc2592",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "InvokeExternalResource",
"Identifier": "GenerateAndSendOTPFunction",
"Timestamp": "2024-10-29T04:52:15.972Z",
"ExternalResults": {
"message": "認証に成功しました",
"status": "success"
},
"Parameters": {
"FunctionArn": "arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:ValidateVerificationCode",
"Parameters": {
"enteredCode": "416524"
},
"ResponseValidation": "ResponseType=STRING_MAP",
"TimeLimit": "8000"
}
}
オペレータへ接続できるようになりました。
{
"ContactId": "e3fd17d5-74e1-4a73-842b-c55c81bc2592",
"ContactFlowId": "arn:aws:connect:ap-northeast-1:XXXXXXXXXXXX:instance/00d7114b-2549-472e-a61c-88277e615265/contact-flow/1e01e6fd-81a2-4dfe-9e85-3ef6cd183e75",
"ContactFlowName": "hirabayashi-flow",
"ContactFlowModuleType": "PlayPrompt",
"Identifier": "04d2aed7-adf8-473b-8dd6-615c1dc9487e",
"Timestamp": "2024-10-29T04:52:16.043Z",
"Parameters": {
"TextToSpeechType": "text",
"Text": "ユーザー認証が完了しました。\nオペレータへお繋ぎいたします。",
"Voice": "Mizuki"
}
}
これでやってみるは終了です。
7. まとめ
今回のコラムでは、Amazon ConnectとSMSを利用した簡易的な認証機能の実装方法を解説しました。
LambdaとAWS End User MessagingとDynamoDBを組み合わせることで、SMS認証をシンプルに導入でき、Amazon Connectの柔軟なフロー設定により、電話番号で認証を行うプロセスが実現できました。
さらなるセキュリティ強化を図る場合は、Voice IDを活用した音声認証を組み込むことを検討してみても良いかと思います。
NTT東日本ではAWSを活用したコールセンター構築の実績が数多くあります。
詳細につきましては、下記の導入事例をご覧ください。
- 株式会社コジマ:クラウド+ボイスワープで改装/移転時のビジネス継続性を向上
無料ダウンロード
自社のクラウド導入に必要な知識、ポイントを
この1冊に総まとめ!
あなたはクラウド化の
何の情報を知りたいですか?
- そもそも自社は本当にクラウド化すべき?オンプレとクラウドの違いは?
- 【AWS・Azure・Google Cloud】
どれが自社に最もマッチするの? - 情シス担当者の負荷を減らしてコストを軽減するクラウド化のポイントは?
- 自社のクラウド導入を実現するまでの具体的な流れ・検討する順番は?
初めての自社クラウド導入、
わからないことが多く困ってしまいますよね。
NTT東日本では
そんなあなたにクラウド導入に必要な情報を
1冊の冊子にまとめました!
クラウド化のポイントを知らずに導入を進めると、以下のような事になってしまうことも・・・
- システムインフラの維持にかかるトータルコストがあまり変わらない。。
- 情シス担当者の負担が減らない。。
- セキュリティ性・速度など、クラウド期待する効果を十分に享受できない。。
理想的なクラウド環境を実現するためにも、
最低限の4つのポイントを
抑えておきたいところです。
-
そもそも”クラウド化”とは?
その本質的なメリット・デメリット - 自社にとって
最適なクラウド環境構築のポイント - コストを抑えるための
具体的なコツ - 既存環境からスムーズにクラウド化を
実現するためのロードマップ
など、この1冊だけで自社のクラウド化のポイントが簡単に理解できます。
またNTT東日本でクラウド化を実現し
問題を解決した事例や、
導入サポートサービスも掲載しているので、
ぜひダウンロードして読んでみてください。
面倒でお困りのあなたへ
クラウドのご相談できます!
無料オンライン相談窓口
NTT東日本なら貴社のクラウド導入設計から
ネットワーク環境構築・セキュリティ・運用まで
”ワンストップ支援”が可能です!
NTT東日本が選ばれる5つの理由
- クラウド導入を
0からワンストップでサポート可能! - 全体最適におけるコスト効率・業務効率の改善を
中立的にご提案 - クラウド環境に問題がないか、
第3者目線でチェック
してもらいたい - 安心の24時間・365日の対応・保守
- NTT東日本が保有する豊富なサービスの組み合わせで
”課題解決”と”コスト軽減”を両立
特に以下に当てはまる方はお気軽に
ご相談ください。
- さまざまな種類やクラウド提供事業者があってどれが自社に適切かわからない
- オンプレミスのままがよいのか、クラウド移行すべきなのか、迷っている
- オンプレミスとクラウド移行した際のコスト比較を行いたい
- AWSとAzure、どちらのクラウドが自社に適切かわからない
- クラウド環境に問題がないか、第3者目線でチェックしてもらいたい
- クラウド利用中、ネットワークの速度が遅くて業務に支障がでている
クラウドを熟知するプロが、クラウド導入におけるお客さまのLAN 環境や接続ネットワーク、
クラウドサービスまでトータルにお客さまのお悩みや課題の解決をサポートします。
相談無料!プロが中立的にアドバイスいたします
クラウド・AWS・Azureでお困りの方はお気軽にご相談ください。