

# 管理目录存储桶策略
<a name="directory-bucket-bucket-policy"></a>

可以使用 Amazon S3 控制台、Amazon SDK 和 Amazon CLI 来添加、删除、更新和查看 Amazon S3 目录存储桶的存储桶策略。有关更多信息，请参阅以下主题。有关受支持的 Amazon Identity and Access Management（IAM）操作的更多信息，请参阅 [使用 IAM 对区域端点 API 操作进行授权](s3-express-security-iam.md)。有关目录存储桶的存储桶策略示例，请参阅[目录存储桶的存储桶策略示例](s3-express-security-iam-example-bucket-policies.md)。

**Topics**
+ [添加存储桶策略](#directory-bucket-bucket-policy-add)
+ [查看存储桶策略](#directory-bucket-bucket-policy-view)
+ [删除存储桶策略](#directory-bucket-bucket-policy-delete)

## 添加存储桶策略
<a name="directory-bucket-bucket-policy-add"></a>

要向目录存储桶添加存储桶策略，您可以使用 Amazon S3 控制台、Amazon SDK 或 Amazon CLI。

### 使用 S3 控制台
<a name="directory-bucket-bucket-policy-add-console"></a>

**创建或编辑存储桶策略**

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.amazonaws.cn/s3/)。

1. 在左侧导航窗格中，选择**目录存储桶**。

1. 在**目录存储桶**列表中，选择要向其添加策略的存储桶的名称。

1. 选择 **Permissions（权限）**选项卡。

1. 在 **Bucket policy（存储桶策略）**下，请选择 **Edit（编辑）**。将出现 **Edit bucket policy**（编辑存储桶策略）页面。

1. 要自动生成策略，请选择**策略生成器**。

   如果选择 **Policy generator**（策略生成器），Amazon 策略生成器将在新窗口中打开。

   如果您不想使用 Amazon 策略生成器，则可以在**策略**部分添加或编辑 JSON 语句。

   1. 在 **Amazon 策略生成器**页面上，对于**选择策略类型**，选择 **S3 存储桶策略**。

   1. 通过在提供的字段中输入信息来添加语句，然后选择**添加语句**。对您要添加的所需数量的语句重复此步骤。有关这些字段的更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html)。
**注意**  
为方便起见，**编辑桶策略**页面会在**策略**文本字段上方显示当前桶的**桶 ARN**（Amazon 资源名称）。您可以复制此 ARN，以便在 **Amazon 策略生成器**页面上的语句中使用。

   1. 添加完语句后，请选择**生成策略**。

   1. 复制生成的策略文本，请选择 **Close**（关闭），然后返回到 Amazon S3 控制台中的 **Edit bucket policy**（编辑存储桶策略）页面。

1. 在 **Policy**（策略）框中，编辑现有策略或从 Amazon 策略生成器粘贴存储桶策略。确保在保存策略之前解决安全警告、错误、一般警告和建议。
**注意**  
存储桶策略的大小限制为 20 KB。

1. 选择**保存更改**，此操作将让您返回到**权限**选项卡。

### 使用 Amazon SDK
<a name="directory-bucket-bucket-policy-add-sdks"></a>

------
#### [ SDK for Java 2.x ]

**Example**  
`PutBucketPolicy` Amazon SDK for Java 2.x   

```
public static void setBucketPolicy(S3Client s3Client, String bucketName, String policyText) {
     
       //sample policy text
       /**
        * policy_statement = {
         *         'Version': '2012-10-17',
         *         'Statement': [
         *             {
         *                 'Sid': 'AdminPolicy',
         *                 'Effect': 'Allow',
         *                 'Principal': {
         *                     "AWS": "111122223333"
         *                 },
         *                 'Action': 's3express:*',
         *                 'Resource': 'arn:aws:s3express:region:111122223333:bucket/bucket-base-name--zone-id--x-s3'
         *             }
         *         ]
         *     }
         */
         System.out.println("Setting policy:");
         System.out.println("----");
         System.out.println(policyText);
         System.out.println("----");
         System.out.format("On Amazon S3 bucket: \"%s\"\n", bucketName);
         
         try {
             PutBucketPolicyRequest policyReq = PutBucketPolicyRequest.builder()
                     .bucket(bucketName)
                     .policy(policyText)
                     .build();
             s3Client.putBucketPolicy(policyReq);
             System.out.println("Done!");
         }    
         
         catch (S3Exception e) {
             System.err.println(e.awsErrorDetails().errorMessage());
             System.exit(1);
         }
    }
```

------

### 使用 Amazon CLI
<a name="directory-bucket-delete-cli"></a>

此示例显示如何使用 Amazon CLI 将存储桶策略添加到目录存储桶。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
aws s3api put-bucket-policy --bucket bucket-base-name--zone-id--x-s3 --policy file://bucket_policy.json
```

bucket\$1policy.json：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AdminPolicy",
            "Effect": "Allow",
            "Principal": {
                "AWS": "111122223333"
            },
            "Action": "s3express*",
            "Resource": "arn:aws:s3express:us-west-2:111122223333:bucket/amzn-s3-demo-bucket--usw2-az1--x-s3"
        }
    ]
}
```

------

有关更多信息，请参阅 Amazon Command Line Interface 中的 [put-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-policy.html)。

## 查看存储桶策略
<a name="directory-bucket-bucket-policy-view"></a>

要查看目录存储桶的存储桶策略，请使用以下示例。

### 使用 Amazon CLI
<a name="directory-bucket-bucket-policy-view-cli"></a>

此示例说明如何使用 Amazon CLI 查看附加到目录存储桶的存储桶策略。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
aws s3api get-bucket-policy --bucket bucket-base-name--zone-id--x-s3
```

有关更多信息，请参阅 Amazon Command Line Interface 中的 [get-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-bucket-policy.html)。

## 删除存储桶策略
<a name="directory-bucket-bucket-policy-delete"></a>

要删除目录存储桶的存储桶策略，请使用以下示例。

### 使用 Amazon SDK
<a name="directory-bucket-bucket-policy-delete-sdks"></a>

------
#### [ SDK for Java 2.x ]

**Example**  
`DeleteBucketPolicy` Amazon SDK for Java 2.x   

```
public static void deleteBucketPolicy(S3Client s3Client, String bucketName) {
      try {
          DeleteBucketPolicyRequest deleteBucketPolicyRequest = DeleteBucketPolicyRequest
                  .builder()
                  .bucket(bucketName)
                  .build()
          s3Client.deleteBucketPolicy(deleteBucketPolicyRequest);
          System.out.println("Successfully deleted bucket policy");
      }
      
      catch (S3Exception e) {
          System.err.println(e.awsErrorDetails().errorMessage());
          System.exit(1);
      }
```

------

### 使用 Amazon CLI
<a name="directory-bucket-delete-cli"></a>

此示例显示如何使用 Amazon CLI 删除目录存储桶的存储桶策略。要使用该命令，请将*用户输入占位符* 替换为您自己的信息。

```
aws s3api delete-bucket-policy --bucket bucket-base-name--zone-id--x-s3
```

有关更多信息，请参阅 Amazon Command Line Interface 中的 [delete-bucket-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/delete-bucket-policy.html)。