Twitter APIをLambdaから呼び出し、結果をS3に保存する

スポンサーリンク
AWS
スポンサーリンク

Twitter APIを利用できるようになった(Twitter APIを利用してアカウントデータ、ツイートデータを取得してみた)ので、AWS上のLambdaに置いてみることにしました。以前使用したAWS SAM(S サーバーレスアプリケーションモデル (AWS SAM)を触ってみた)を利用してTwitter APIを動かし、その結果をS3に置くことを目標にしてみました。

CloudWatchでバッチ処理させるとTwitterの遷移を見ることができます。フォロワーをKPIにしている場合、どの施策の結果でフォロワー数が変化しているのかを可視化するのに使えます。自社だけでなく、競合のアカウントのチェックにも使えそうです。

スポンサーリンク

SAMテンプレートの作成

AWS SAMテンプレートを作成。

(base) ~/Desktop/AWS_SAM_Twitter $ sam init --runtime python3.7
[+] Initializing project structure...

Project generated: ./sam-app

Steps you can take next within the project folder
===================================================
[*] Invoke Function: sam local invoke HelloWorldFunction --event event.json
[*] Start API Gateway locally: sam local start-api

Read sam-app/README.md for further instructions

[*] Project initialization is now complete

ライブラリのインストール

利用するライブラリをインストール。

(base) ~/Desktop/AWS_SAM_Twitter/sam-app/hello_world $ cat requirements.txt 
tweepy
boto3
datetime
(base) ~/Desktop/Project/sam-app/hello_world $ pip install -r requirements.txt -t ./
lib-1.3.0 s3transfer-0.2.1 six-1.13.0 tweepy-3.8.0 urllib3-1.25.7
(base) ~/Desktop/AWS_SAM_Twitter/sam-app/hello_world $ ls
DateTime                             pkg_resources
DateTime-4.3.dist-info               python_dateutil-2.8.1.dist-info
PySocks-1.7.1.dist-info              pytz
__init__.py                          pytz-2019.3.dist-info
__pycache__                          requests
app.py                               requests-2.22.0.dist-info
bin                                  requests_oauthlib
boto3                                requests_oauthlib-1.3.0.dist-info
boto3-1.10.45.dist-info              requirements.txt
botocore                             s3transfer
botocore-1.13.45.dist-info           s3transfer-0.2.1.dist-info
certifi                              setuptools
certifi-2019.11.28.dist-info         setuptools-42.0.2.dist-info
chardet                              six-1.13.0.dist-info
chardet-3.0.4.dist-info              six.py
dateutil                             socks.py
docutils                             sockshandler.py
docutils-0.15.2.dist-info            tweepy
easy_install.py                      tweepy-3.8.0.dist-info
idna                                 urllib3
idna-2.8.dist-info                   urllib3-1.25.7.dist-info
jmespath                             zope
jmespath-0.9.4.dist-info             zope.interface-4.7.1-py3.7-nspkg.pth
oauthlib                             zope.interface-4.7.1.dist-info
oauthlib-3.1.0.dist-info

template.yamlの修正

s3 = boto3.resource(‘s3’)を入れるとデフォルトの3秒ではタイムアウトになってしまうので、template.yamlでタイムアウト時間を3秒から30秒に変更します。

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: >
  sam-app

  Sample SAM Template for sam-app

# More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst
Globals:
  Function:
    Timeout: 30

ソースの作成

今回はしていませんが、OAuth認証情報は暗号化しておくと安心です。

参考:AWS Key Management Serviceを使ってセキュアにAWS LambdaからTweetする

import json
import tweepy
import boto3

def lambda_handler(event, context):
    # OAuth認証情報のセット
    consumer_key="hogehoge"
    consumer_secret="hogehoge"
    access_token="hogehoge"
    access_token_secret="hogehoge"

    # OAuth認証
    auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)
    api = tweepy.API(auth)

    # Twitter情報
    tweet_user = []
    user=api.get_user(screen_name = "@hatosuke3")
    tweet_user.append([user.id,user.screen_name,user.description,user.statuses_count,user.friends_count,user.followers_count,user.favourites_count,user.listed_count])
    contents = ','.join(list(map(str, tweet_user[0])))

    # S3への格納
    s3 = boto3.resource('s3')
    bucket = 'hatosuke'
    key = 'test_20191229.txt' 
    
    obj = s3.Object(bucket,key) 
    obj.put( Body=contents ) 


    return 0

ローカル環境でのテスト

ローカル環境でテスト。

(base) ~/Desktop/AWS_SAM_Twitter/sam-app $ sam local invoke HelloWorldFunction -e event.json
2019-12-29 08:31:22 Invoking app.lambda_handler (python3.7)
2019-12-29 08:31:22 Found credentials in shared credentials file: ~/.aws/credentials

Fetching lambci/lambda:python3.7 Docker container image......
2019-12-29 08:31:25 Mounting /Users/hatosuke/Desktop/AWS_SAM_Twitter/sam-app/hello_world as /var/task:ro,delegated inside runtime container
START RequestId: def4e107-b8e4-187a-7b63-61b70f74bfb2 Version: $LATEST
END RequestId: def4e107-b8e4-187a-7b63-61b70f74bfb2
REPORT RequestId: def4e107-b8e4-187a-7b63-61b70f74bfb2	Init Duration: 2346.29 ms	Duration: 5596.25 ms	Billed Duration: 5600 ms	Memory Size: 128 MB	Max Memory Used: 43 MB	

0

S3上にファイルが作成される

DLするとTwitter APIで取得した情報が書き込まれている

ビルド&デプロイ

ビルドする。

(base) ~/Desktop/AWS_SAM_Twitter/sam-app $ sam package --s3-bucket hatosuke --output-template-file out.yaml

Uploading to 3b1924ef828c0f276df2f2adff844419  11390182 / 11390182.0  (100.00%)
Successfully packaged artifacts and wrote output template to file out.yaml.
Execute the following command to deploy the packaged template
aws cloudformation deploy --template-file /Users/hatosuke/Desktop/AWS_SAM_Twitter/sam-app/out.yaml --stack-name <YOUR STACK NAME>

デプロイする。

(base) ~/Desktop/AWS_SAM_Twitter/sam-app $ sam deploy --template-file out.yaml --capabilities CAPABILITY_IAM --stack-name AWS-SAM-Twitter

Waiting for changeset to be created..
Waiting for stack create/update to complete
Successfully created/updated stack - AWS-SAM-Twitter

S3にスタックがアップされる。

Lambda関数として展開される

Lambdaでロールの付与

LambdaからS3を操作するので、AmazonS3FullAccessポリシーをアタッチしたロールを作る。そのロールをアップしたLambda関数の実行ロールにする。

テスト

テストして成功することを確認。

コメント

タイトルとURLをコピーしました