

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

CloudFront 提供*源访问控制*（OAC），用于限制对 MediaPackage v2 源的访问。

**注意**  
CloudFront OAC 仅支持 MediaPackage v2。不支持 MediaPackage v1。

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

## 创建新的 OAC
<a name="create-oac-overview-mediapackage"></a>

完成以下主题中描述的步骤，在 CloudFront 中设置新的 OAC。

**Topics**
+ [先决条件](#oac-prerequisites-mediapackage)
+ [向 CloudFront 授予访问 MediaPackage v2 源的权限](#oac-permission-to-access-mediapackage)
+ [创建 OAC](#create-oac-mediapackage)

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

在创建和设置 OAC 之前，您必须拥有带 MediaPackage v2 源的 CloudFront 分配。有关更多信息，请参阅 [使用 MediaStore 容器或 MediaPackage 通道](DownloadDistS3AndCustomOrigins.md#concept_AWS_Media)。

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

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

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

**Example ：支持启用了 OAC 的 CloudFront 分配进行只读访问的 IAM 策略**  
以下策略允许 CloudFront 分配（`{{E1PDK09ESKHJWT}}`）访问 MediaPackage v2 源。该源是为 `Resource` 元素指定的 ARN。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontServicePrincipal",
            "Effect": "Allow",
            "Principal": {"Service": "cloudfront.amazonaws.com"},
            "Action": "mediapackagev2:GetObject",
            "Resource": "arn:aws:mediapackagev2:us-east-1:123456789012:channelGroup/{{channel-group-name}}/channel/{{channel-name}}/originEndpoint/{{origin_endpoint_name}}",
            "Condition": {
                "StringEquals": {"AWS:SourceArn": "arn:aws:cloudfront::123456789012:distribution/{{E1PDK09ESKHJWT}}"}
            }
        }
    ]
}
```

**备注**  
如果您启用了 MQAR 功能和来源访问控制（OAC），请将 `mediapackagev2:GetHeadObject` 操作添加到 IAM 策略中。MQAR 需要此权限，才能向 MediaPackage v2 源发送 `HEAD` 请求。有关 MQAR 的更多信息，请参阅[媒体质量感知弹性](media-quality-score.md)。
如果您创建的分配无权访问您的 MediaPackage v2 源，则可以从 CloudFront 控制台中选择**复制策略**，然后选择**更新端点权限**。然后，您可以将复制的权限附加到端点。有关更多信息，请参阅《AWS Elemental MediaPackage 用户指南》**中的[端点策略字段](https://docs.aws.amazon.com/mediapackage/latest/userguide/endpoints-policy.html)。

### 创建 OAC
<a name="create-oac-mediapackage"></a>

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

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

**创建 OAC**

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. 在**创建新 OAC** 页面上，执行以下操作：

   1. 输入 OAC 的**名称**和（可选）**描述**。

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

1. 对于**源类型**，请选择 **MediaPackage V2**。

1. 选择**创建**。
**提示**  
创建 OAC 后，记下**名称**。在以下过程中，您需要此名称。

**向分配中的 MediaPackage v2 源添加 OAC**

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

1. 选择具有要向其中添加 OAC 的 MediaPackage V2 源的分配，然后选择**源**选项卡。

1. 选择要向其中添加 OAC 的 MediaPackage v2 源，然后选择**编辑**。

1. 对于源的**协议**，请选择**仅 HTTPS**。

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

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

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

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

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

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: mediapackagev2
      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-mediapackage)。

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

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

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

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

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

   ```
   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 边缘站点。当边缘站点收到新配置时，它会签署自己发送到 MediaPackage v2 源的所有请求。

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

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

创建 OAC 后，可以使用下面的任何一个 API 调用将其附加到分配中的 MediaPackage v2 源：
+ 要将它附加到现有分配，请使用 [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` 字段中提供 OAC ID。有关您在这些 API 调用中指定的其他字段的更多信息，请参阅 [所有分配设置参考](distribution-web-values-specify.md) 以及有关 AWS SDK 或其他 API 客户端的 API 参考文档。

------

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

CloudFront OAC 功能包括仅适用于特定使用案例的高级设置。除非您特别需要高级设置，否则请使用推荐的设置。

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

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

**切勿签署源请求**  
此设置在控制台中名为 **Do not sign requests**（请勿签署请求），在 API、CLI 和 CloudFormation 中名为 `never`。使用此设置关闭所有使用此 OAC 的分配中所有源的 OAC。与从所有使用 OAC 的源和分配中逐一删除 OAC 相比，这可以节省时间和精力。使用此设置，CloudFront 不会签署自己发送到 MediaPackage v2 源的任何请求。  
要使用此设置，MediaPackage v2 源必须可供公开访问。如果您将此设置用于不可公开访问的 MediaPackage v2 源，则 CloudFront 无法访问该源。MediaPackage v2 源向 CloudFront 返回错误，而 CloudFront 将这些错误传递给查看器。有关更多信息，请参阅《AWS Elemental MediaPackage 用户指南》**中针对 [MediaPackage 中的策略和权限](https://docs.aws.amazon.com/mediapackage/latest/userguide/policies-permissions.html)的 MediaPackage v2 策略示例。

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