

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# ポリシーの作成と更新: ポリシーごとのエンジンの検証
<a name="policy-create-update-validation"></a>

ポリシーを直接 (生成ではなく) 作成または更新する場合、検証と分析では、新しいポリシーと、ポリシーエンジン内のすべての**既存のポリシー**とのやり取りが考慮されます。

## 仕組み
<a name="policy-create-update-validation-how"></a>

1. ポリシーは、ポリシーエンジンに関連付けられている**すべてのゲートウェイ**の Cedar スキーマと照合されます。スキーマチェックは、検証モードに関係なく常に実行されます。

1. 検証モードが に設定されている場合`FAIL_ON_ANY_FINDINGS`、セマンティック検証は**ポリシーエンジン全体の**コンテキストで実行され、過度に寛容、過度に制限的、無効なポリシーをチェックします。スキーマチェックまたはセマンティック検証のいずれかによって結果が生成された場合、ポリシーは拒否されます。各チェックの詳細については、[「検証と分析の概要](policy-validation-overview.md)」を参照してください。

**注記**  
では`IGNORE_ALL_FINDINGS`、スキーマチェックのみが実行されます。ポリシーは、スキーマチェックに合格する限り受け入れられます。詳細については、[「ポリシーエンジンにポリシーを追加する](add-policies-to-engine.md)」を参照してください。

## 例: 検証を含むポリシーを作成する
<a name="policy-create-validation-example"></a>

検出結果を含むポリシーを拒否する厳格な検証を含むポリシーを作成します。

**Example**  

1. ステートメントを ファイルに保存します。例`restrict_refunds.cedar`:

   ```
   forbid (
     principal,
     action == AgentCore::Action::"RefundTool___process_refund",
     resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5"
   )
   when {
     context.input.amount > 1000
   };
   ```

1. ポリシーを追加してデプロイします。

   ```
   agentcore add policy --name RestrictRefunds \
     --engine MyEngine \
     --source restrict_refunds.cedar \
     --validation-mode FAIL_ON_ANY_FINDINGS
   
   agentcore deploy --yes
   ```

1. ターミナルで次のコードを実行して、 CLI AWS を使用してポリシーを作成します。

   ```
   aws bedrock-agentcore-control create-policy \
     --policy-engine-id MyEngine-abc123defg \
     --name RestrictRefunds \
     --validation-mode FAIL_ON_ANY_FINDINGS \
     --definition '{
       "policy": {
         "statement": "forbid (principal, action == AgentCore::Action::\"RefundTool___process_refund\", resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5\") when { context.input.amount > 1000 };"
       }
     }'
   ```

1.  AWS SDK for Python を使用してポリシーを作成するには、次のコードを実行します。

   ```
   import boto3
   
   client = boto3.client('bedrock-agentcore-control')
   
   GATEWAY_ARN = (
       'arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5'
   )
   
   statement = (
       'forbid (principal, '
       'action == AgentCore::Action::"RefundTool___process_refund", '
       f'resource == AgentCore::Gateway::"{GATEWAY_ARN}") '
       'when { context.input.amount > 1000 };'
   )
   
   response = client.create_policy(
       policyEngineId='MyEngine-abc123defg',
       name='RestrictRefunds',
       validationMode='FAIL_ON_ANY_FINDINGS',
       definition={'policy': {'statement': statement}},
   )
   print(response['policyId'], response['status'])
   ```

レスポンスは、ポリシーが作成されていることを示します。

```
{
  "policyId": "RestrictRefunds-ghi789jklm",
  "status": "CREATING"
}
```

ポリシーのステータスをチェックして、検証に合格したことを確認します。

**Example**  

1. プロジェクト内のリソースのデプロイ状態を表示します。

   ```
   agentcore status
   ```

   AgentCore CLI にはポリシーごとの読み取りオペレーションはありません。CLI または SDK AWS を使用して、単一のポリシーのステータスと検出結果を検査します。

