GitHubのWiki更新をトリガーにGitHub ActionsでWikiのコンテンツをBedrockナレッジベースに同期してみた

GitHubのWiki更新をトリガーにGitHub ActionsでWikiのコンテンツをBedrockナレッジベースに同期してみた

GitHubのWiki更新をトリガーにGitHub Actionsを起動、WikiコンテンツをS3バケット経由でS3 Vectorsに同期することで、Bedrockナレッジベースとして活用できる仕組みを構築してみました。
2026.03.02

リテールアプリ共創部@大阪の岩田です。

先日こんなブログを書きました。

https://dev.classmethod.jp/articles/github-wiki-put-to-s3-vectors-by-actions/

このブログではGitHub Actionsから直接S3 Vectorsを操作しましたが、実際にS3 Vectorsを利用するユースケースを考えると、Bedrockナレッジベース経由で利用するケースが多いのではないでしょうか?

ということで、前回のブログを少し修正してGitHubのWikiをBedrockナレッジベースに同期する構成を作ってみました。

構成概要

こんな構成を作ります。

構成概要

  • GitHubのWikiが更新されたことをトリガーにGitHub Actionsのワークフローを起動
  • Wikiの内容をS3バケットに同期
  • 上記S3バケットのコンテンツをS3 Vectorsに同期

やってみる

ということで実際にやっていきます。

CFnテンプレート

以下のCFnテンプレートを利用してBedrock ナレッジベース関連のリソースを作成します。

CFnテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  GitHubRepo:
    Type: String
