好きこそものの上手なるby yukichi

プログラミング学習の備忘録。万歳車輪の再発明。

AWS lambdaを使ってみる

元々タスクスケジューラで動かしていたDiscord botAWS lambdaに移行してみたので、メモ📝

1,ライブラリを特定のフォルダにインストールする ↓の場合my_lambda を指定 py -m pip install -r requirements.txt -t ./my_lambda 

2,lambda_function.pyに処理を記載。 function名はlambda_functionとする。

3,lambda_function.pyもmy_lambda フォルダに移動してzipで固める

4、aws lambdaにアップロードする

5,aws上で環境変数を登録する。

環境変数をコード上で呼び出すためには

import os
cousumer_key = os.environ['CONSUMER_KEY']

のように書く AWS Lambda 環境変数の使用 - AWS Lambda

コードはこんな感じ。特定のTwitterアカウントのツイートを取得してbotで表示するもの

import tweepy
import requests
from discordwebhook import Discord
import os

consumer_key = os.environ['CONSUMER_KEY']
consumer_secret = os.environ['CONSUMER_SECRET']
access_token = os.environ['ACCESS_TOKEN']
access_secret = os.environ['ACCESS_SECRET']
webhook_url = os.environ['WEBHOOK_URL']

class TwitterApi:
    def get_latest_tweet(self, account_name):
        auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_secret)
        api = tweepy.API(auth, wait_on_rate_limit=True)

        tweet = api.user_timeline(id=account_name, count=1)[0]
        screen_name = tweet.user.screen_name
        return tweet.text


def lambda_handler(event, context):   
    api = TwitterApi()
    text = api.get_latest_tweet("@xxxxxxx")
    discord = Discord(url=webhook_url)
    discord.post(content=text)

6,デプロイする&テストしてみる。 ここで 401 Unauthorized\n32 - Could not authenticate you が出る。あら認証されてない、おや(;'∀')

7,Twitterの開発者ポータル見ると

This App has violated Twitter Rules and policies. As a result, it can no longer be accessed. For assistance, submit a support ticket

のエラーが。プロジェクト作り直して諸々のキーを再取得

8,環境変数変えてテスト→成功

9,トリガーをイベントで設定 今回は毎日0時に投稿したいので、 cron(00 15 * * ? *) と記載。この時間はUTC time https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/services-cloudwatchevents-expressions.html

10,無事0時に表示、おめでとう㊗

めっちゃ便利やないか、、、今までタスクスケジューラでやってたから、PC起動していないときは実行されなかったんだよね。 やってみようと思ったのは応用情報のシステムアーキテクチャ解いててFaaSについて出てきて、ふむFaaSでbot実行できるのでは? FaaSには

AWS Lambda

Google Cloud Functions

Microsoft Azure Functions

などがあるのね、awsアカウント持ってるしやってみよう、ってなったから。 次はもう一個Discord上で動かしたい処理があるからそれも作ってみよー