GitHubのWiki更新をトリガーにGitHub ActionsでWikiのコンテンツをBedrockナレッジベースに同期してみた
リテールアプリ共創部@大阪の岩田です。
先日こんなブログを書きました。
このブログでは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プロバイダーは事前に以下の要領で作成されていることを前提としています。

以下のコマンドでCFnスタックをデプロイします。
aws cloudformation deploy \
--stack-name <スタック名> \
--template-file template.yaml \
--capabilities CAPABILITY_IAM \
--parameter-overrides GitHubRepo=<対象GitHubアカウントもしくはOrg名>/<対象GitHubリポジトリ名>
GitHubリポジトリにvariablesを登録
ここまでで作成したAWSリソースの情報を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のワークフローを作成します。今回作成したワークフローは以下の通りです。
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ページを作成/更新してみます。前回のブログと同様に昔話をいくつか登録してみました。

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


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

ちゃんと桃太郎を育てたのは、おじいさんとおばあさんです。という回答が返ってきました。
まとめ
今回はGitHubのWikiを対象としましたが、少しワークフローの記述を変えればdocsディレクトリ配下でドキュメントを管理しているようなケースにも対応可能です。
こういう仕組みを作った上で、以下ブログのようにDevOps Agentからナレッジベースを参照できるようにしておくのも面白そうです。







