AWSでRAGを作ってみる その1 VPC、Aurora RDB作成

作成手順

この『その1』では下の1,2だけ。

  1. VPC(virtual private cloud)作成
  2. Aurora Serverless v2でPostgreSQL作成
  3. (ec2インスタンス作成<==不要だったので使わない(参考にメモとして残した)
  4. s3に読み込ますpdfを.mdに変換してUploadする
  5. bedrockでvector storeを作り、そのapiも作る
  6. bedrockでllm apiを作る
  7. lambdaで上記2つのapiを使って簡単な質問を送る
  8. Webページに入力された質問をLambdaに送るAPI GatewayでREST APIを作る
  9. AmplifyにAngularベースのWebページを作り、REST APIに質問を送る様にする

VPC作成

default VPCはテストにはいいけど、セキュリティ設定などが緩く、本番では良くないらしいので、VPCを作成してみます。(ここを参考にさせていただきました。 BedrockナレッジベースでAurora Serverlessを使用する際の設定注意点

VPC作成 VPCx2, subnetx2

  1. VPCページに移動
  2. VPCsをクリックし『Create PVC』をクリック
  3. VPC only and more <— moreを選択するとPrivate subnet, Public subnet, Internet gateway, Route tableなど作成できる
  4. name 『myVPC-001-rag』
  5. IPv4 CIDR manual input 『10.0.0.0/16』
  6. No IPv6 CIDR block
  7. Tenancy 『Default』ーーー専用は有料なので共有のdefaultにした
  8. Availabilityを2 <ーーーVectordb Auroraで必要
  9. Public subnetsも2<ーーー将来Webに必要かもしれない
  10. Private subnetsを2 <ーーーVectordb Auroraで必要
  11. NATとVPC endpointsは両方とも0
  • myVPC-002-rag-subnet-private1-ap-northeast-1a, 10.0.128.0/20
  • myVPC-002-rag-subnet-private2-ap-northeast-1c, 10.0.144.0/20
  • myVPC-002-rag-subnet-public1-ap-northeast-1a, 10.0.0.0/20
  • myVPC-002-rag-subnet-public2-ap-northeast-1c, 10.0.16.0/20

Aurora Serverless v2でPostgreSQL作成

BedrockでもワンクリックでAurora Serverless v2でPostgreSQLを作成してくれますが、ACUが0スケーリングしてくれないので、使用していない期間も課金されることになります。 更にDefault VPCなのでセキュリティー的にも心配なので、Aurora Serverless v2でACUが0まで自動スケーリングされる様にしたいと思います。 但し、データベースのサイズを保存する料金は支払わなければなりません。 EBSと同じですね。 ACUはメモリやCPUを使う料金です。 EC2のインスタンス稼働料金と同じです。

ここを参考にさせて頂いています。(BedrockナレッジベースでAurora Serverlessを使用する際の設定注意点

DB subnet group作成

  • Aurora and RDSに入り『Subnet group』に入る
  • 『Create DB Subnet Group』
  • VPC選択
  • Availability zoneを2個選択
  • Private Subnetも2個選択
  • 『Create』
  • myknowledgebase-subnet-group

Aurora Serverless v2作成

  1. Aurora and RDS(Aurora DSQLではありません)に入り左メニューから『Databases』をクリック
  2. 『Create database』
  3. 『Standard create』、『Aurora(PostgreSQL Compatible)』を選択』
  4. Available versionは『16.6』を選択
  5. 遅くても安い『Dev/Test』を選択
  6. DB Cluster identifierを入力。私の場合、『myknowledgebase-vectordb-fp0h-002』としました。
  7. Master useer名はそのまま『postgres』
  8. 『Managed in AWS Secrete Manager』を選択市内とナレッジベースは使えません。
  9. encryption keyは『aws/secretsmanager(default)』のまま
  10. 『Aurora Standard』
  11. 「Serverless v2』
  12. Minimum capacity(ACUs)を『0』にして、Maximum capacity(ACUs)』も念の為『2』にして
  13. Pause after inactivityを『00:30:00』に変更
  14. Availability & durabilityは『Don’t create a Aurora Replica』
  15. Connectivityで
    • 『Don’t connect to an EC2 compute resource』
    • 『IPv4』
    • VPCは上記で作成したVPCを選択
    • 『Create new DB Subnett Group』を選択
    • Public access 『No』
    • VPC security groupは『Choose existing VPC security groups』で先ほど作成した『myPostgreSQL-securityy-group』を選択
    • Zoneは同じ『No preference』選択
    • Certificate authorityはdefaultのまま『rds-ca-rsa2-49-g1(default)
    • 【重要】『Enable the RDS Data API』にチェック
      • 永続的なDB接続でなく必要なときだけ呼び出し
    • Babelfish, authenticationは全てOFFのまま
    • Database Insights StandardもOFFにする
    • Performance InsightsもEnhanced Monitoringもチェックを外す
  16. Monitoringの下のAdditional configurationを開き、Initial database nameを記入する。 『knowledgebase_vectordb_aurora_002』 database nameを記入しないとインスタンスを作成せず動作しない。
  17. 『Create VPC』で生成する
  18. インスタンスの作成で20~25分かかる。 インスタンスがAvailableになったらOK。

Aurora cluster設定

  1. AWS Secrets Managerの画面に入り、作られているSecret nameをクリックして、ARNをコピーしてメモっとく。
  2. Auroraの画面に戻り、作成したdbのdatabase nameもコピーしてメモっておく。
  3. Aurora画面の左メニューからQuery editorを選択
  4. Connect to databaseのポップアップが開くので
    • 作成したDatabase instanceを選択
    • Database usernameは、Connect with Secrets Manager ARNに変更
    • その下のSecrets manager ARN先程コピーしたSecrete Manager ARNを貼り付ける
    • Enter the name of the databaseに先ほどコピーしたdatabase nameを貼り付ける
    • 『Connect database』
  5. 大体5秒くらいでEditorが開くので、書かれている内容はClearして、以下を貼り付けRun。
  6. Result setにバージョン番号が表示されたらOK
    • pgvectorとはPostgreSQLの拡張機能で、直接カラムにRAGに必要なvectorを保存できるようになります。
-- pgvector 拡張機能のインストール
CREATE EXTENSION IF NOT EXISTS vector;

-- pgvector のバージョン確認
SELECT extversion FROM pg_extension WHERE extname='vector';
  1. またclearして以下を実行。 your_password部分はあなたのパスワードに置き換えてください。 そしてそのパスワードは後ほど使うのでメモっておくこと。 私のは数字なしの『hentai』としました。
  2. bedrock_knowledgebaseはスキーマ名。 PostgreSQLはDatabase名の下に複数のスキーマ(名前空間)があり、その下にテーブルを作成します。
  3. bedrock_userはAURORAPostgreSQLにアクセスするユーザー名です。
-- スキーマの作成
CREATE SCHEMA bedrock_knowledgebase;

-- ロールの作成
CREATE ROLE bedrock_user WITH PASSWORD 'your_password' LOGIN;

-- スキーマに対する権限を付与
GRANT ALL ON SCHEMA bedrock_knowledgebase to bedrock_user;

もう一つSecret作成

先程のSecretは、ConsoleからAurora PostgreSQLにアクセスするためのもので、今度はbedrockがPostgreSQLにアクセスするためのSecretを作成します。

  1. Screts manager画面に入り、『Store a new secret』をクリック
  2. Secret typeは『Credentials for Amazon RDS database』を選択
  3. 先程作成したAurora PostgreSQLのスキーマへアクセスするためのUser nameとパスワードを設定する。
    • 『User name』は『bedrock_user』
    • 『Password』は上記のSQL statementのCREATE ROLEで設定したパスワードを入力してください。 私の場合は『hentai』
  4. 『Encryption key』はそのまま変更せず『aws/secretsmanager』
  5. 『Database』は作成しているDB insance(statusがavailableになっている事)にチェックを入れて
  6. 『Next』
  7. Secret nameを入力。 私の場合は、『MyKnowledebase-AuroraServerless-FP0H-002』(*最初に作ったsecretは失敗しったので-002とした。 削除には最低7日必要なので、削除して同じ名前で作成できなかったため。)
  8. Descritionを記入(任意)
  9. 『Next』
  10. 何も変更せず『Next』
  11. 『Store』
  12. Secretが作成されるのでクリックして、ARNをコピーしておく。

PostgreSQL テーブル、インデックス作成

  1. 再度Aurora画面の左メニューのQuery editorをクリックして
  2. 先程作ったARNで認証する(私の場合)
    • Database instanceは(myknowledgebase-vector-fp0h-002)
    • Database usernameは『Connect withSecrets Manager ARN』に変更
    • Secrets manager ARNに、先程コピーしておいたARNを貼り付ける。
    • Enter the name of databaseにAurora serverless 作成時にInitial database nameで入力した名前を入れる。 (knowledgebase_vectordb_aurora_002)
      • 分からなければ、Aurora画面でDatabasesに入り、インスタンスをクリックしてConfigurationタブを選択するとDB nameが記載されている。
    • 『Connect』5秒くらいで接続される。
  3. Query editor部分を『Clear』ボタンでクリアして、以下を実行する。
    • CREATE TABLEでテーブル作成している。
      • Schema nameにテーブル名を指定している。
        • テーブル名は小文字と先頭以外では数字と文字間ではアンダースコア(_)を使用できる
      • vector()は上記(Query editor)でpgvector機能をインストールしたので使用できる。
      • vectorの1024は実際使用するembeddingの次元数に合わさなければいけない。
      • 今回は、CohereのMultilingal V3の1024次元を使用なので1024としている
    • CREATE INDEXで作成したテーブルにインデックス作成
      • hnswはpgvector機能をインストールしているので使用できる。
      • hnswはHierarchical Navigable Small Worldで工事券空間に置ける近似最近傍探索アルゴリズムの一つで、大規模かつ高次元のデータに対して高速かつ効率的に近似最近傍探索をするアルゴリズム。
      • ここではコサイン類似探索を指定
  4. 『Run』
-- テーブルの作成
CREATE TABLE bedrock_knowledgebase.table_1 (id uuid PRIMARY KEY, embedding vector(1024), chunks text, metadata json);

-- インデックスの作成
CREATE INDEX on bedrock_knowledgebase.table_1 USING hnsw (embedding vector_cosine_ops);

---上記までではchunksもmust be indexとエラーとなったので以下を追加
CREATE INDEX table_1_chunks_idx ON bedrock_knowledgebase.table_1 USING gin (to_tsvector('simple', chunks));

ちょっと長いので、『その1』はここまででおしまい。  続きは『その2』へ。

参考

以下は試行錯誤してたときのメモ。 結局EC2は使わないみたいなので、本文からは外して今後またEC2を作成するときのメモとして残しています。

Public Subnet作成(個別作成時の参考)

VPCには10.0.0.0/16と付けたので10.0.0.0〜10.0.255.255で使用できる。 これを用途に応じて分割するのがSubnet。 用途に応じて分割することによってセキュリティーを上げることができる。 例えばSubnet1が10.0.1.0/24でSubnet10.0.2.0/24とすると、それぞれのSubnetに接続できるのは、10.0.1.0~10.0.1.255、10.0.2.0〜10.0.2.255。 しかしそれら間もルート設定すれば通信もできる。

  • Internet gatewayにルーティングされるsubnet
  • VPCのCIDR内で指定する
  • 無料
  1. VPCの画面の左のメニューから『Subnets』をクリック
  2. 『Create subnet』をクリック
  3. 作成したVPCを選択
  4. Subnet nameを入力。 私の場合、VPCに接続するので以下のようにした。『mySubnet-myVPC-001-rag-01』
  5. Availability Zone 『Asia Pacific(Tokyo) / ap-northeast-1a 』を選択
  6. IPv4 VPC CIDR blockをプルダウンからVPCと同じCIDRブロック『10.0.0.0/16』を選択
  7. IPv4 subnet CIDR blockは、『10.0.1.0/24』とした
  8. そして『Create subnet』

Internet gateway 作成(個別作成時の参考)

  • VPCたインターネットに通信できるようにする
    • PythonのOSSダウンロードなど
  • VPCに1つだけattachできる
  • Internet gateway作成は無料
  1. VPC画面の左のメニューから『Internet gateways』をクリック
  2. 『Create internet gateway』をクリック
  3. Name tagで、名前を付けます。 『my-internet-gateway』
  4. 『Create internet gateway』をクリック
  5. 作成したInternet gatewayの画面に入るので、『Actions』〜『Attach to VPC』
  6. 先程作成したVPCを選択して『Attach internet gateway』を

ルートを追加(個別作成時の参考)

Internet gatewayへのルートを追加。。

  1. VPCページの左メニューから『subnets』で入り、
  2. 先程作ったSubnetのIDをクリックする
  3. そのsubnetが属しているrtb-で始まるRoute tableが表示されるので、それをクリック
  4. Route tablesの画面に入り、対象のRoute tableがチェックマークで選択されていて、画面下に6つくらいのタブが表示されるので『Routes』タブをクリック
  5. 『Edit routes』をクリック
  6. 『Add route』をクリックして現れたプルダウンから『Internet gateway』を選択
  7. 左の検索フィールドにはプルダウンで『0.0.0.0/0』を選択する
  8. その下に『igw-』で始まる文字が入っている検索フィールドをクリックすると、先程作ったigw-xxxxxxx(my-internet-gateway)が表示されるので、それを選択
  9. 『Save changes』

Private subnet作成(個別作成時の参考)

  • Internet gatewayにルーティングされないsubnet
  • InternetからPrivate subnetにアクセスするにはNAT gatewayが必要。
  1. VPC画面の左のメニューから『Subnets』
  2. 『Create subnet』
  3. VPC IDで作成したVPCを選択し
  4. Subnet nameを入力し、(私の場合は、『mySubnet-muVPC-001-rag-20』)
  5. Availability Zone 『Asia Pacific(Tokyo) / ap-northeast-1a 』を選択
  6. IPv4 subnet CIDR blockは、『10.0.20.0/24』とした
  7. 『Create subnet』

Security Groupを作成(個別作成時の参考)

  • myPostgresSQL-security-group
  • 先程作ったVPCを選択
  • Inbound rules設定
    • 『Add rule』
      • TypeでPostgreSQLを選択
      • Sourceで『Custom』を選択し『10.0.0.0/16』を設定
  • Outbound rules設定
    • All trafficのままでDestinationが0.0.0.0/0だと警告がでるので、10.0.0.0.16に変更しておく。

EC2インスタンス作成

  1. EC2ページに入り左のメニューから『Instances』の下の『Instances』
  2. 『Launch instance』 
  3. Nameを入れる 私の場合、『MyEC2instance-AWS-Linux64』としました。
  4. 『Amazon Linux』、『Amazon Linux 2023 AMI』、『64-bit(ARM)』、『t4g.large』(Amazon Graviton2)
  5. keypairは今回は『create key pair』にして
    • 『myEC2-aws-linux64-001-ed25119』
    • 『ED25519』
    • 『.pem』
    • 『Create key pair』をクリック
    • 【重要】.pemファイルがダウンロードされるので、ちゃんと保存すること。 私は~/.sshに保存しました。
    • もしなくしてもこのinstanceに公開鍵を送って、.ssh/authorized_keysに貼り付けたらいいと思います。
    • AWS System ManagerのSession Managerを使用する。 適切なIAMロールがattachされ動作するか先に確認しておく必要あり。
  6. Network settingsで
    • Networkには作成したVPCが選択されているのでそのまま
    • Subnetには、作成したprivate subnetが選択されているのでそのまま
    • Auto-assign public IPは、Disableになっているので『Edit』をクリックして『Enable』に変更
    • Create security groupを選択肢、Security group name 『myEC2-security-group-aws-linux-001』とし
    • Descriptionにも入力しました。
    • Security group rulesにはssh,tcp,22,anywhereのままにしています。 本当は自分のpublic IPが固定であれば、『My IP』を選択すれば、今使っているIPアドレスからしかSSH通信を受け付けないのですが、会社の都合で変わるかもしれないので、Anywhereとしています。
    • SSH方法(1)
      • uBuntuで、.pemファイルを入れたディレクトリで『chmod 600 myEC2-aws-linux64-001-ed25519.pem』と権限を変更。 デフォルトの664のままでは権限が甘くSSH Deniedで接続できない。
      • EC2のページでInstance IDをクリックして、Auto-assigned IP addressでIPアドレスを調べる(43.206.232.88)
      • 『ssh -i ~/.ssh/myEC2-security-group-aws-linux-001 ec2-user@43.206.232.88』で接続できた。
    • SSH方法(2)
      • EC2のページでInstance IDをクリックして、『Connect』で接続できる。
      • Auto-assigned IP addressがあれば『Connect using EC3 Instance Connect』で『Connect』できる。これはPublic IP経由接続。
      • Auto-assigned IP addressがなければ、『Connect using EC3 Instance Connect Endpoint』をクリックして、Endpointを作成したらPrivate IP address経由で『Connect』できる。
  7. Configura storageで1x8GB、gp3としました。
  8. 『Launch instance』で起動します。 起動したら課金が始まります。
  9. EC2ページのinstancesに入り、起動したinstanceのチェックボックスにチェックを入れ、『Instance state』で『Stop instance』を選択して、とりあえず止めておきます。
  10. InstanceをstopしてもEBSに保存され、課金対象になるので、AMI(Amazon Machine Image)でインスタンスを作るファイルを作成し、AMIをs3に保存し、EC2 instanceをTerminateしておくと一番安上がりになります。
    • AMIを作りたいinstance ID上で右クリックし『Image and templates』〜『Create image』
    • しかしAMIはOSとアプリケーションの状態を保存するだけなので、AMIからinstancceを再度生成する場合以下のやり直しが必要。
      • CPUタイプ
      • Key pair生成
      • ネットワーク設定、セキュリティ-グループ
      • IAMロール
      • EBSのサイズなど

volume

変更できます。 

  • 『Instance ID』〜画面真ん中にある『Storage』タグをクリックして、『Volume ID』のリンクをクリック
  • 再度Volume IDのリンクをクリックして『Modify』

またインスタンスのバックアップを取るのは、Volume IDの左のチェックボックスにチェックを入れ『Actions』〜『Create snapshot』バックアップを作ることができます。

コメント