AWS Lambda(Python)からTwitterに投稿する
「GoogleフォームからAPI Gatewayで作成したREST APIにPOSTリクエストする」の続きです。
この部分を作ります。
「PythonでTwitter API を利用していろいろ遊んでみる」を参考にさせていただきました。
目次
Twitterアプリケーション(認証情報)の取得
対象アカウントでTwitterにログインして、こちらhttps://developer.twitter.com/en/appsにアクセスしました。
[Create an app]を押下しました。
なんで使うんだ?と聞かれたようなので、「趣味でボット作成」としました。
電話番号の紐付けが必要なようですので、紐付けして画面更新して、下の方で国を選択して、[Next]ボタンを押下しました。
Twitter APIを使う理由を200文字以上で英語で書いて、とありましたので、Google翻訳に頼って書きました。
The specifics(詳細)セクションは1つだけYesでした。
「ツイート機能を使いますか?使うならどう使いますか?」と来たので、上記と同じことを書きました。
申請が終わったようです。
メールが届いて、[Confirm]しました。
もう一度、https://developer.twitter.com/en/appsにアクセスして、[Create an app]ボタンを押下しました。
アプリ名、内容、URLが必須でした。
あと、使い方も必須でした。
[Keys and tokens]タブに、API keyとAPI secret keyがありました。
[Generate]ボタンで、Access token とAccess token secretも発行しました。
AWS Secrets Mangerの準備
Twitter APIの4つの認証情報は、AWS Secrets Managerで管理することにしました。
[新しいシークレットを保存する]ボタンを押下しました。
シークレットの種類は、「その他のシークレット(APIキーなど)」を選択しました。
Twitter API の4つのキーをキーバリューで入力します。
暗号化キーはデフォルトのままにしておきました。
名前とタグを設定しました。
ローテーションは無効にしました。
そのうち、トークンの再発行をするLambdaとかを動かすかもですが。
できました。
サンプルコード付きです。
親切です。
AWS Lambda Layersの準備
requests とrequests-oauthlib のLayersがあると便利そうなので、まとめて作りました。
開発環境のmacで作業しました。
1 2 3 4 |
$ mkdir python $ pip install requests requests-oauthlib -t python $ zip -r python.zip python/ |
pythonディレクトリごと、zipにして、Layersにアップロードしました。
IAMロール
Lambda用のIAMロールとして、AWSLambdaBasicExecutionRoleと、以下のインラインポリシーを設定しました。
SecretsManagerから認証情報を取得するためのポリシー
1 2 3 4 5 6 7 8 9 10 11 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:LiveDelivery/TwitterAPIKey-*****" } ] } |
SQSキューをトリガーとして設定するためのポリシー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "sqs:ReceiveMessage", "sqs:DeleteMessage", "sqs:GetQueueAttributes" ], "Resource": "arn:aws:sqs:us-east-1:123456789012:LiveTweet" } ] } |
Amazon SNS
SNSのサブスクリプションのSQSは、raw メッセージ配信を有効にしました。
AWS Lambda
事前に準備した、Layers、 IAMロールを設定して、トリガーはSQSにしました。
環境変数は2つ作成しました。
* SECRET_NAME: Secrets Mangerのシークレット名
* LOG_LEVEL: ログレベル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 |
import json import os import boto3 import base64 import logging import traceback from botocore.exceptions import ClientError from requests_oauthlib import OAuth1Session secret_name = os.environ.get('SECRET_NAME') level = os.environ.get('LOG_LEVEL', 'ERROR') def logger_level(): if level == 'CRITICAL': return 50 elif level == 'ERROR': return 40 elif level == 'WARNING': return 30 elif level == 'INFO': return 20 elif level == 'DEBUG': return 10 else: return 0 def get_secret(): session = boto3.session.Session() client = session.client( service_name='secretsmanager' ) try: get_secret_value_response = client.get_secret_value( SecretId=secret_name ) except ClientError as e: raise e else: if 'SecretString' in get_secret_value_response: secret = get_secret_value_response['SecretString'] else: secret = base64.b64decode(get_secret_value_response['SecretBinary']) return secret def lambda_handler(event, context): logger = logging.getLogger() logger.setLevel(logger_level()) logger.debug(event) try: secret = json.loads(get_secret()) logger.debug(secret) twitter = OAuth1Session( secret['api_key'], secret['api_secret_key'], secret['access_token'], secret['access_token_secret'] ) url = "https://api.twitter.com/1.1/statuses/update.json" for record in event['Records']: message = json.loads(record['body']) tweet = '【配信ライブカレンダー新着情報】\n'\ 'https://www.yamamanx.com/delivery_live_calendar/\n'\ '{title}\n{startTime}~\n'\ '{description}'.format( title=message['title'], startTime=message['startTime'], description=message['description'] ) params = { 'status': tweet[:140] } res = twitter.post(url, params = params) logger.debug(res) return { 'statusCode': res.status_code } except Exception as e: logger.error(traceback.format_exc()) raise e |
【配信ライブカレンダー新着情報】https://t.co/Fbk1Bd0TRD
眉村ちあきメジャーデビュー1周年記念ライブ
2020/05/07 18:30:00~
高い歌唱力に加えギターを弾き語りするスタイル、さらにユーモアの— live.calendar.haishin (@LHaishin) May 10, 2020
できました!
最後までお読みいただきましてありがとうございました!
「AWS認定資格試験テキスト&問題集 AWS認定ソリューションアーキテクト - プロフェッショナル 改訂第2版」という本を書きました。
「AWS認定資格試験テキスト AWS認定クラウドプラクティショナー 改訂第3版」という本を書きました。
「ポケットスタディ AWS認定 デベロッパーアソシエイト [DVA-C02対応] 」という本を書きました。
「要点整理から攻略するAWS認定ソリューションアーキテクト-アソシエイト」という本を書きました。
「AWSではじめるLinux入門ガイド」という本を書きました。
開発ベンダー5年、ユーザ企業システム部門通算9年、ITインストラクター5年目でプロトタイプビルダーもやりだしたSoftware Engineerです。
質問はコメントかSNSなどからお気軽にどうぞ。
出来る限りなるべく答えます。
このブログの内容/発言の一切は個人の見解であり、所属する組織とは関係ありません。
このブログは経験したことなどの共有を目的としており、手順や結果などを保証するものではありません。
ご参考にされる際は、読者様自身のご判断にてご対応をお願いいたします。
また、勉強会やイベントのレポートは自分が気になったことをメモしたり、聞いて思ったことを書いていますので、登壇者の意見や発表内容ではありません。
ad
ad
関連記事
-
Going Serverless with AWS(AWS Summit Tokyo 2017)を聞いてきました
AWS Summit Tokyo 2017でセッション「Going Server …
-
Amazon CloudWatch RUMはじめました
新機能 – Amazon CloudWatch RUM をご紹介 2021年12 …
-
WordPress、プラグインのアップデートしてBlue/Greenデプロイ
現在のブログの構成です。 WordPressとプラグインのアップデートをして、デ …
-
AWS Organizationsで新規メンバー登録したアカウントを組織から離して解約
2021年現在ではこの方法しかないと認識していますので書き残します。 そのうち新 …
-
Amazon CloudSearchからAmazon Elasticsearch Serviceへ変えました
全文検索をする必要がありまして、本当はCloudSearchを使い続けたいのです …
-
AWS Toolkit for Eclipseで「Error Message: Unable to find a region via the region provider chain. Must provide an explicit region in the builder or setup environment to supply a region.」
AWS Toolkit for Eclipseをセットアップ(2021年版)の環 …
-
「関西AWSスタートアップ勉強会」に行ってきました
第2回 関西スタートアップAWS勉強会に行ってきました。 akippa 拠点数コ …
-
AWS Cloud9でJavaサンプルを実行する
リモートで共有開発ができるCloud9便利ですね。 Cloud9でJavaのサン …
-
Amazon API GatewayのIAM認証の動作を確認しました
API GatewayのIAM認証は、IAMユーザーが実行できるように認証する、 …
-
AWS Elastic Beanstalkによって作成されたS3バケットはDeleteBucketが拒否されていた
ちょっとした検証をしたあとに、Elastic Beanstalkのアプリケーショ …