こんにちは、スタートアップテクノロジー開発部のてつです。
前回のTwitterAPI編に引き続き、Amazon ComprehendとAWS Lambdaを使ってTwitterでつぶやいた内容がネガティブな発言でないかを確認できるAPIの続きを作成していきます。
今回はバックエンド環境を整えていきます。
目次
Lambda関数作成
Lambda関数を新規に作成します。作成する関数は
- Twitterから指定したIDの直近のツイートを取得する
- 取得したツイートをAmazon Comprehendで感情分析する
の2点の処理を行います。
Lambda関数の新規作成
AWSマネジメントコンソールにアクセスします。
上部の検索ボックスでサービス名Lambda
で検索し、Lambda
をクリックします。

関数の作成
をクリックします。

関数名
に任意の関数名を入力します。ランタイム
にPython3.7を選択します。
その後、関数の作成
をクリックします。

しばらく時間がかかりますが、デフォルトのHello, worldを表示するコードが入力された状態の関数が作成されます。

必要ライブラリのインストール
作成した関数のページの上部のLayers
をクリックします。

レイヤーの追加
をクリックします。

レイヤーソースにARNを指定
を選択し、ARNを指定
のテキストボックスに
arn:aws:lambda:ap-northeast-1:770693421928:layer:Klayers-python38-tweepy:1
を入力します。入力したら追加
をクリックします。

Lambda関数のコードのを修正

コードソースの画面で、以下のコードに置き換えます。
// 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
をクリックします。

Changes deployed
が表示されたらデプロイ完了です。

Lambda関数にComprehendを実行する権限を追加する
設定
タブをクリックし、左ペインでアクセス権限
をクリックします。実行ロール
のロール名をクリックします。

新しいウィンドウでロール画面が開くので、ポリシーをアタッチします
をクリックします。

検索ボックスにcomprehend
を入力してポリシーを検索し、ComprehendFullAccess
にチェックを入れポリシーのアタッチ
をクリックします。

ポリシー一覧にComprehendFullAccess
が追加されていることを確認します。

テストの設定と実行
コードソースのウィンドウに戻り、Test
> Configure test event
をクリックします。

任意のイベント名を入力し、テキストフィールドに
{
"twitter_id": "<実在する任意のTwitterアカウント名>"
}
を入力し、作成
をクリックします。

Test
をクリックし、テストを実行します。

statusCode
が200、body
にツイート内容がJSONで取得できることを確認します。

API Gateway作成
作成したLambda関数を外部から実行するために、API Gatewayを作成します。
API Gateway新規作成
関数の画面で、トリガーを追加
をクリックします。

- トリガーの設定で、
API Gateway
を選択します。 - APIで
APIを作成する
を選択します。 - APIタイプで
REST API
を選択します。 - セキュリティで
オープン
を選択します。
上記の後、追加
をクリックします。

メソッドの作成
作成したAPIGatewayにGETメソッドでアクセスするための設定を追加します。
トリガーが追加されるので、API Gatewayの名前部分をクリックします。

リソースの設定画面に繊維するので、アクション
> メソッドの作成
をクリックします。

メソッドGET
を選択肢、チェックマークをクリックします。

Lambda関数に「Lambda関数作成」で作成した関数名を入力し、保存
をクリックします。

権限付加の確認ダイアログが表示されるのでOK
をクリックします。

クエリパラメータの設定
リクエストのクエリパラメータを受け取るための設定を追加します。
メソッドリクエスト
をクリックします。

クエリ文字列の追加
をクリックします。

名前にtwitter_id
を入力してチェックマークをクリックします。

メソッドの実行
をクリックしてリソースの設定画面に戻ります。

統合リクエスト
をクリックします。

マッピングテンプレート
でマッピングテンプレートの追加
をクリックします。

Content-Type
にapplication/json
を入力し、チェックマークをクリックします。

テンプレートのテキストフィールドに
{
"twitter_id": "$input.params('twitter_id')"
}
を入力し、保存
をクリックします。

CORSの有効化
アクション
> CORSの有効化
をクリックします。

CORSを有効にして既存のCORSヘッダーを置換
をクリックします。

はい、既存の値を置き換えます
をクリックします。

すべての項目にチェックが入ることを確認します。

APIのデプロイ
APIをデプロイします。この項目の操作で外部へのAPI公開が開始されます。
アクション
> APIのデプロイ
をクリックします。

デプロイされるステージにdefault
を選択して、デプロイ
をクリックします。

公開されたAPIのURLが表示されるのでメモしておきます。

ターミナルを起動し、以下の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のメリットと今後の取組み