はじめまして。プロセスエンジニアリング部の谷です。
当社では、電話システムにAmazon Connectを使っています。 この社内Amazon Connectに電話がかかってきた際に、Slackに履歴が通知される仕組みが既にあり、Salesforceに登録があればその情報が表示されるが、ない場合には登録をしなければいけません。この電話帳への登録を楽にして、みんなが登録してくれるようにソースコードを改修していきます。 方法は後ほど。
構成図
今回の改修に必要な部分のみになります。シンプルですね。
- お客様から社内Amazon Connectに電話がかかってくる
- Amazon ConnectからAWS Lambdaを呼び出す
- Salesforceの情報が保存されているデータベースに電話番号検索をかけ、振る舞いを決定する
- 決定された振る舞い毎に、Slackに通知する ←ここを変えそう
デプロイには、Serverless FrameworkとLambdaを使います。
実践いってみよう!!!
配属されて初めての案件で、Pythonのデータ型、条件分岐も覚えているか怪しい、ライブラリやServerless Frameworkは、初めましての状態だったので、いきなり改修に入るのではなく、この案件で必要になる要素をキャッチアップするところから始めました。
準備
手元の環境は次の通りです。
- Windows 10 Pro
- Python: 3.7.4
- pipenv: 2018.11.26
- AWS CLI: 2.0.7
- node.js: 10.20.0
- serverless framework(sls)
- Framework Core: 1.67.3
- Plugin: 3.6.6
- SDK: 2.3.0
- Components: 2.29.1
slackclientを使ってSlackにメッセージを通知してみる
slackclient pipを使ってslackclientをインストールします。
import slack client = slack.WebClient(token='xxxx-1111111111-22222222222-333333333333-444444444444444444444') response = client.chat_postMessage( channel='#ext-scratch', username='notice', icon_emoji=':bell:', text='Hello World')
Slackへ通知がきました!
Serverless Frameworkを使って、Lambda Functionをデプロイしてみる
サーバーレスのデプロイを学んでいきます。
handler.pyに'Hello World'を表示するコードを書いて実行したら、どこに出力されるのか調べてみる
Lambdaのログ出力に表示されました!
LambdaからSlackに通知してみる
import json import os import slack client = slack.WebClient(token='xxxx-1111111111-22222222222-333333333333-444444444444444444444') def slack(event,context): response = client.chat_postMessage( channel='#ext-scratch', username='notice", icon_emoji=':bell:', text='Hello Lambda World')
Slackへ通知がきました!
この辺りで、エラーにハマりました。
[ERROR] Runtime.ImportModuleError: Unable to import module ‘slack’: No module named ‘slack’
あれ?slackclientをインストールしたはずなのになぜ? インストール済みのパッケージを確認してみましょう。
$ pip show slackclient Name: slackclient Version: 2.5.0 Summary: Slack API clients for Web API and RTM API Home-page: https://github.com/slackapi/python-slackclient Author: Slack Technologies, Inc. Author-email: opensource@slack.com License: MIT Location: c:\users\user\.virtualenvs\hello-sbevfnvp\lib\site-packages Requires: aiohttp Required-by:
インストールされていますね。
Serverless Frameworkは、必要なファイルをzipファイルに圧縮してくれるので、zipフォルダにslackclientに関するファイルがあるはずです。 確認してみるとありません。
つまり、.serverless下のzipフォルダにslackclientのファイルがないため、エラーが表示されたと推測できます。
私の場合は.virtualenvsの下にあったので、読み込まれなかったみたいです。
pip show slackclient
のLocationの項目をみると、.virtualenvsの下にあることがわかります。
そのため、slackclientのファイルをserverless.ymlと同じ階層に置いてあげれば、エラーが解消されます。
インストールしたはずのパッケージが使えない場合は、どこにあるか場所に注意してみてください。
対象のソースコードを改修する
いよいよ、本題です。 改修箇所にアタリをつけていきます。関係する部分がわかっていれば、スムーズに進めることができます。
Slackへの通知内容を変更するFunctionの引数に「登録のない電話番号」と「すでに登録済みの電話番号」のサンプルデータを入れてローカルで実行してみる
登録のない電話番号だった場合 すでに登録済みの電話番号だった場合 それぞれ違うメッセージがSlackに送信されます。 なんとなく、どの箇所が関係するのかアタリがついてきました。
登録のない電話番号からかかってきた際に、メッセージの末尾に絵文字が表示されるように改修する
↑こちらを表示させます。
return '{endpoint} 発信元:{src} {src_country} {name_part} :arrow_forward_gray:{act}/{actval} {ctr_link} {additional_info}{additional_info_2} {sf_register_link}'.format( endpoint=endpoint_emoji, src=src, src_country=src_country, name_part=name_part, act=params['action_label'], actval=params['action_value'], ctr_link=ctr_link, additional_info=additional_info, additional_info_2=additional_info_2, sf_register_link=sf_register_link )
Slackに通知されるメッセージの基本の形です。formatメソッドにより、{endpoint}や{name_part}などに、データが入ることでSlackへの通知メッセージが作られています。 そのため、上記の1行目の末尾に{sf_register_link}を書き加え、登録のない電話番号の条件式のif文に、登録画面のリンクが付いたSF登録絵文字をsf_register_linkに代入するコードを書きます。 SF登録絵文字をクリックするとSalesforceの登録画面に飛びます。 成功ですね!!!
コードのレビューなどを終えたら、
sls [--profile profile名] --stage stage名 --config serverless.stage名.yml --verbose deploy
をして本番環境にデプロイが完了です!!!
終わりに
何とか1ヵ月に間に合ってよかったです!
絵文字を追加するというちょっとしたことだったかもしれませんが、様々な社内ツールをつなげて改善していくことに、関心を持つきっかけになったと思います。 これとこれつなげたら面白いかも、楽になるかもというものを探していきたいです。