Amazon OpenSearch Serverless(AOSS)× Bedrock RAG 構築講座
この記事のゴール
コレクション作成の前に必須な Encryption Policy(暗号化ポリシー) を、
一発で 作成/更新 できる状態にします。
実際に遭遇したエラーと、その対処法FAQも併記します。
0. 前提(環境変数)
第1回で用意したものを再掲。
AWS_PROFILE
は未設定でもOK。
export REGION=ap-northeast-1 export AWS_PROFILE=default # 未設定でも可 export PROJECT=itcometrueacademy export ENV=dev export COLLECTION_NAME="${PROJECT}-${ENV}" # 例: itcometrueacademy-dev export INDEX_NAME="${PROJECT}-${ENV}-docs" # 例: itcometrueacademy-dev-docs export AWS_REGION="$REGION" # プロファイルが定義されている時だけ --profile を付ける安全ヘルパ AWSP="${AWS_PROFILE:+--profile $AWS_PROFILE}"
1. なぜ Encryption Policy が必要か
AOSS はコレクション作成前に、**暗号化ポリシー(type=encryption)**が存在している必要があります。
これが無いと、create-collection
で次のように失敗します:
ValidationException: No matching security policy of encryption type found for collection name: itcometrueacademy-dev
ポイント(超重要)
- Encryption Policy は「オブジェクト」ルート(
{ ... }
)。 - Rules は配列だが、エントリはちょうど1個だけ。
- その ResourceType は必ず
collection
。dashboard
を入れるとエラー。 - キーは AWSOwnedKey(true/false) または KmsKeyArn のいずれかが必須。
2. Encryption Policy を作る(enc.json)
2.1 最小・正解スキーマ(AWSOwnedKey版)
cat > enc.json <<'JSON' { "Rules": [ { "ResourceType": "collection", "Resource": ["collection/itcometrueacademy-dev"] } ], "AWSOwnedKey": true } JSON
🔁 プロジェクトを汎用化したい場合は
${COLLECTION_NAME}
を使って sed 置換でもOK。
例:sed -i "s#itcometrueacademy-dev#${COLLECTION_NAME}#g" enc.json
2.2 KMSキーを使う場合(任意)
cat > enc_kms.json <<'JSON' { "Rules": [ { "ResourceType": "collection", "Resource": ["collection/itcometrueacademy-dev"] } ], "KmsKeyArn": "arn:aws:kms:ap-northeast-1:<ACCOUNT_ID>:key/<YOUR_KMS_KEY_ID>" } JSON
KMS を使う場合は Key ポリシーで AOSS サービス/実行主体のアクセス許可も忘れずに。
3. 作成 or 更新(idempotent 実行)
作成に失敗したら更新に切り替えるワンライナー。
「既にあるなら update」なので、何度流しても安全です。
# 作成。存在していれば || 以降にフォールバック aws opensearchserverless create-security-policy \ --name "enc-${COLLECTION_NAME}" \ --type encryption \ --policy file://enc.json \ --region "$REGION" $AWSP \ || { ENC_VER=$(aws opensearchserverless get-security-policy \ --type encryption --name "enc-${COLLECTION_NAME}" \ --region "$REGION" $AWSP \ --query securityPolicyDetail.policyVersion --output text) aws opensearchserverless update-security-policy \ --name "enc-${COLLECTION_NAME}" \ --type encryption \ --policy-version "$ENC_VER" \ --policy file://enc.json \ --region "$REGION" $AWSP }
確認
aws opensearchserverless get-security-policy \ --type encryption --name "enc-${COLLECTION_NAME}" \ --region "$REGION" $AWSP \ --query 'securityPolicyDetail.{name:name,version:policyVersion,policy:policy}' | jq
4. 実コマンド例(今回のプロジェクト名で固定)
この記事で実際に通っている値に揃えたい方は、そのまま貼ってOK。
cat > enc.json <<'JSON' { "Rules": [ { "ResourceType": "collection", "Resource": ["collection/itcometrueacademy-dev"] } ], "AWSOwnedKey": true } JSON aws opensearchserverless create-security-policy \ --name enc-itcometrueacademy-dev \ --type encryption \ --policy file://enc.json \ --region "$REGION" $AWSP \ || { ENC_VER=$(aws opensearchserverless get-security-policy \ --type encryption --name enc-itcometrueacademy-dev \ --region "$REGION" $AWSP \ --query securityPolicyDetail.policyVersion --output text) aws opensearchserverless update-security-policy \ --name enc-itcometrueacademy-dev \ --type encryption \ --policy-version "$ENC_VER" \ --policy file://enc.json \ --region "$REGION" $AWSP }
5. よく出たエラーと対処(FAQ)
エラーA:
ValidationException: Policy json is invalid, error: [$: should have a minimum of 2 properties]
原因:Encryption Policy に AWSOwnedKey
も KmsKeyArn
も無い。
対処:上記いずれかを必ず含める(例では AWSOwnedKey: true
)。
エラーB:
ValidationException: Policy json is invalid, error: [$.Rules: there must be a maximum of 1 items in the array]
原因:Rules
に複数ルールを入れた(例:collection
と dashboard
を両方書いた)。
対処:ルールは1件だけにする。dashboard
は Encryption では禁止。
エラーC:
ValidationException: Policy json is invalid, error: [$.Rules[1].ResourceType: must be a constant value collection]
原因:ResourceType
に dashboard
を入れている。
対処:ResourceType
は collection
固定。
エラーD:
aws: error: the following arguments are required: --policy
原因:--policy-document
を使ってしまった/引数名が違う。
対処:AOSS の create-security-policy
/ update-security-policy
は --policy
を使う。
エラーE:
aws: error: argument --profile: expected one argument
原因:AWS_PROFILE
未設定なのに --profile
を付けてしまった。
対処:AWSP="${AWS_PROFILE:+--profile $AWS_PROFILE}"
を使い、コマンド側は $AWSP
を展開するだけにする。
エラーF:
ResourceNotFoundException
(update 時)
原因:ポリシーが存在しないのに update
しようとしている。
対処:まず create
を試し、ダメなら get-security-policy
で存在チェック → 次に update
。
(上のワンライナーはこの分岐を自動化済み)
エラーG:
ConflictException: Policy ... already exists
(create 時)
原因:既に存在。
対処:正常。get-security-policy
で policyVersion
を取り、update-security-policy
を実行。
(上のワンライナーで自動処理)
エラーH(番外):
ValidationException: No matching security policy of encryption type found ...
(create-collection 時)
原因:Encryption Policy が未作成/対象名が不一致。
対処:先に本記事の手順で encryption を作成し、collection/<正しいコレクション名>
になっているか確認。
6. (動作確認)コレクションの作成まで通す
Encryption Policy が通ったら、コレクション作成が成功するはずです。
※ Network/Data Access は次回以降。まずは 作成が通ることを確認。
aws opensearchserverless create-collection \ --name "$COLLECTION_NAME" \ --type VECTORSEARCH \ --region "$REGION" $AWSP # ACTIVE になるまで待機 echo -n "waiting ACTIVE" for i in {1..60}; do st=$(aws opensearchserverless list-collections --region "$REGION" $AWSP \ --query "collectionSummaries[?name=='${COLLECTION_NAME}'].status|[0]" --output text) [ "$st" = "ACTIVE" ] && break; echo -n "."; sleep 5 done; echo " ($st)" # Data endpoint を取得(ダッシュボードURLではない方) CID=$(aws opensearchserverless list-collections --region "$REGION" $AWSP \ --query "collectionSummaries[?name=='${COLLECTION_NAME}'].id|[0]" --output text) ENDPOINT=$(aws opensearchserverless batch-get-collection \ --ids "$CID" --region "$REGION" $AWSP \ --query "collectionDetails[0].collectionEndpoint" --output text) echo "COLLECTION_ID=$CID" echo "AOSS_ENDPOINT=$ENDPOINT"
Tip:この
AOSS_ENDPOINT
は データエンドポイント です。
FastAPI や Python クライアントからは こちらを使います(/_dashboards
側は管理画面用)。
7. まとめ
- Encryption Policy は最初に必須。スキーマのルートはオブジェクト、
Rules
は1エントリのみ、ResourceType
はcollection。 --policy
を使う(--policy-document
ではない)。- 何度でも安全に流せる create→update フォールバックで運用を安定化。
- ここまで通れば、次回の Network Policy(public切り分け/VPCE移行) と Data Access Policy(Principal権限付与) に進めます。
次回(第3回)は、Network Policy / Data Access Policy を正しいスキーマで作り、
403 Forbidden を確実に潰す実践手順&FAQ(object found, array expected
の混同回避)を解説します。