作成手順
この『その1』では下の1,2だけ。
- VPC(virtual private cloud)作成
- Aurora Serverless v2でPostgreSQL作成
- (ec2インスタンス作成<==不要だったので使わない(参考にメモとして残した)
- s3に読み込ますpdfを.mdに変換してUploadする
- bedrockでvector storeを作り、そのapiも作る
- bedrockでllm apiを作る
- lambdaで上記2つのapiを使って簡単な質問を送る
- Webページに入力された質問をLambdaに送るAPI GatewayでREST APIを作る
- AmplifyにAngularベースのWebページを作り、REST APIに質問を送る様にする
VPC作成
default VPCはテストにはいいけど、セキュリティ設定などが緩く、本番では良くないらしいので、VPCを作成してみます。(ここを参考にさせていただきました。 BedrockナレッジベースでAurora Serverlessを使用する際の設定注意点)
VPC作成 VPCx2, subnetx2
- VPCページに移動
- VPCsをクリックし『Create PVC』をクリック
- VPC only and more <— moreを選択するとPrivate subnet, Public subnet, Internet gateway, Route tableなど作成できる
- name 『myVPC-001-rag』
- IPv4 CIDR manual input 『10.0.0.0/16』
- No IPv6 CIDR block
- Tenancy 『Default』ーーー専用は有料なので共有のdefaultにした
- Availabilityを2 <ーーーVectordb Auroraで必要
- Public subnetsも2<ーーー将来Webに必要かもしれない
- Private subnetsを2 <ーーーVectordb Auroraで必要
- 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作成
- Aurora and RDS(Aurora DSQLではありません)に入り左メニューから『Databases』をクリック
- 『Create database』
- 『Standard create』、『Aurora(PostgreSQL Compatible)』を選択』
- Available versionは『16.6』を選択
- 遅くても安い『Dev/Test』を選択
- DB Cluster identifierを入力。私の場合、『myknowledgebase-vectordb-fp0h-002』としました。
- Master useer名はそのまま『postgres』
- 『Managed in AWS Secrete Manager』を選択市内とナレッジベースは使えません。
- encryption keyは『aws/secretsmanager(default)』のまま
- 『Aurora Standard』
- 「Serverless v2』
- Minimum capacity(ACUs)を『0』にして、Maximum capacity(ACUs)』も念の為『2』にして
- Pause after inactivityを『00:30:00』に変更
- Availability & durabilityは『Don’t create a Aurora Replica』
- 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もチェックを外す
- Monitoringの下のAdditional configurationを開き、Initial database nameを記入する。 『knowledgebase_vectordb_aurora_002』 database nameを記入しないとインスタンスを作成せず動作しない。
- 『Create VPC』で生成する
- インスタンスの作成で20~25分かかる。 インスタンスがAvailableになったらOK。
Aurora cluster設定
- AWS Secrets Managerの画面に入り、作られているSecret nameをクリックして、ARNをコピーしてメモっとく。
- Auroraの画面に戻り、作成したdbのdatabase nameもコピーしてメモっておく。
- Aurora画面の左メニューからQuery editorを選択
- 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秒くらいでEditorが開くので、書かれている内容はClearして、以下を貼り付けRun。
- Result setにバージョン番号が表示されたらOK
- pgvectorとはPostgreSQLの拡張機能で、直接カラムにRAGに必要なvectorを保存できるようになります。
-- pgvector 拡張機能のインストール CREATE EXTENSION IF NOT EXISTS vector; -- pgvector のバージョン確認 SELECT extversion FROM pg_extension WHERE extname='vector';
- またclearして以下を実行。 your_password部分はあなたのパスワードに置き換えてください。 そしてそのパスワードは後ほど使うのでメモっておくこと。 私のは数字なしの『hentai』としました。
- bedrock_knowledgebaseはスキーマ名。 PostgreSQLはDatabase名の下に複数のスキーマ(名前空間)があり、その下にテーブルを作成します。
- 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を作成します。
- Screts manager画面に入り、『Store a new secret』をクリック
- Secret typeは『Credentials for Amazon RDS database』を選択
- 先程作成したAurora PostgreSQLのスキーマへアクセスするためのUser nameとパスワードを設定する。
- 『User name』は『bedrock_user』
- 『Password』は上記のSQL statementのCREATE ROLEで設定したパスワードを入力してください。 私の場合は『hentai』
- 『Encryption key』はそのまま変更せず『aws/secretsmanager』
- 『Database』は作成しているDB insance(statusがavailableになっている事)にチェックを入れて
- 『Next』
- Secret nameを入力。 私の場合は、『MyKnowledebase-AuroraServerless-FP0H-002』(*最初に作ったsecretは失敗しったので-002とした。 削除には最低7日必要なので、削除して同じ名前で作成できなかったため。)
- Descritionを記入(任意)
- 『Next』
- 何も変更せず『Next』
- 『Store』
- Secretが作成されるのでクリックして、ARNをコピーしておく。
PostgreSQL テーブル、インデックス作成
- 再度Aurora画面の左メニューのQuery editorをクリックして
- 先程作った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秒くらいで接続される。
- Query editor部分を『Clear』ボタンでクリアして、以下を実行する。
- CREATE TABLEでテーブル作成している。
- Schema nameにテーブル名を指定している。
- テーブル名は小文字と先頭以外では数字と文字間ではアンダースコア(_)を使用できる
- vector()は上記(Query editor)でpgvector機能をインストールしたので使用できる。
- vectorの1024は実際使用するembeddingの次元数に合わさなければいけない。
- 今回は、CohereのMultilingal V3の1024次元を使用なので1024としている
- Schema nameにテーブル名を指定している。
- CREATE INDEXで作成したテーブルにインデックス作成
- hnswはpgvector機能をインストールしているので使用できる。
- hnswはHierarchical Navigable Small Worldで工事券空間に置ける近似最近傍探索アルゴリズムの一つで、大規模かつ高次元のデータに対して高速かつ効率的に近似最近傍探索をするアルゴリズム。
- ここではコサイン類似探索を指定
- CREATE TABLEでテーブル作成している。
- 『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内で指定する
- 無料
- VPCの画面の左のメニューから『Subnets』をクリック
- 『Create subnet』をクリック
- 作成したVPCを選択
- Subnet nameを入力。 私の場合、VPCに接続するので以下のようにした。『mySubnet-myVPC-001-rag-01』
- Availability Zone 『Asia Pacific(Tokyo) / ap-northeast-1a 』を選択
- IPv4 VPC CIDR blockをプルダウンからVPCと同じCIDRブロック『10.0.0.0/16』を選択
- IPv4 subnet CIDR blockは、『10.0.1.0/24』とした
- そして『Create subnet』
Internet gateway 作成(個別作成時の参考)
- VPCたインターネットに通信できるようにする
- PythonのOSSダウンロードなど
- VPCに1つだけattachできる
- Internet gateway作成は無料
- VPC画面の左のメニューから『Internet gateways』をクリック
- 『Create internet gateway』をクリック
- Name tagで、名前を付けます。 『my-internet-gateway』
- 『Create internet gateway』をクリック
- 作成したInternet gatewayの画面に入るので、『Actions』〜『Attach to VPC』
- 先程作成したVPCを選択して『Attach internet gateway』を
ルートを追加(個別作成時の参考)
Internet gatewayへのルートを追加。。
- VPCページの左メニューから『subnets』で入り、
- 先程作ったSubnetのIDをクリックする
- そのsubnetが属しているrtb-で始まるRoute tableが表示されるので、それをクリック
- Route tablesの画面に入り、対象のRoute tableがチェックマークで選択されていて、画面下に6つくらいのタブが表示されるので『Routes』タブをクリック
- 『Edit routes』をクリック
- 『Add route』をクリックして現れたプルダウンから『Internet gateway』を選択
- 左の検索フィールドにはプルダウンで『0.0.0.0/0』を選択する
- その下に『igw-』で始まる文字が入っている検索フィールドをクリックすると、先程作ったigw-xxxxxxx(my-internet-gateway)が表示されるので、それを選択
- 『Save changes』
Private subnet作成(個別作成時の参考)
- Internet gatewayにルーティングされないsubnet
- InternetからPrivate subnetにアクセスするにはNAT gatewayが必要。
- VPC画面の左のメニューから『Subnets』
- 『Create subnet』
- VPC IDで作成したVPCを選択し
- Subnet nameを入力し、(私の場合は、『mySubnet-muVPC-001-rag-20』)
- Availability Zone 『Asia Pacific(Tokyo) / ap-northeast-1a 』を選択
- IPv4 subnet CIDR blockは、『10.0.20.0/24』とした
- 『Create subnet』
Security Groupを作成(個別作成時の参考)
- myPostgresSQL-security-group
- 先程作ったVPCを選択
- Inbound rules設定
- 『Add rule』
- TypeでPostgreSQLを選択
- Sourceで『Custom』を選択し『10.0.0.0/16』を設定
- 『Add rule』
- Outbound rules設定
- All trafficのままでDestinationが0.0.0.0/0だと警告がでるので、10.0.0.0.16に変更しておく。
EC2インスタンス作成
- EC2ページに入り左のメニューから『Instances』の下の『Instances』
- 『Launch instance』
- Nameを入れる 私の場合、『MyEC2instance-AWS-Linux64』としました。
- 『Amazon Linux』、『Amazon Linux 2023 AMI』、『64-bit(ARM)』、『t4g.large』(Amazon Graviton2)
- 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され動作するか先に確認しておく必要あり。
- 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』できる。
- Configura storageで1x8GB、gp3としました。
- 『Launch instance』で起動します。 起動したら課金が始まります。
- EC2ページのinstancesに入り、起動したinstanceのチェックボックスにチェックを入れ、『Instance state』で『Stop instance』を選択して、とりあえず止めておきます。
- 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』バックアップを作ることができます。
コメント