こんにちは、スタートアップテクノロジー開発部のてつです。
前回のTwitterAPI編に引き続き、Amazon ComprehendとAWS Lambdaを使ってTwitterでつぶやいた内容がネガティブな発言でないかを確認できるAPIの続きを作成していきます。
今回はバックエンド環境を整えていきます。
目次
Lambda関数作成
Lambda関数を新規に作成します。作成する関数は
- Twitterから指定したIDの直近のツイートを取得する
- 取得したツイートをAmazon Comprehendで感情分析する
の2点の処理を行います。
Lambda関数の新規作成
AWSマネジメントコンソールにアクセスします。
上部の検索ボックスでサービス名Lambda
で検索し、Lambda
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/5ca31965335c7cb555ade561ee6c8b1c.png)
関数の作成
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/b2487060c0065ba9ed9e38cb7a81ca89.png)
関数名
に任意の関数名を入力します。ランタイム
にPython3.7を選択します。
その後、関数の作成
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/607afd2d7dd1a11fac7511af2ba4486a.png)
しばらく時間がかかりますが、デフォルトのHello, worldを表示するコードが入力された状態の関数が作成されます。
![](https://t.gyazo.com/teams/startup-technology/63c91ee9f881eb59021c71a6a148d68f.png)
必要ライブラリのインストール
作成した関数のページの上部のLayers
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/fa2b4eee21746caeda7e564733c29f66.png)
レイヤーの追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/8bc20e1337edc3d35779d6606034ce2c.png)
レイヤーソースにARNを指定
を選択し、ARNを指定
のテキストボックスに
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-tweepy:1
を入力します。入力したら追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/0189a096ba01e061f64566285af7ba49.png)
Lambda関数のコードのを修正
![](https://t.gyazo.com/teams/startup-technology/85b640e38d3b952a033a511da3e22574.png)
コードソースの画面で、以下のコードに置き換えます。
// lambda_function.py
import json
import tweepy
import boto3
REGION = 'ap-northeast-1'
LANGUAGE_CODE = 'ja'
def fetch_tweet(twitter_id):
consumer_key ="<CONSUMER_KEY>"
consumer_secret ="<CONSUMER_SECRET>"
access_token="<ACCESS_TOKEN>"
access_token_secret ="<ACCESS_TOKEN_SECRET>"
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)
tweets = api.user_timeline(screen_name=twitter_id, count=10, page=1)
return tweets
def detect_text_sentiment(text_list):
comprehend = boto3.client('comprehend', region_name=REGION)
response = comprehend.batch_detect_sentiment(TextList=text_list, LanguageCode=LANGUAGE_CODE)
return response
def lambda_handler(event, context):
tweets = fetch_tweet(event["twitter_id"])
text_list = list(map(lambda t: t.text, tweets))
sentiment = detect_text_sentiment(text_list)
result = list(zip(text_list, list( map(lambda t: t['Sentiment'], sentiment['ResultList']))))
return {
'statusCode': 200,
'body': json.dumps(result)
}
- <CONSUMER_KEY>
- <CONSUMER_SECRET>
- <ACCESS_TOKEN>
- <ACCESS_TOKEN_SECRET>
の部分は、`TwitterのProject&Apps設定`で取得した値に置き換えてください。
置き換えたらDeploy
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/b3a4f04c8e52a49bfa8c725f5d6fa52f.png)
Changes deployed
が表示されたらデプロイ完了です。
![](https://t.gyazo.com/teams/startup-technology/4ed5a3b85d184c1f78d76e85ba804ac3.png)
Lambda関数にComprehendを実行する権限を追加する
設定
タブをクリックし、左ペインでアクセス権限
をクリックします。実行ロール
のロール名をクリックします。
![](https://t.gyazo.com/teams/startup-technology/09f23de5f86b2132057e32da772419a0.png)
新しいウィンドウでロール画面が開くので、ポリシーをアタッチします
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/570469f4f2b4159715b04d30391e79b5.png)
検索ボックスにcomprehend
を入力してポリシーを検索し、ComprehendFullAccess
にチェックを入れポリシーのアタッチ
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/75f31f46d62f1a9a7fd399dcf915cd08.png)
ポリシー一覧にComprehendFullAccess
が追加されていることを確認します。
![](https://t.gyazo.com/teams/startup-technology/1401e1054ba6dbe3200c95cc16802a42.png)
テストの設定と実行
コードソースのウィンドウに戻り、Test
> Configure test event
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/dff5599a4c22240e3da0efd3ff584dd3.png)
任意のイベント名を入力し、テキストフィールドに
{
"twitter_id": "<実在する任意のTwitterアカウント名>"
}
を入力し、作成
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/3f2c1929cec69108ada6af0436e545a7.png)
Test
をクリックし、テストを実行します。
![](https://t.gyazo.com/teams/startup-technology/4e81f0d494aa51aa825ff4f6fc3b3032.png)
statusCode
が200、body
にツイート内容がJSONで取得できることを確認します。
![](https://t.gyazo.com/teams/startup-technology/9d6fc31846c5a1a963616ec7b550a5ff.png)
API Gateway作成
作成したLambda関数を外部から実行するために、API Gatewayを作成します。
API Gateway新規作成
関数の画面で、トリガーを追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/1e5a071155d316facabae6286f61982f.png)
- トリガーの設定で、
API Gateway
を選択します。 - APIで
APIを作成する
を選択します。 - APIタイプで
REST API
を選択します。 - セキュリティで
オープン
を選択します。
上記の後、追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/9663a3a31e9182e3c17c7d065487d987.png)
メソッドの作成
作成したAPIGatewayにGETメソッドでアクセスするための設定を追加します。
トリガーが追加されるので、API Gatewayの名前部分をクリックします。
![](https://t.gyazo.com/teams/startup-technology/bb0a552cdba3656154584dd94865b181.png)
リソースの設定画面に繊維するので、アクション
> メソッドの作成
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/6e2b9d8adf970b70768017187e308ac4.png)
メソッドGET
を選択肢、チェックマークをクリックします。
![](https://t.gyazo.com/teams/startup-technology/91d027c314cc7e99158b4beb0f957e5d.png)
Lambda関数に「Lambda関数作成」で作成した関数名を入力し、保存
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/cf2c03e6a4128aaabf3abc616b3cd232.png)
権限付加の確認ダイアログが表示されるのでOK
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/593a6cb8af8e8aa688a665ed2269d634.png)
クエリパラメータの設定
リクエストのクエリパラメータを受け取るための設定を追加します。
メソッドリクエスト
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/0036702a1d29ae478219b29245c3e7ec.png)
クエリ文字列の追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/bf503570f5a7f991e95d149e92ee8818.png)
名前にtwitter_id
を入力してチェックマークをクリックします。
![](https://t.gyazo.com/teams/startup-technology/b096561930dcd24f93f6e89f6b751810.png)
メソッドの実行
をクリックしてリソースの設定画面に戻ります。
![](https://t.gyazo.com/teams/startup-technology/8ead9131e381c8c4227bdd9c2d07ccd7.png)
統合リクエスト
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/6b3b5efc58be6f7bd6a40db10ca55731.png)
マッピングテンプレート
でマッピングテンプレートの追加
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/52ade91bd445a359923cd1dd2b10dd0a.png)
Content-Type
にapplication/json
を入力し、チェックマークをクリックします。
![](https://t.gyazo.com/teams/startup-technology/4e595cf0b0d7e0b373770da1eb6ef9bb.png)
テンプレートのテキストフィールドに
{
"twitter_id": "$input.params('twitter_id')"
}
を入力し、保存
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/4d60f8a0db935cf40eee1697b9aafbb8.png)
CORSの有効化
アクション
> CORSの有効化
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/ab7e51921456afc1280abfe576f30c8e.png)
CORSを有効にして既存のCORSヘッダーを置換
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/cdf7f5575983221519646331a2b2913d.png)
はい、既存の値を置き換えます
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/90589d708d102e3379badbd49271a64a.png)
すべての項目にチェックが入ることを確認します。
![](https://t.gyazo.com/teams/startup-technology/e6d0855e70676a3217c980093cf1c22f.png)
APIのデプロイ
APIをデプロイします。この項目の操作で外部へのAPI公開が開始されます。
アクション
> APIのデプロイ
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/2a4262c853d137b99eb96a0bc1228b46.png)
デプロイされるステージにdefault
を選択して、デプロイ
をクリックします。
![](https://t.gyazo.com/teams/startup-technology/695155c7a736b091fda740752a6b74c9.png)
公開されたAPIのURLが表示されるのでメモしておきます。
![](https://t.gyazo.com/teams/startup-technology/12a4b4beb661deeb40c684ce05323fcf.png)
ターミナルを起動し、以下のcurlコマンドを実行します。
$ curl --location --request GET '<生成されたURL>/<作成したLambda関数名>' \
--header 'Content-Type: application/json' \
--data-raw '{
"twitter_id": "<情報を取得したいTwitterのアカウントID>"
}'
<情報を取得したいTwitterのアカウントID>のツイートと、ツイートそれぞれの感情分析結果を取得できることを確認します。
以上でAPIの作成が完了です。
さいごに
今回はバックエンド側の設定を行いました。
次回はいよいよ最終章、フロントエンド環境編をお送りいたします。
次回の更新が待ちきれない方は、ぜひ以下のおすすめ記事をご覧ください。
「 スタテクDevMeetUP 【ハンズオン】AWS Lambdaで自然言語解析APIを作ろう!」を開催しました
国内2人目のAWSサーバレスヒーロー松井が語るAmplifyのメリットと今後の取組み