Help us understand the problem. What is going on with this article?

[Lambda][Python] LambdaからTwitterに投稿しよう!

More than 5 years have passed since last update.

天気が悪いですね。吉田です。
僕はAWSサービスでは Lambda が特に好きです。使いこなしているかは置いておいて
最近LambdaでPythonが使えるようになったせいでしょうか。

LambdaネタはやたらPythonで聞きます!

Node.jsってなんかかっこいい!って思ってた僕は時代遅れなのでしょうか!?(狼狽)

そんな不安を覚えたためPython歴4時間程度の僕がPythonで頑張ってみました。


0.目的

awsSNSをトリガーとしてLambdaを発火しSNSのメッセージをTwitterに投稿します。

イメージはこんな感じ

プレゼンテーション1.jpg

今回はサンプルのSNSメッセージを使って 「Hello from SNS!」と自分のアカウントに投稿するまでをやってみます。

前提条件

  • Twitterのアカウントを持っている
  • Twitterのアカウントに電話番号登録が済んでいる
  • Pythonが導入されていてpipコマンドも使える

1.Twitter投稿準備

Twitterを操作するための準備をします

https://dev.twitter.com/

上記URLにアクセスするとTwitterのdeveloperサイトに飛びます。

Twitterのアプリ登録とか昔やったな・・・って方はここ

Twitter画面1.jpg

Twitter_Developers2.jpg

TwitterのアカウントにSign Inしていない場合は右上のSign Inをクリックしサインインしてください。

Twitter_Application_Management.jpg

Create_an_application___Twitter_Application_Management.jpg

書き終わったら下の方にスクロールし、注意に目を通せるなら目を通してAgreeする。

sample2yukiyoshid___Twitter_Application_Management.jpg

2sample2yukiyoshid___Twitter_Application_Management.jpg

003.jpg

004.jpg
上記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

今回書いたスクリプトがこちら

function.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ファイル名は適当で大丈夫です。

AWS_マネジメントコンソール.jpg

AWS_Lambda.jpg

AWS_Lambda02.jpg

AWS_Lambda03.jpg

ポイントはハンドラーの名前です。function.handlerになる理由は書いてあるとおりです。

あとはCreate Functionをすれば完成です。

4.Test

テストソースをSNSに指定します。すると・・・
AWS_Lambda-kekka.jpg

ちゃんとログが出ています。
Twitterを確認すると・・・

ミッスッター_ヨーダ__Yuki_BB3_さん___Twitter.jpg

できていますね!

このアプリですが、テストメッセージで全く同じものを送信しようとすると403エラーが帰ってきて投稿できませんでした。仕様かしら?


やったーーーーーー!!!!
できたぞ!

例えばこれをBOTOを使ってAWS環境で自分が立ててるEC2の数なんかをTweetすると消し忘れとかも防げそうですよね?

何に使うかは別としてPythonで動くものができてよかったよかった。

参考

Python で Twitter API にアクセス

Twitterアプリケーションの作成(Consumer key、Consumer secret、Access token、Access token secretの確認方法)

Yuki_BB3
バイクと酒と戦車道 こちらに記載した内容は所属会社とは関係ありません
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away