【2025年最新版】X Bot を作りながら学ぶ AWS ドリル - #3 Amazon DynamoDB を活用して Noon re:Promo Bot(正午の再掲くん)を作ろう

こんにちは、@ketancho です。X Bot を作りながら学ぶ AWS ドリルシリーズとして、2つの記事を書いてきましたが、

www.ketancho.net

www.ketancho.net

今回はその第3弾として、Amazon DynamoDB を活用した Bot を作っていこうと思います。ぜひ実際に手を動かしながら読んでいただければと思います。

基本的には各回独立した記事にしておりますので、この記事から初めていただくことができるのですが、X の設定だけ必要になりますので、実際に試していただく際は、連載初回の

この2箇所だけは先にご覧いただければと思います。それではやっていきましょう!

▼ この記事の目次

この記事で行うこと&追加する X Bot の機能

この記事では、毎日特定の時間に、事前に幾つか用意した文面からランダムにポストする機能を Bot に追加していきます。 私は、これまでこのブログや note に書いた記事を、お昼休みに皆さまに共有する機能にしようと考え、Noon re:Promo Bot(正午の再掲くん) と名付けてみました。

  • Amazon DynamoDB テーブルにポストしたい文面を Item として幾つか追加しておく
  • Amazon EventBridge を活用し、毎日 12:00 に AWS Lambda を定期実行する
  • 先ほどのテーブルからランダムに Item を取得し、X にポストする

この記事で利用する AWS サービス

  • AWS Lambda
  • AWS CloudShell
  • Amazon EventBridge
  • Amazon DynamoDB ← New!!

Amazon DynamoDB テーブルを作成する

マネージメントコンソールの Amazon DynamoDB の画面に遷移してください。

こちらで「テーブルの作成」をクリックします。

テーブル名は XBot25NoonRePromoTBL とし、その下のパーティションキーは ContentId, その右側は 数値 を選んでください。

続いて、今回は Amazon DynamoDB の無料枠 を活用して実装を進めたいので、テーブルのキャパシティをあらかじめ(最小限に)決める形で設定を進めていきます。

下の方にスクロールし、今回はテーブル設定で 設定をカスタマイズ を選択してください。その後、読み込み/書き込みキャパシティの設定部分で プロビジョンド を選択してください。

読み込みキャパシティ、書き込みキャパシティのいずれも Auto Scaling を オフ、プロビジョンドキャパシティーユニットを 1 にしてください。

ここまで設定できましたら、一番下までスクロールし テーブルの作成 をクリックしましょう。ここまでで DynamoDB テーブルが作成できました。

DynamoDB テーブルに Item を追加する

続いて、作成したテーブルに Item を追加していきます。今回は正午の再掲くんに紹介してもらう私の記事を幾つか追加していきます。私のサンプルをそのまま使っていただいてもいいですし、皆さまの再掲したい情報に置き換えていただくのももちろん Welcome です。ランダムに選ばれるので、少なくとも3-4つの Item は追加しておきましょう。

まず、先程作った DynamoDB テーブルの作成が終わっていれば状態列がアクティブになっているので、テーブル名 XBot25NoonRePromoTBL をクリックしてください。

テーブルアイテムの探索 をクリックすると、

項目がないと表示されrますので、右上の 項目を作成 をクリックしましょう。

先ほどテーブル作成時に設定したパーティションキー(主キーのようなもの)ContentId に加えて、投稿する内容を表す PostText を追加したいので、右上の 新しい属性の追加 から 文字列 を選択してください。

下記のように入力したのち、

  • ContentId: 0
  • PostText:
【2025年最新版】X Bot を作りながら学ぶ AWS ドリル - #1 X API の初期設定 & AWS Lambda を使って Hello World ポストする
https://www.ketancho.net/entry/2025/03/12/080000

項目を作成 をクリックしましょう。こちらで1つ目の Item ができました。続けて、3つほど Item を追加しましょう。

  • ContentId: 1
  • PostText:
AWSを学ぶ上でやってよかった勉強法6選(2025年最新版)
https://www.ketancho.net/entry/2025/04/02/075000
  • ContentId: 2
  • PostText:
エンジニアリングマネージャーとして読んでよかった4冊 (+αの5冊)
https://www.ketancho.net/entry/2025/03/19/080000
  • ContentId: 3
  • PostText:
コーチングを仕事に取り入れる、はじめの一歩
https://note.com/ketancho/n/nee4f34f6f9cf

このように複数の Item ができれば OK です。今回の実装上、ContentId は0からスタートし、連番の形で採番する必要がある点にご注意ください。また、X の仕様上、140文字を超えるポストはできません。後ほどの Lambda 関数で30-40文字ほど追加するので、ここでは100文字以内になるように Item を作りましょう。

AWS Lambda 関数のひな形を作成する

AWS Lambda の画面に遷移し、下記の条件で Lambda 関数を作成してください。

  • 関数名 : x-bot-25-noon-repromo
  • ランタイム : Python 3.13
  • アーキテクチャ : x86_64

(Lambda 関数の作成手順がいまいち分からん、という方は 連載初回の AWS Lambda 関数のひな形を作成する をご確認ください。)

続いて、AWS CloudShell を起動し、下記のコマンドを実行してみてください。(今回も Tweetpy モジュールをインストールします。)

mkdir x-bot-25-noon-repromo
cd x-bot-25-noon-repromo/
pip3 install -U pip
pip install tweepy -t ./
touch lambda_function.py
zip -r x-bot-25-noon-repromo.zip ./
aws lambda update-function-code --function-name x-bot-25-noon-repromo --zip-file fileb://x-bot-25-noon-repromo.zip

