re:Invent2025ポータルサイトはNotion APIとGitHub Actionsでできている #AWSreInvent

re:Invent2025ポータルサイトはNotion APIとGitHub Actionsでできている #AWSreInvent

re:Inventポータルサイト2025の構築手順をまとめました。ラスベガスとの時差があるなかで、健全な業務のために自動化を行いました。
2025.12.07

背景

re:Inventのポータルサイト構築・運用を2018年から担当しています知恵蔵です。
入社したばかりの頃はイベント参加を経験させてもらい、現地からリアルタイムに更新作業を行っていました。
ですが、ここ数年は現地参加メンバーと連携して、日本から更新作業をしています。
https://classmethod.jp/m/reinvent/2025/

要件を決める

コンテンツの更新タイミングを決める

まず、ラスベガスとの時差があるなかで、どのくらいの頻度で更新するのがよいかを決めました。
例年の傾向として、日本時間の午前2時とかに大きなサービスの発表が出て盛り上がることが多いです。
日本に居る閲覧者が、どのように情報をキャッチアップするのかパターンを考えてみると大きく2つです。

  1. 通勤時間やお昼休みに前日のリリースをチェックする
  2. 寝るのをあきらめた人たちが、公式のリアルタイム配信を視聴する

1の人たちを対象に、日本時間の早朝に更新することを必須としました。

コンテンツの更新方法を決める

ラスベガス入りするメンバーに情報を更新してもらうのですが、メンバーはHTMLを書けないので、会社で導入しているNotionを利用するのが早いだろうと考えました。

構成

下記のしくみでアップ・公開することにしました。

  • Notionページを現地メンバーが更新
  • Notion APIからのデータ取得とHTMLの生成を行う処理を11tyで実装
  • Github Actionsでビルドし、生成したHTMLをS3に配置する
    img-reinvent2025-portal-site_02

構築の流れ

Notionで更新する箇所を決める

今回現地メンバーに更新してもらうのは、イベントスケジュールとトピックスの2つです。(黄色で囲ったところ)
img-reinvent2025-portal-site_01

それに対応する2つのデータベースを用意します。実際のNotionページがこちらです。
img-reinvent2025-portal-site_03

現地メンバーにはNotionデータベースを編集してもらいます。
注意点は、データベースの項目名はAPIデータ取得時に使用してるから変えないでね、ということぐらいです。

Notion APIで取得したデータを利用してHTMLを生成

Notion APIの設定と11tyの構築方法は、以前書いたこちらの記事を参照してください。
https://dev.classmethod.jp/articles/notion-api-11ty-cms/

Notion APIで取得した画像はS3 Presigned URLになり、期限が切れると画像が表示されなくなってしまうので、画像をダウンロードする処理が必要です。こちらの記事を参照してください。
https://dev.classmethod.jp/articles/notion-cms-s3-presigned-url-ai/

GitHub Actionsでビルド、S3にアップ

つづいて、これらの作業の追加として、GitHub Actionsを設定していきます。
GitHubのリポジトリに.github/workflows/reinvent2025.yamlを作成します。(yamlのファイル名は任意です。)
参考サイト:GitHub Actions のクイックスタート

name: Build re:Invent 2025

on:
  schedule: # 毎時0分に実行
+   - cron: '0 * * * *'
  workflow_dispatch: # 手動実行も可能にする

jobs:
  build:
    runs-on: ubuntu-latest

    permissions:
      id-token: write
      contents: read

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      - name: Setup pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9

      - name: Get pnpm store directory
        shell: bash
        run: |
          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV

      - name: Setup pnpm cache
        uses: actions/cache@v4
        with:
          path: ${{ env.STORE_PATH }}
          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
          restore-keys: |
            ${{ runner.os }}-pnpm-store-

      - name: Install dependencies
+       working-directory: 2025
        run: pnpm install --frozen-lockfile

      - name: Run build
        working-directory: 2025
        run: pnpm run build
        env:
+         API_KEY: ${{ secrets.NOTION_API_KEY_REINVENT2025 }}
+         DATABASE_SCHEDULES_ID: ${{ secrets.DATABASE_SCHEDULES_ID }}
+         DATABASE_TOPICS_ID: ${{ secrets.DATABASE_TOPICS_ID }}

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
+         role-to-assume: ${{ secrets.AWS_ROLE_ARN_REINVENT2025 }}
          aws-region: ap-northeast-1

      - name: Upload to S3
        run: |
          aws s3 sync 2025/_site/ s3://xxxxxxxxxx/m/reinvent/2025/ --cache-control "max-age=60" # バケット名は伏せてます

この設定ファイルのポイントはこちらです。

  • - cron: '0 * * * *'
    1時間ごとにビルドを実行しています。
    Notionページの更新をトリガにビルドすることができるオートメーションの機能もありますが、(権限の申請が面倒だったので)今回は使用しませんでした。

  • working-directory: 2025
    環境にあわせて適宜設定してください。2025というディレクトリ配下で11tyを設定しています。

  • API_KEY: ${{ secrets.NOTION_API_KEY_REINVENT2025 }}
    DATABASE_SCHEDULES_ID: ${{ secrets.DATABASE_SCHEDULES_ID }}
    DATABASE_TOPICS_ID: ${{ secrets.DATABASE_TOPICS_ID }}
    role-to-assume: ${{ secrets.AWS_ROLE_ARN_REINVENT2025 }}
    後述するGitHubの「Actions secrets and variables」に設定します。secrets.以降は任意の名前です。
    4つ目はS3にアップするためのIAMロールになります。こちらはAWSアカウントの管理者に発行してもらいました。
    GitHubリポジトリはPrivateの設定にしていますが、環境変数や認証情報をリポジトリに直接PUSHするのは避けています。

こちらの内容でyamlファイルをリポジトリにPUSHします。
GitHubの管理画面のActionsから設定したワークフローが確認できます。
スケジュール以外にも Run workflow から手動実行ができます。
img-reinvent2025-portal-site_05

GitHubの管理画面 Settings - Actions secrets and variables - Actions で先ほどの環境変数や認証情報を設定します。
img-reinvent2025-portal-site_04

この環境構築での注意点が1つあります。
ビルド時に生成される「_site」配下のファイルはgitignoreに登録して、リポジトリで管理しないようにしています。
こちらの記事で紹介してる実装だと、Notion APIで画像を取得する際に、「_site」配下に存在すればダウンロードをスキップする仕様にしています。
リポジトリに画像をあげてしまうとNotionで画像を更新しても、本番では古い画像が表示され続けるといったことが起こります。

現地メンバーの更新を楽にするために工夫したこと

トピックスの画像はNotionページに入れてもらいますが、画像はスマホで撮影したりカメラで撮影したりするので、比率がバラバラになります。(16:9と4:3、ものによってはシェア用画像の1200:630が混在しそう。)
アップする画像の比率を統一してもらうのは手間だと思ったのでCSS側で16:9に揃えて、はみ出た分の切り落としは許容することとしました。

また、YouTube動画も随時アップされていて、これらもポータルサイトに追加していく必要があります。
こちらはre:Invent関連再生リストを作成、YouTubeAPIで取得するようにしています。
動画がアップされたことをこちらに共有してくれなくても自動で追加されるようになります。
img-reinvent2025-portal-site_06

さいごに

こうしてNotion APIとGitHub Actionsで自動化することによって、私は通勤前の早起き手動更新を免れることができたのでした。
クラスメソッドでは他にもイベントLPサイトを制作する機会があるので、人の手を介さなくてよいところは、こういった仕組みを活用していきたいと思いました。おわり。

この記事をシェアする

FacebookHatena blogX

関連記事