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関数の実行ロールにする。
テスト
テストして成功することを確認。
コメント