

# 限制对AWS Elemental MediaStore源的访问
<a name="private-content-restricting-access-to-mediastore"></a>

CloudFront 提供*源访问控制*（OAC），用于限制对 AWS Elemental MediaStore 源的访问。

**Topics**
+ [创建新的源访问控制](#create-oac-overview-mediastore)
+ [源访问控制的高级设置](#oac-advanced-settings-mediastore)

## 创建新的源访问控制
<a name="create-oac-overview-mediastore"></a>

完成以下主题中描述的步骤，在 CloudFront 中设置新的源访问控制。

**Topics**
+ [先决条件](#oac-prerequisites-mediastore)
+ [向 CloudFront 授予访问 MediaStore 源的权限](#oac-permission-to-access-mediastore)
+ [创建源访问控制](#create-oac-mediastore)

### 先决条件
<a name="oac-prerequisites-mediastore"></a>

在创建和设置源访问控制之前，您必须拥有带有 MediaStore 源的 CloudFront 分配。

### 向 CloudFront 授予访问 MediaStore 源的权限
<a name="oac-permission-to-access-mediastore"></a>

在 CloudFront 分配中创建来源访问控制或对其设置之前，请确保 CloudFront 具有访问 MediaStore 源的权限。请在创建 CloudFront 分配后，但在分配配置中将 OAC 添加到 MediaStore 源之前，执行此操作。

使用 MediaStore 容器策略来支持 CloudFront 服务主体 (`cloudfront.amazonaws.com`) 访问源。使用策略中的 `Condition` 元素，仅在请求代表包含 MediaStore 源的 CloudFront 分配时，才允许 CloudFront 访问 MediaStore 容器。这是要向其添加 OAC 的具有 MediaStore 源的分配。

以下是支持 CloudFront 分配访问 MediaStore 源的 MediaStore 容器策略示例。

**Example 支持启用了 OAC 的 CloudFront 分配进行只读访问的 MediaStore 容器策略**    
****  

```
{
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipalReadOnly",
                "Effect": "Allow",
                "Principal": {
                  "Service": "cloudfront.amazonaws.com"
                },
                "Action": [ 
                  "mediastore:GetObject"
                ],
                "Resource": "arn:aws:mediastore:us-east-1:111122223333:container/<container name>/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront-distribution-ID"
                    },
                    "Bool": {
                      "aws:SecureTransport": "true"
                    }
                }
            }
        ]
}
```

**Example 支持启用了 OAC 的 CloudFront 分配进行读写访问的 MediaStore 容器策略**    
****  

```
{
        "Version":"2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "AllowCloudFrontServicePrincipalReadWrite",
                "Effect": "Allow",
                "Principal": {
                  "Service": "cloudfront.amazonaws.com"
                },
                "Action": [ 
                  "mediastore:GetObject",
                  "mediastore:PutObject"
                ],
                "Resource": "arn:aws:mediastore:us-east-1:111122223333:container/container-name/*",
                "Condition": {
                    "StringEquals": {
                      "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/CloudFront-distribution-ID"
                    },
                    "Bool": {
                      "aws:SecureTransport": "true"
                    }
                }
            }
        ]
}
```

**注意**  
要允许写访问，您必须在 CloudFront 分配的行为设置中将 **Allowed HTTP methods**（允许的 HTTP 方法）配置为包含 `PUT`。

### 创建源访问控制
<a name="create-oac-mediastore"></a>

要创建 OAC，可以使用 AWS 管理控制台、CloudFormation、AWS CLI 或 CloudFront API。

------
#### [ Console ]

**创建源访问控制**

1. 登录 AWS 管理控制台，并通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 在导航窗格中，选择 **Origin access**（源访问）。

1. 选择 **Create control setting**（创建控制设置）。

1. 在 **Create control setting**（创建控制设置）表单上，执行以下操作：

   1. 在 **Details**（详细信息）窗格中，输入源访问控制的 **Name**（名称）和（可选）**Description**（描述）。

   1. 在 **Settings**（设置）中，建议保留默认设置 [**Sign requests (recommended)**（签署请求（推荐））]。有关更多信息，请参阅 [源访问控制的高级设置](#oac-advanced-settings-mediastore)。

1. 从 **Origin type**（源类型）下拉列表中选择 MediaStore。

1. 选择**创建**。

   创建 OAC 后，记下 **Name**（名称）。在以下过程中，您需要此名称。

**向分配中的 MediaStore 源添加源访问控制**

1. 通过以下网址打开 CloudFront 控制台：[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)。

1. 选择具有要向其添加 OAC 的 MediaStore 源的分配，然后选择 **Origins**（源）选项卡。

1. 选择要向其添加 OAC 的 MediaStore 源，然后选择 **Edit**（编辑）。

1. 对于源的 **Protocol**（协议），选择 **HTTPS only**（仅 HTTPS）。

1. 从 **Origin access control**（源访问控制）下拉菜单中，选择要使用的 OAC。

1. 选择**保存更改**。

分配开始部署到所有 CloudFront 边缘站点。当边缘站点收到新配置时，它会签署其发送到 MediaStore 桶源的所有请求。

------
#### [ CloudFormation ]

要使用 CloudFormation 创建源访问控制（OAC），请使用 `AWS::CloudFront::OriginAccessControl` 资源类型。以下示例显示了 YAML 格式的 CloudFormation 模板语法，用于创建源访问控制。

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: mediastore
      SigningBehavior: always
      SigningProtocol: sigv4
```

有关更多信息，请参阅 *AWS CloudFormation 用户指南* 中的 [AWS::CloudFront::OriginAccessControl](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html)。

------
#### [ CLI ]

要使用 AWS Command Line Interface (AWS CLI) 创建源访问控制，请使用 **aws cloudfront create-origin-access-control** 命令。您可以使用输入文件来提供命令的输入参数，而不是将每个单独的参数指定为命令行输入。

**创建源访问控制（带输入文件的 CLI）**

1. 使用以下命令创建名为 `origin-access-control.yaml` 的文件。此文件包含 **create-origin-access-control** 命令的所有输入参数。

   ```
   aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
   ```

1. 打开刚创建的 `origin-access-control.yaml` 文件。编辑文件以添加 OAC 的名称、描述（可选），然后将 `SigningBehavior` 更改为 `always`。然后保存文件。

   有关其他 OAC 设置的信息，请参阅[源访问控制的高级设置](#oac-advanced-settings-mediastore)。

1. 使用以下命令通过 `origin-access-control.yaml` 文件中的输入参数创建源访问控制。

   ```
   aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml
   ```

   记下命令输出中的 `Id` 值。您需要使用它将 OAC 添加到 CloudFront 分配中的 MediaStore 源。

**将 OAC 附加到现有分配中的 MediaStore 源（带输入文件的 CLI）**

1. 使用以下命令保存要向其添加 OAC 的 CloudFront 分配的分配配置。该分配必须有 MediaStore 源。

   ```
   aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
   ```

1. 打开刚创建的名为 `dist-config.yaml` 的文件。编辑文件，进行以下更改：
   + 在 `Origins` 对象中，将 OAC 的 ID 添加到名为 `OriginAccessControlId` 的字段中。
   + 从名为 `OriginAccessIdentity` 的字段中移除值（如果存在）。
   + 将 `ETag` 字段重命名为 `IfMatch`，但不更改字段的值。

   完成后保存该文件。

1. 使用以下命令更新分配以使用源访问控制。

   ```
   aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml
   ```

分配开始部署到所有 CloudFront 边缘站点。当边缘站点收到新配置时，它会签署其发送到 MediaStore 源的所有请求。

------
#### [ API ]

要使用 CloudFront API 创建源访问控制，请使用 [CreateOriginAccessControl](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginAccessControl.html)。有关您在此 API 调用中指定的字段的更多信息，请参阅 AWS 开发工具包或其他 API 客户端的 API 参考文档。

创建源访问控制后，可以使用下面的任何一个 API 调用将其附加到分配中的 MediaStore 源：
+ 要将它附加到现有分配，请使用 [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)。
+ 要将它附加到新分配，请使用 [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)。

对于这两个 API 调用，请在源内的 `OriginAccessControlId` 字段中提供源访问控制 ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

## 源访问控制的高级设置
<a name="oac-advanced-settings-mediastore"></a>

CloudFront 源访问控制特征包括仅适用于特定使用案例的高级设置。除非您特别需要高级设置，否则请使用推荐的设置。

源访问控制包含一个名为 **Signing behavior**（签名行为）（在控制台中）或 `SigningBehavior`（在 API、CLI 和 CloudFormation）的设置。此设置提供以下选项：

**始终签署源请求（推荐设置）**  
我们建议使用此设置，此设置在控制台中名为**签署请求（推荐）**，在 API、CLI 和 CloudFormation 中名为 `always`。使用此设置，CloudFront 将始终签署其发送到 MediaStore 源的所有请求。

**切勿签署源请求**  
此设置在控制台中名为 **Do not sign requests**（请勿签署请求），在 API、CLI 和 CloudFormation 中名为 `never`。使用此设置关闭所有使用此源访问控制的分配中所有源的源访问控制。与从所有使用源访问控制的源和分配中逐一删除源访问控制相比，这可以节省时间和精力。使用此设置，CloudFront 不会签署其发送到 MediaStore 源的任何请求。  
要使用此设置，MediaStore 源必须可供公开访问。如果您将此设置用于不可公开访问的 MediaStore 源，则 CloudFront 无法访问该源。MediaStore 源向 CloudFront 返回错误，而 CloudFront 将这些错误传递给查看器。有关更多信息，请参阅[通过 HTTPS 进行公有读取访问](https://docs.aws.amazon.com/mediastore/latest/ug/policies-examples-public-https.html)的 MediaStore 容器策略示例。

**不要改写查看器（客户端）`Authorization` 标头**  
此设置在控制台中名为 **Do not override authorization header**（请勿改写授权标头），在 API、CLI 和 CloudFormation 中名为 `no-override`。如果您希望 CloudFront 仅在相应的查看器请求不包含 `Authorization` 标头时签署源请求，请使用此设置。使用此设置，CloudFront 会在查看器请求中存在 `Authorization` 标头时传递该标头，但在查看器请求不包含 `Authorization` 标头时对源请求进行签名（添加自己的 `Authorization` 标头）。  
要传递查看器请求的 `Authorization` 标头，您*必须* 针对所有使用与此源访问控制关联的 MediaStore 源的缓存行为将 `Authorization` 标头添加到[缓存策略](controlling-the-cache-key.md)中。