Resources:
  KnowledgeBase:
    Type: AWS::Bedrock::KnowledgeBase
    Properties:
      Description: GitHub Wikiのナレッジベース
      KnowledgeBaseConfiguration: 
        Type: VECTOR
        VectorKnowledgeBaseConfiguration:
          EmbeddingModelArn: arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0
      Name: gh-wiki-knowledge-base
      RoleArn: !GetAtt KnowledgeBaseRole.Arn
      StorageConfiguration: 
        Type: S3_VECTORS
        S3VectorsConfiguration:
          IndexArn: !Ref KnowledgeBaseIndex
  KnowledgeBaseRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: bedrock.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: KnowledgeBaseS3VectorsPolicy
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - aws-marketplace:Subscribe
                  - aws-marketplace:ViewSubscriptions
                  - aws-marketplace:Unsubscribe
                Resource: 
                  - '*'                  
              - Effect: Allow
                Action:
                  - bedrock:InvokeModel
                Resource: 
                  - arn:aws:bedrock:ap-northeast-1::foundation-model/amazon.titan-embed-text-v2:0
              - Effect: Allow
                Action:
                  - s3:ListBucket
                  - s3:GetObject
                Resource: 
                  - !Sub arn:aws:s3:::${KnowledgeBaseSrc}
                  - !Sub arn:aws:s3:::${KnowledgeBaseSrc}/*
              - Effect: Allow
                Action:
                  - s3vectors:DeleteVectors
                  - s3vectors:GetIndex
                  - s3vectors:GetVectors
                  - s3vectors:QueryVectors
                  - s3vectors:PutVectors
                Resource: 
                  - !Ref KnowledgeBaseIndex
  KnowledgeBaseSrc:  
    Type: AWS::S3::Bucket
  KnowledgeBaseVectorDB:  
    Type: AWS::S3Vectors::VectorBucket
  KnowledgeBaseIndex:
    Type: AWS::S3Vectors::Index
    Properties:
      DataType: float32
      Dimension: 1024
      DistanceMetric: euclidean
      MetadataConfiguration: 
        NonFilterableMetadataKeys: 
          - AMAZON_BEDROCK_TEXT
          - AMAZON_BEDROCK_METADATA
      VectorBucketArn: !Ref KnowledgeBaseVectorDB
  KnowledgeBaseDataSource:
    Type: AWS::Bedrock::DataSource
    Properties:
      DataSourceConfiguration: 
        Type: S3
        S3Configuration:
          BucketArn: !GetAtt KnowledgeBaseSrc.Arn
      KnowledgeBaseId: !Ref KnowledgeBase
      Name: gh-wiki-data-source
  GHActionsRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Federated: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:oidc-provider/token.actions.githubusercontent.com
            Action:
              - sts:AssumeRoleWithWebIdentity
            Condition:
              StringEquals:
                "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
              StringLike:
                "token.actions.githubusercontent.com:sub": !Sub "repo:${GitHubRepo}:*"
      Policies:
          - PolicyName: s3
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - s3:PutObject
                    - s3:DeleteObject
                    - s3:ListBucket
                  Resource: 
                    - !Sub arn:${AWS::Partition}:s3:::${KnowledgeBaseSrc}
                    - !Sub arn:${AWS::Partition}:s3:::${KnowledgeBaseSrc}/*
          - PolicyName: bedrock
            PolicyDocument:
              Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - bedrock:StartIngestionJob
                  Resource: 
                    - !Sub "arn:${AWS::Partition}:bedrock:${AWS::Region}:${AWS::AccountId}:knowledge-base/${KnowledgeBase}"

※GitHub用のOIDCプロバイダーは事前に以下の要領で作成されていることを前提としています。

GitHubのOIDCプロバイダー

以下のコマンドでCFnスタックをデプロイします。

aws cloudformation deploy \
  --stack-name <スタック名> \
  --template-file template.yaml \
  --capabilities CAPABILITY_IAM \
  --parameter-overrides GitHubRepo=<対象GitHubアカウントもしくはOrg名>/<対象GitHubリポジトリ名>

GitHubリポジトリにvariablesを登録

ここまでで作成したAWSリソースの情報をGitHubリポジトリのvariablesに登録しておきます。

GitHubリポジトリにVariablesを登録

それぞれの意味は以下の通りです。

  • AWS_ROLE_ARN: GitHub ActionsからAssume RoleするためのIAMロールのARN
  • DATA_SOURCE_ID: BedrockナレッジベースのデータソースID
  • KNOWLEDGE_BASE_ID: BedrockナレッジベースのID
  • VECTOR_SRC_BUCKET: Bedrockナレッジベースのデータソースとして利用するS3バケットの名前

これで後ほど作成するワークフローに必要な情報がvarsから取得できるようになります。

GitHub Actionsのワークフローを作成

続いてGitHub Actionsのワークフローを作成します。今回作成したワークフローは以下の通りです。

.github/workflows/main.yaml
name: Sync Bedrock Knowledge Base

on: gollum
permissions:
  id-token: write
jobs:
  job:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: ${{ vars.AWS_ROLE_ARN }}
          aws-region: ap-northeast-1
      - name: Clone Wiki
        run: git clone https://github.com/${{ github.repository }}.wiki.git --depth 1
      - name: Sync wiki to S3
        run: |
          REPO_NAME=$(echo "${{ github.repository }}" | cut -d '/' -f 2)
          cd ${REPO_NAME}.wiki
          aws s3 sync . s3://${{ vars.VECTOR_SRC_BUCKET }} --exclude ".git/*" --delete
        shell: bash
      - name: Sync Knowledge Base
        run: |
          aws bedrock-agent start-ingestion-job --knowledge-base-id ${{ vars.KNOWLEDGE_BASE_ID }} --data-source-id ${{ vars.DATA_SOURCE_ID }}  

基本的に前回のブログと同じようなことをしています。前回のブログではシェルスクリプトを使ってマークダウンファイルをベクトル化&S3 Vectorsに登録していましたが、シンプルにaws s3 syncでマークダウンファイルをS3に同期する構成に変わっています。ソースとなるS3バケットへの同期が完了したら aws bedrock-agent start-ingestion-jobでソースバケットからS3 Vectorsにコンテンツを同期します。

注意点としてGitHub Actionsの環境だとマークダウンファイルのタイムスタンプがチェックアウト実行時のタイムスタンプになるため、aws s3 syncを実行すると毎回全ファイルが同期対象となってしまいます。オプションに--size-onlyを付与すればタイムスタンプは無視してファイルサイズのみで同期対象かを判定できますが、ファイルサイズが同一であれば内容が変わっていても同期対象外と判定されるリスクもあります。今回は簡単な検証が目的なので毎回全ファイルが同期されることを許容してシンプルにaws s3 syncを実行する構成としています。

Wikiページを作成/更新してみる

準備ができたらWikiページを作成/更新してみます。前回のブログと同様に昔話をいくつか登録してみました。

Wikiページを作成するところ

GitHub Actionsのログを確認すると以下のように出力されていました。Wikiのコンテンツがナレッジベースに同期されていることが分かります。

GitHub Actionsのログ

ナレッジベースの同期状況

ナレッジベースのテスト

GitHub Wikiのコンテンツがナレッジベースに同期できたので動作確認です。桃太郎を育てたのが誰か聞いてみました。

ナレッジベースのテスト

ちゃんと桃太郎を育てたのは、おじいさんとおばあさんです。という回答が返ってきました。

まとめ

今回はGitHubのWikiを対象としましたが、少しワークフローの記述を変えればdocsディレクトリ配下でドキュメントを管理しているようなケースにも対応可能です。

こういう仕組みを作った上で、以下ブログのようにDevOps Agentからナレッジベースを参照できるようにしておくのも面白そうです。

https://dev.classmethod.jp/articles/devops-agent-with-agentocore-and-knowledgebase/

参考

この記事をシェアする

FacebookHatena blogX

関連記事