天気が悪いですね。吉田です。
僕はAWSサービスでは Lambda が特に好きです。使いこなしているかは置いておいて
最近LambdaでPythonが使えるようになったせいでしょうか。
LambdaネタはやたらPythonで聞きます!
Node.jsってなんかかっこいい!って思ってた僕は時代遅れなのでしょうか!?(狼狽)
そんな不安を覚えたためPython歴4時間程度の僕がPythonで頑張ってみました。
0.目的
awsSNSをトリガーとしてLambdaを発火しSNSのメッセージをTwitterに投稿します。
イメージはこんな感じ
今回はサンプルのSNSメッセージを使って 「Hello from SNS!」と自分のアカウントに投稿するまでをやってみます。
前提条件
- Twitterのアカウントを持っている
- Twitterのアカウントに電話番号登録が済んでいる
- Pythonが導入されていてpipコマンドも使える
1.Twitter投稿準備
Twitterを操作するための準備をします
上記URLにアクセスするとTwitterのdeveloperサイトに飛びます。
Twitterのアプリ登録とか昔やったな・・・って方はここ
TwitterのアカウントにSign Inしていない場合は右上のSign Inをクリックしサインインしてください。
書き終わったら下の方にスクロールし、注意に目を通せるなら目を通してAgreeする。
上記4つのキーが確認できればTwitterでの準備は完了です。
2.Lambda Functionの作成準備
Twitterの準備ができたので早速書いていきます。
使用環境:Mac
先ずは作業ディレクトリを作成し、その中に使用する外部モジュールをインストールします。
今回はホームの直下に作成しました。
ディレクトリを作成したらスクリプトを記述するファイルを作成しておきます。
mkdir lambda_function`
cd lambda_function
vi function.py
次にlambdaで使用する外部モジュールのインストールをします。
今回は「Requests-OAuthlib」というモジュールを使うのでこれをインストールします。
pip install requests_oauthlib -t ./
先ほど作成したディレクトリ内でコマンドを叩いてください
-t オプションのあとにカレントディレクトリを指定することでインストールできます。
3.fnction.py
今回書いたスクリプトがこちら
from requests_oauthlib import OAuth1Session
# Consumer Key : CK
# Consumer Secret : CS
# Access Token : AT
# Accesss Token Secert : AS
CK = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CS = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
AT = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
AS = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
URL = 'https://api.twitter.com/1.1/statuses/update.json'
def handler(event, context):
msg = event['Records'][0]['Sns']['Message']
params = {"status": msg }
twitter = OAuth1Session(CK, CS, AT, AS)
req = twitter.post(URL, params = params)
if req.status_code == 200:
return msg
else:
return req.status_code
このスクリプトのおかげでPython童貞がPython歴4時間に昇格しました。
いやー、やっぱ動かないね!これだけでも(汗
URLは投稿用の特殊なURLらしいです。
4.作成した環境をZip化してAWSへ
では今回作成した環境をzip化してAWSへ持って行きます
注意としては 作ったディレクトリの中身を圧縮しないとモジュールが見つからないと怒られます
これで1時間ほどハマりました・・・
cd lambda_function
zip -r myfunc.zip ./
圧縮するzipファイル名は適当で大丈夫です。
ポイントはハンドラーの名前です。function.handlerになる理由は書いてあるとおりです。
あとはCreate Functionをすれば完成です。
4.Test
ちゃんとログが出ています。
Twitterを確認すると・・・
できていますね!
このアプリですが、テストメッセージで全く同じものを送信しようとすると403エラーが帰ってきて投稿できませんでした。仕様かしら?
やったーーーーーー!!!!
できたぞ!
例えばこれをBOTOを使ってAWS環境で自分が立ててるEC2の数なんかをTweetすると消し忘れとかも防げそうですよね?
何に使うかは別としてPythonで動くものができてよかったよかった。
参考
Twitterアプリケーションの作成(Consumer key、Consumer secret、Access token、Access token secretの確認方法)