第2回:Encryption Policy を正しく作る(AOSS作成前に必須!)

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 は必ず collectiondashboard を入れるとエラー。
  • キーは 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 に AWSOwnedKeyKmsKeyArn も無い
対処:上記いずれかを必ず含める(例では AWSOwnedKey: true)。


エラーB:

ValidationException: Policy json is invalid, error: [$.Rules: there must be a maximum of 1 items in the array]
原因Rules に複数ルールを入れた(例:collectiondashboard を両方書いた)。
対処ルールは1件だけにする。dashboardEncryption では禁止


エラーC:

ValidationException: Policy json is invalid, error: [$.Rules[1].ResourceType: must be a constant value collection]
原因ResourceTypedashboard を入れている。
対処ResourceTypecollection 固定


エラー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-policypolicyVersion を取り、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 は最初に必須。スキーマのルートはオブジェクトRules1エントリのみResourceTypecollection
  • --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 の混同回避)を解説します。

タイトルとURLをコピーしました