生成系AIを業務利用するための取り組み(実装編)

はじめに

生成系AIを業務利用するための取り組み(準備編)に引き続き、弊社で生成AIを利用するための実装編をまとめます。 生成AI利用環境はAWSから提供されているgenerative-ai-use-cases-jp のリポジトリをフォークして「GenU」と呼ばれるアプリケーションを構築しています。 ゼロから作った箇所はありませんが、カスタマイズした点について記載します。

アーキテクチャ(リポジトリより引用)

目次

変更点の概要

generative-ai-use-cases-jp のリポジトリはREADMEに従ってデプロイするだけで、簡単に生成AI利用環境を構築できますが、 既存の社内セキュリティポリシーや認証要件に合わせて、以下のカスタマイズを行いました。

  • カスタムドメインの設定
  • AWS CDKを用いた導入
  • 社内VPNのみにアクセスを制限
  • CloudFrontのIPv6を無効化
  • Amazon Kendraを無効化
  • 社内IdP(HENNGE)と連携しSSOを設定

カスタムドメインの設定

CloudFrontとAPI Gatewayでカスタムドメインを設定することで呼称を統一し、セキュリティ強化を図りました。

なお、カスタムドメインを設定する際はpackages/cdk/cdk.jsonを編集しますが、適用対象はCloudFrontのみとなりAPI Gatewayは別途対応が必要となります。

cf. カスタムドメインの使用

AWS CDKを用いた導入

AWS CDK (Cloud Development Kit) を使用し、インフラをコードベースで管理できるようにしました。 これにより、リポジトリ内でリソース構成を統一的に管理できるようになりました。 Lambda, API Gateway, S3, CloudFront, DynamoDB などの全てのリソースをCDKで管理しています。 workshopではCloudFormationからデプロイする方法も提示されていますが、バージョン管理やアプリケーションとの関連性も踏まえてCDKとしています。

社内VPNのみにアクセスを制限

業務利用を想定し、社外からのアクセスを制限する設定を行いました。 各リソースへのアクセスをWAFでIP制限し、VPN 内からのみ許可しています。

cf. AWS WAF による制限を有効化する

CloudFrontのIPv6を無効化

社内VPN環境との競合を防ぐため、CloudFrontのIPv6を無効化しました。 packages/cdk/lib/construct/web.ts内で以下の設定を追加しています。

      cloudFrontDistributionProps: {
        enableIpv6: false, // ipv6を無効化
        errorResponses: [

Amazon Kendraを無効化

コスト削減のため、初期構築時はAmazon Kendra を使用しない構成に変更しました。

その後PoC検証のために再度有効化しましたが、コスト削減のためKendraのインデックスを自動で作成・削除するスケジュールを設定しています。

cf. Kendraのインデックスを自動で作成・削除するスケジュールを設定する

社内IdP(HENNGE)と連携しSSOを設定

社内のIDプロバイダー (HENNGE) と連携し、SAML認証によるSSO (シングルサインオン) を実装しました。 README には HENNGE 向けの具体的な手順は記載されていませんでしたが、適宜読み替えることで問題なく設定できました。

cf. SAML 認証

GitHub Actions を用いた CI/CD の自動化

今後、複数人でリリースサイクルを回すことを想定してGitHub Actions を利用し、PR 作成時と Merge 時に自動的にデプロイを実行する仕組みを構築しました。

実装内容

  1. PR 作成時に cdk diff を実行し、変更点を確認
  2. Merge された際に cdk deploy を実行し、自動デプロイ
name: CDK Deploy and Diff Check

on:
  push:
    branches:
      - main
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  id-token: write
  contents: write
  pull-requests: write

jobs:
  CDK_Deploy_Diff:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v2

      - name: Set up Node.js
        uses: actions/setup-node@v2
        with:
          node-version: '18'

      - name: Install dependencies
        run: npm install

      - name: Install AWS CDK
        run: npm install -g aws-cdk

      - name: Configure AWS Credentials
        id: assume_role
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: 'xxxxxx'
          role-to-assume: 'xxxxxx'
          role-session-name: Github-Actions

      - name: Deploy CDK
        run: npm run cdk:deploy_auto_require

      - name: Diff Check
        if: github.event_name == 'pull_request'
        run: npm run cdk:diff

まとめ

以上の実装により、業務利用に適した形で GenU を導入し、アクセス制限・認証・CI/CD の仕組みを整えました。 GenU 自体は非常に使いやすいアプリケーションとして実装されていると感じています。

また、GenU はサーバーレスを主体とした基本的な Web アプリケーションの機能が一通り構築されているため、生成 AI に限らず、さまざまな実装の参考になる点が多いと感じました。

現在、i-plug では Amazon Bedrock をベースとした GenU を社員向けに公開し、実際の業務利用を開始しています。 今後も日々変化する生成 AI の開発状況に対応し、より最適な環境を選択していきたいと考えています。

ⓒ i-plug,inc. All Rights Reserved.