Lambda 関数から DynamoDB テーブルにアクセスできるよう Lambda 関数に権限を与える

これまでの AWS ドリル連載では、Lambda 関数が他の AWS サービスを呼び出すことはありませんでしたが(前回は Amazon EventBridge から 呼び出されていた)、今回は DynamoDB テーブルから Item を取得したいので、その権限を付与していきます。

Lambda 関数の画面の上部にスクロールし、設定 タブから アクセス権限 を選択、ロール名 をクリックしましょう。

IAM ロールの画面の許可ポリシーから、許可を追加ポリシーをアタッチ としてください。

ポリシーの追加画面にて、検索窓に dynamodb と入力 し、表示された中から AmazonDynamoDBReadOnlyAccess にチェックを入れ ましょう。その後、許可を追加 をクリックします。

以上で今回必要な権限を Lambda 関数に付与することができました。

投稿文を取得し、X にポストする AWS Lambda 関数を実装する

最後に、先ほどひな形を作成した Lambda 関数 x-bot-25-noon-repromo の具体的な実装を行います。もし、実装の部分はチャレンジしたい!という方は、ここで記事を読むのを一時中断し、コーディングしてみてもらってもいいかもしれません。

それでは、私が作った参考ソースコードを載せておきます。(なお、生成 AI 先生に簡単なコードレビューはしてもらっていますが、変数名など拙い部分はご容赦ください。また、この条件下だと動き変にならない?ということにお気づきになられたら、こっそり教えて下さい🙏)

こちらのソースコードを先ほどの Lambda 関数に貼り付けていただき、忘れずに Deploy しておきましょう。(X の API Key も忘れずに皆さまのものに置き換えてくださいね!)

import json
import tweepy
import random
import boto3

dynamodb = boto3.resource('dynamodb')
noon_repromo_table = dynamodb.Table('XBot25NoonRePromoTBL')

# API Key, Access Token (本来、ハードコーディングするのは望ましくありません。連載の中で修正していきます。)
consumer_key = '*Input Your API Key*'
client_secret = '*Input Your API Key Secret*'
access_token = '*Input Your Access Token*'
access_token_secret = '*Input Your Access Token Secret*'

def lambda_handler(event, context):
    """
    - Lambda 関数が呼び出された(後ほど毎日12時ちょうどに呼び出されるようにします)ときに、XBot25NoonRePromoTBL の Item 数を取得する
    - その値を Max (正確には Max -1 )とした乱数を取得する
    - その結果が ContentId となっているレコードを取得し、PostText を取得する
    - X に Post する
    """

    tweet_text='正午の再掲くんです🤖🕛️今日のお昼に読んでいただきたい記事はこちら!\n\n'

    noon_repromo_table_count = noon_repromo_table.scan()['Count']
    random_number = random.randrange(noon_repromo_table_count)
    response = noon_repromo_table.get_item(Key={'ContentId': random_number})

    tweet_text = tweet_text + response['Item']['PostText']

    tweepy_client = tweepy.Client(
        consumer_key=consumer_key,
        consumer_secret=client_secret,
        access_token=access_token,
        access_token_secret=access_token_secret
    )
    
    tweepy_client.create_tweet(
        text=tweet_text
    )

Lambda 関数の実装ができたら、このタイミングで試し打ちしてみましょう。下記のようにポストされれば成功です!🎉

注)続けて同じポストができない縛りがありますので、念のためこの試し打ちのツイートは削除しておいてもいいかもしれません。(このあとの毎日12時の実行で、たまたま同じ Item が選ばれてしまうかもしれないので。)

毎日12:00 に Lambda 関数が起動するよう、Amazon EventBridge の設定を行う。

Lambda 関数が12時に起動するよう、下記の設定を追加してください。

  • ルール: 「新規ルールを作成」を選択
  • ルール名: every-day-at-1200
  • スケジュール式: cron(0 3 ? * * *)

設定方法がいまいちわからない.. という方は、前回の記事の Amazon EventBridge を活用し、毎時0分に Lambda 関数が起動するようにする を参考にして設定してみてください。

以上で今回の実装は完了です。

X Bot の動きを確認する

さて、実際にうまく動いているかを確認していきましょう。12時のタイミングで、このようにポストされたら成功です🎉

Next Challenge のススメ

最後に、今回の記事に関連した +α の学び・チャレンジを紹介させていただきます。+α に取り組むことで、学習の効果が2倍にも3倍にもなると思いますので、ぜひ取り組んでいただければと思います。もちろん、私が挙げていないような内容でも、皆さまの関心や業務に応じた内容にしていただくのも Welcome、むしろその方がいいまであるかもしれません。

  • Amazon DynamoDB の他の使い方について調べてみましょう。他の機能にはどんなものがあるでしょうか?
  • 今の実装では、同じポストが2日以上続いてしまうことがありえます。これを防ぐにはどんな実装が考えられるでしょうか?

まとめ

X Bot を作りながら学ぶ AWS ドリル の第3弾として、事前に幾つか用意した文面からランダムにポストする Noon re:Promo Bot(正午の再掲くん) 機能を追加しました。ぜひ、今回の学びを活かした面白い X Bot を作っていただき、私までご紹介いただければとても嬉しいです!

次回はまた別の AWS サービスを使って、X Bot を成長させていこうと思います。このようなハンズオン形式で、実際に動くものを作りながら AWS を学ぶ記事を、今後も不定期連載していこうと思います。もし気に入っていただけましたら こちらからこのブログの読者 になっていただく and/or 私の X(Twitter) をフォロー していただけたら嬉しいです🙌

それでは!