1. ターミナルで次のコードを実行して、 CLI AWS を使用してポリシーを取得します。

   ```
   aws bedrock-agentcore-control get-policy \
     --policy-engine-id MyEngine-abc123defg \
     --policy-id RestrictRefunds-ghi789jklm
   ```

1.  AWS SDK for Python を使用してポリシーがアクティブになるまで、次のコードを実行します。

   ```
   import boto3
   
   client = boto3.client('bedrock-agentcore-control')
   
   client.get_waiter('policy_active').wait(
       policyEngineId='MyEngine-abc123defg',
       policyId='RestrictRefunds-ghi789jklm',
   )
   
   policy = client.get_policy(
       policyEngineId='MyEngine-abc123defg',
       policyId='RestrictRefunds-ghi789jklm',
   )
   print(policy['status'], policy.get('statusReasons'))
   ```

検証に合格すると、ポリシーがアクティブになります。

```
{
  "policyId": "RestrictRefunds-ghi789jklm",
  "status": "ACTIVE",
  "statusReasons": []
}
```

## 例: 検証の失敗
<a name="policy-validation-failure-example"></a>

ポリシーが、関連付けられたゲートウェイのスキーマに存在しないアクションを参照している場合、検証は失敗します。この障害は**非同期**であることに注意してください。作成呼び出しは で HTTP 202 を返し`CREATING`、ポリシーは に解決されます`CREATE_FAILED`。

**Example**  

1. 検証に失敗したポリシーは、そのリソースだけでなく、デプロイ全体に失敗します。

   ```
   agentcore add policy --name InvalidPolicy \
     --engine MyEngine \
     --statement 'permit (principal, action == AgentCore::Action::"RefundTool___nonExistentTool", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5");'
   
   agentcore deploy --yes
   ```

   デプロイでは、根本的な`CREATE_FAILED`理由が報告されます。で不正なポリシーを削除`agentcore remove policy --engine MyEngine --name InvalidPolicy`し、再度デプロイします。

1. ターミナルで次のコードを実行して、未定義のアクションを参照するポリシーを作成します。

   ```
   aws bedrock-agentcore-control create-policy \
     --policy-engine-id MyEngine-abc123defg \
     --name InvalidPolicy \
     --validation-mode FAIL_ON_ANY_FINDINGS \
     --definition '{
       "policy": {
         "statement": "permit (principal, action == AgentCore::Action::\"RefundTool___nonExistentTool\", resource == AgentCore::Gateway::\"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5\");"
       }
     }'
   ```

1. ステータスをチェックして、検証の失敗を確認します。

   ```
   aws bedrock-agentcore-control get-policy \
     --policy-engine-id MyEngine-abc123defg \
     --policy-id InvalidPolicy-jkl012mnop
   ```

1. 次のコードを実行してポリシーを作成し、 AWS SDK for Python を使用して失敗の理由を読みます。

   ```
   import time
   import boto3
   
   client = boto3.client('bedrock-agentcore-control')
   
   GATEWAY_ARN = (
       'arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/my-gateway-a1b2c3d4e5'
   )
   
   response = client.create_policy(
       policyEngineId='MyEngine-abc123defg',
       name='InvalidPolicy',
       validationMode='FAIL_ON_ANY_FINDINGS',
       definition={'policy': {'statement': (
           'permit (principal, '
           'action == AgentCore::Action::"RefundTool___nonExistentTool", '
           f'resource == AgentCore::Gateway::"{GATEWAY_ARN}");'
       )}},
   )
   
   # The 202 above is not success - poll for the terminal status
   while True:
       policy = client.get_policy(
           policyEngineId='MyEngine-abc123defg',
           policyId=response['policyId'],
       )
       if policy['status'] != 'CREATING':
           break
       time.sleep(4)
   
   print(policy['status'], policy.get('statusReasons'))
   ```

ポリシーのステータスを確認すると、検証の失敗がレスポンスに表示されます。

```
{
  "policyId": "InvalidPolicy-jkl012mnop",
  "status": "CREATE_FAILED",
  "statusReasons": [
    "Validation failed: Action 'nonExistentTool' is not defined in the schema for any associated gateway"
  ]
}
```