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


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

####LambdaネタはやたらPythonで聞きます！
####Node.jsってなんかかっこいい！って思ってた僕は時代遅れなのでしょうか！？（狼狽）

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

---

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

_イメージはこんな感じ_

![プレゼンテーション1.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/7578babc-2a44-5ead-5e6f-3eb12c99f63d.jpeg "プレゼンテーション1.jpg")

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

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


###1.Twitter投稿準備
Twitterを操作するための準備をします

https://dev.twitter.com/

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

Twitterのアプリ登録とか昔やったな・・・って方は[ここ](https://dev.twitter.com/apps/new)


![Twitter画面１.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a8ed5ef0-66aa-cd9d-fe54-a0189575d1c9.jpeg "Twitter画面１.jpg")

![Twitter_Developers２.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/a55cd0c2-5950-8f31-1532-10013cfe61a0.jpeg "Twitter_Developers２.jpg")

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

![Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/89fb7ed8-dd7f-65f1-06af-b3cc310c5909.jpeg "Twitter_Application_Management.jpg")

![Create_an_application___Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/d84e87b1-6780-f1fa-bf75-9342b3a1469e.jpeg "Create_an_application___Twitter_Application_Management.jpg")

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

![sample2yukiyoshid___Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/2de36269-6b51-0a5c-19a2-1cacb357b72d.jpeg "sample2yukiyoshid___Twitter_Application_Management.jpg")

![２sample2yukiyoshid___Twitter_Application_Management.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/9ef88529-da99-bb93-2cdf-b7db76c5ef8b.jpeg "２sample2yukiyoshid___Twitter_Application_Management.jpg")

![００３.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/faf4e63c-9445-47d8-2ee8-82a45a0ea455.jpeg "００３.jpg")

![004.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/ee594d2b-0c8e-27ff-c143-0861621208f9.jpeg "004.jpg")
上記４つのキーが確認できれば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
今回書いたスクリプトがこちら

```python: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歴４時間に昇格しました。
いやー、やっぱ動かないね！これだけでも（汗
URLは投稿用の特殊なURLらしいです。

###4.作成した環境をZip化してAWSへ
では今回作成した環境をzip化してAWSへ持って行きます
注意としては ___作ったディレクトリの中身を圧縮しないとモジュールが見つからないと怒られます___
これで1時間ほどハマりました・・・

```cd lambda_function```
```zip -r myfunc.zip ./```

圧縮するzipファイル名は適当で大丈夫です。

![AWS_マネジメントコンソール.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/fa003804-a627-f200-a1ba-b3288da87c1f.jpeg "AWS_マネジメントコンソール.jpg")

![AWS_Lambda.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/4a4a5aab-f73f-3f6a-cbbb-5030b5c808f6.jpeg "AWS_Lambda.jpg")

![AWS_Lambda02.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/6e78ebd2-2b01-0ad7-6d94-c43398432052.jpeg "AWS_Lambda02.jpg")

![AWS_Lambda03.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/f4c24b7c-61ee-e30e-fe1b-d361ae627909.jpeg "AWS_Lambda03.jpg")

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

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

###４．Test
テストソースをSNSに指定します。すると・・・
![AWS_Lambda-kekka.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/e182de85-c722-d23b-c4a0-6b1c7b8a31e7.jpeg "AWS_Lambda-kekka.jpg")

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

![ミッスッター_ヨーダ__Yuki_BB3_さん___Twitter.jpg](https://qiita-image-store.s3.amazonaws.com/0/52141/f2164b23-0446-facc-ebab-f843fe508a01.jpeg "ミッスッター_ヨーダ__Yuki_BB3_さん___Twitter.jpg")

できていますね！


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

---

やったーーーーーー！！！！
できたぞ！

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

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



###参考
[Python で Twitter API にアクセス](http://qiita.com/yubais/items/dd143fe608ccad8e9f85)

[Twitterアプリケーションの作成（Consumer key、Consumer secret、Access token、Access token secretの確認方法）](http://website-planner.com/twitter%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%EF%BC%88consumer-key%E3%80%81consumer-secret%E3%80%81access-token%E3%80%81access-token-secret/)