こんにちは、スタートアップテクノロジー開発部のてつです。

前回のTwitterAPI編に引き続き、Amazon ComprehendAWS Lambdaを使ってTwitterでつぶやいた内容がネガティブな発言でないかを確認できるAPIの続きを作成していきます。

今回はバックエンド環境を整えていきます。

Lambda関数作成

Lambda関数を新規に作成します。作成する関数は

  1. Twitterから指定したIDの直近のツイートを取得する
  2. 取得したツイートを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新規作成

関数の画面で、トリガーを追加をクリックします。

  1. トリガーの設定で、API Gatewayを選択します。
  2. APIでAPIを作成するを選択します。
  3. APIタイプでREST APIを選択します。
  4. セキュリティでオープンを選択します。

上記の後、追加をクリックします。

メソッドの作成

作成したAPIGatewayにGETメソッドでアクセスするための設定を追加します。

トリガーが追加されるので、API Gatewayの名前部分をクリックします。

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

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

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

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

クエリパラメータの設定

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

メソッドリクエストをクリックします。

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

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

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

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

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

Content-Typeapplication/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のメリットと今後の取組み