Amazon ConnectとTwilioの連携

はじめに

こんにちは、中村です。

コンタクトセンター内で電話の後にSMSを送信したいケースがあるかと思います。コンタクトフロー内でLambdaの統合対応することができますが、Twilioへのリクエストを待とうとすると問題が発生します。というのも、コンタクトフローでLambdaを統合する場合、最大8秒の制限があります。そのためSQSへメッセージを送信します。SQSのメッセージをトリガーに別のLambdaを起動して、Twilioへリクエストを送信する形になります。

このような形で作成していきます。

Amazon ConnectとTwilioの連携

Lambda、SQSのリソースをCloudformationを使って作成します。Amazon Connectへの設定は手動で行う必要があります。(LambdaのソースはS3にパブリック公開してあります。)

まずはTwilioへSign upし、自分の電話番号を検証します。トライアル中は、検証した番号にのみ送信が可能です。
画面に沿って適切なものを選択します。(利用する言語やTwilioのどの機能を利用するか等)プロジェクトが作成されたらまずは、Twilioの電話番号を取得します。取得を完了したら、電話番号・Account Sid・Auth Tokenをメモしておいてください。

それではCloudformationを流していきます。先ほどメモした3つをパラメータとして入力します。

---
AWSTemplateFormatVersion: 2010-09-09
Description: Amazon Connect - Integrate with Twilio
Parameters:
  TwilioPhoneNumber:
    Type: String
    Description: Twilio Phone Number
  TwilioAccountSid:
    Type: String
    Description: Twilio Account Sid
  TwilioAuthToken:
    Type: String
    Description: Twilio Auth Token
    NoEcho: true
Resources:
  # SQS
  SMSQueue:
    Type: AWS::SQS::Queue

  # send SQS message
  sendSQSLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: send_sqs_lambda_role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
        - arn:aws:iam::aws:policy/AmazonSQSFullAccess
  sendSQSLambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: sendSQSMessage
      Description: Amazon ConnectからSQSへメッセージを送信します。
      Handler: index.handler
      MemorySize: 128
      Runtime: nodejs8.10
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/send_sqs_lambda_role
      Timeout: 8
      Environment:
        Variables:
          SEND_NUMBER: !Ref TwilioPhoneNumber
          SID: !Ref TwilioAccountSid
          TOKEN: !Ref TwilioAuthToken
      Code:
        S3Bucket: sample-lambda-code-for-blog
        S3Key: sendSQSMessage.zip
  
  # send SMS
  sendSMSLambdaRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: send_sms_lambda_role
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - lambda.amazonaws.com
            Action:
              - sts:AssumeRole
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/CloudWatchLogsFullAccess
  sendSMSLambda:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: sendSMS
      Description: Twilioを使ってSMS送信する
      Handler: index.handler
      MemorySize: 128
      Runtime: nodejs8.10
      Role: !Sub arn:aws:iam::${AWS::AccountId}:role/send_sms_lambda_role
      Timeout: 20
      Environment:
        Variables:
          QUEUE_URL: !Ref SMSQueue
      Code:
        S3Bucket: sample-lambda-code-for-blog
        S3Key: sendSMS.zip
  sendSMSPermission:
    Type: AWS::Lambda::Permission
    Properties:
      FunctionName: !GetAtt sendSMSLambda.Arn
      Action: lambda:InvokeFunction
      Principal: sqs.amazonaws.com
    DependsOn: sendSMSLambda

リソースの作成が完了したら、Amazon Connectの設定をしていきます。インスタンスでAWS Lambdaを追加します。

最後に問い合わせフローでSMS送信するフローを作成し保存して発行します。Lambdaのパラメータは、電話番号とメッセージを検索するキーとしています。

それでは電話してみましょう。電話が切れるとTwilio経由でSMSが送信されます。

まとめ

個人的にSMS送信する場合はこのパターンがいいのかなと思っています。どなたかのお役に立てれば幸いです。

弊社では、Amazon Connectに関するキャンペーンを行なっています。