

# Restringir o acesso a uma origem do AWS Lambda Web Function
<a name="private-content-restricting-access-to-lambda-web"></a>

Você pode usar o controle de acesso de origem (OAC) para restringir o acesso a uma origem do AWS Lambda Web Function. Uma Lambda Web Function fornece seu próprio endpoint HTTPS regional ou global, que você usa como domínio de origem para sua distribuição do CloudFront. Para obter mais informações sobre as Lambda Web Functions, consulte [AWS Lambda Web Functions](https://docs.aws.amazon.com/lambda/latest/dg/web-functions.html) no *AWS Lambda Guia do desenvolvedor*.

**nota**  
O OAC com Lambda Web Functions não é compatível com endpoints globais que incluem Regiões opcionais. Se o endpoint rotear uma solicitação para uma Região opcional, o CloudFront não poderá assinar a solicitação para essa Região. Em seguida, a origem retornará um erro HTTP 403 (Forbidden). Todas as regiões associadas ao endpoint global devem ser regiões que estão ativadas por padrão.

Para obter mais informações sobre como usar o OAC com uma origem de URL de função do Lambda, consulte [Restringir o acesso a uma origem do URL de função do AWS Lambda](private-content-restricting-access-to-lambda.md).

## Pré-requisitos
<a name="oac-prerequisites-lambda-web"></a>

Antes de criar e configurar o OAC, você deve ter uma distribuição do CloudFront com uma Lambda Web Function como origem. O nome de domínio de origem é o nome do host do endpoint da Lambda Web Function. O CloudFront identifica o [tipo de endpoint](https://docs.aws.amazon.com/lambda/latest/dg/web-functions-endpoints.html#web-functions-endpoint-types) a partir do nome do host:
+ Endpoint regional (`HomeRegion` e `PerRegion` tipos de endpoint) – O nome do host termina em `.lambda-web.{{AWS-Region}}.on.aws`
+ Endpoint global (tipo de endpoint `MultiRegion`) – O nome do host termina em `.lambda-web.global.on.aws`

Sua configuração também deve atender aos seguintes requisitos:
+ **Tipo de autenticação do endpoint** – O tipo de autenticação do endpoint deve ser `IamAuth`. Com `IamAuth`, o endpoint usa AWS Identity and Access Management (IAM) para autenticar e autorizar solicitações. Para solicitações do CloudFront, a autorização baseia-se na política baseada em recursos da Lambda Web Function. O CloudFront assina solicitações em nome do visualizador, e o endpoint valida a assinatura. Para obter mais informações, consulte [Integração do CloudFront](https://docs.aws.amazon.com/lambda/latest/dg/web-functions-endpoint-access-control.html#web-functions-endpoint-access-control-cloudfront) no *AWS Lambda Guia do desenvolvedor*.
+ **Política de cache** – Se sua Lambda Web Function usa o cabeçalho `Authorization` do visualizador, você deve adicionar o cabeçalho à [política de cache](controlling-the-cache-key.md). Esse requisito se aplica a todos os comportamentos de cache que usam a origem. Para solicitações `GET` e `HEAD`, o CloudFront remove o cabeçalho `Authorization` antes de encaminhar a solicitação, a menos que o cabeçalho esteja na política de cache. Para obter mais informações, consulte [Cabeçalhos de solicitação HTTP e comportamento do CloudFront (origens do Amazon S3 e personalizadas)](RequestAndResponseBehaviorCustomOrigin.md#request-custom-headers-behavior).
+ **Política de solicitação de origem** – Use uma política de solicitação de origem que exclua o cabeçalho `Host` do visualizador. Os endpoints da Lambda Web Function esperam que o cabeçalho `Host` contenha o nome do domínio de origem, não o nome de domínio da distribuição do CloudFront. Se o cabeçalho `Host` contiver o nome de domínio da distribuição, o endpoint retornará um erro HTTP 404 (Não encontrado). Se você usar uma política de solicitação de origem gerenciada, use `AllViewerExceptHostHeader`, não `AllViewer`. Para obter mais informações, consulte [AllViewerExceptHostHeader](using-managed-origin-request-policies.md#managed-origin-request-policy-all-viewer-except-host-header).

**nota**  
Os gatilhos de solicitação de origem e resposta de origem do Lambda@Edge não são compatíveis com comportamentos de cache que usam uma origem do Lambda Web Function com OAC. Isso se aplica a endpoints regionais e globais, bem como a origens acessadas diretamente ou por meio de um grupo de origens. O CloudFront rejeita uma configuração de distribuição que contenha ambos.

## Conceder permissão ao CloudFront para acessar a Lambda Web Function
<a name="oac-permission-to-access-lambda-web"></a>

Anexe uma política baseada em recursos à Lambda Web Function que permite a entidade principal de serviço do CloudFront (`cloudfront.amazonaws.com`) invocar o endpoint. A ação do IAM para invocar um endpoint é `lambda:InvokeWebFunctionEndpoint`. A política é anexada à Lambda Web Function, mas cada instrução pode definir o escopo da `Resource` para um ARN de endpoint específico. Use um elemento `Condition` para permitir que o CloudFront acesse o endpoint somente quando a solicitação for em nome da distribuição do CloudFront que contém a origem.

**Example Política baseada em recurso para o CloudFront OAC**  

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCloudFrontOACAccess",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "lambda:InvokeWebFunctionEndpoint",
            "Resource": "arn:aws:lambda:us-east-1:{{111122223333}}:web-function/{{my-function}}/endpoint/{{prod}}",
            "Condition": {
                "StringEquals": {
                    "aws:SourceArn": "arn:aws:cloudfront::{{111122223333}}:distribution/{{EDFDVBD6EXAMPLE}}"
                }
            }
        }
    ]
}
```

Para anexar a política baseada em recursos, use o comando **put-resource-policy** com o ARN da *função* (não um ARN de endpoint):

```
aws lambda-web put-resource-policy \
  --resource-arn "arn:aws:lambda:us-east-1:{{111122223333}}:web-function/{{my-function}}" \
  --policy file://policy.json \
  --region us-east-1
```

Você pode revisar ou remover a política com os comandos **get-resource-policy** e **delete-resource-policy**.

**nota**  
Para endpoints que abrangem mais de uma Região, o Lambda replica as alterações de política em todas as regiões que atendem ao endpoint. Uma política nova ou atualizada pode levar algum tempo para entrar em vigor em cada Região. Para obter mais informações, consulte [Replicação e consistência eventual](https://docs.aws.amazon.com/lambda/latest/dg/web-functions-permissions.html#web-functions-permissions-resource-policy-replication) no *AWS Lambda Guia do desenvolvedor do*.

## Criar o controle de acesso à origem
<a name="create-oac-lambda-web"></a>

Para criar um controle de acesso à origem (OAC), você pode usar o Console de gerenciamento da AWS, o CloudFormation, a AWS CLI ou a API do CloudFront.

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

**Como criar um controle de acesso à origem**

1. Faça login no Console de gerenciamento da AWS e abra o console do CloudFront em [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. No painel de navegação, selecione **Origem access** (Acesso à origem).

1. Selecione **Create control setting** (Criar configuração de controle).

1. No formulário **Create control setting** (Criar configuração de controle), faça o seguinte:

   1. No painel **Details** (Detalhes), insira um **Name** (Nome) e (opcionalmente) uma **Description** (Descrição) para o controle de acesso à origem.

   1. Selecione **Lambda** no menu **suspenso** Tipo de origem. Esse tipo de origem é usado tanto para URLs de função do Lambda e Lambda Web Functions.

   1. Se sua origem for um endpoint global (o nome do host termina em `.lambda-web.global.on.aws`), selecione a opção **Usar protocolo de assinatura SigV4a**. Para um endpoint regional (o nome do host termina em `.lambda-web.{{AWS-Region}}.on.aws`), deixe essa opção desmarcada.

   1. Em **Comportamento de assinatura**, escolha **Sempre assinar, preservar a autorização do visualizador**. Essa opção aparece em **Assinar solicitações (recomendado)**, que vem selecionada por padrão. Origens do Lambda Web Function oferecem suporte apenas a esse comportamento de assinatura. Para obter mais informações, consulte [Comportamento de assinatura](#oac-signing-behavior-lambda-web).

1. Escolha **Criar**.

**Para adicionar um controle de acesso de origem a uma origem do Lambda Web Function em uma distribuição**

1. Abra o console do CloudFront em [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Escolha uma distribuição com uma origem do Lambda Web Function à qual deseja adicionar o OAC e escolha a guia **Origens**.

1. Selecione a origem Lambda Web Function à qual deseja adicionar o OAC e escolha **Editar**.

1. Em **Origin access** (Acesso à origem), selecione **Origin access control settings (recommended)** (Configurações de controle de acesso à origem [recomendado]).

1. No menu suspenso **Origin access control** (Controle de acesso à origem), selecione o OAC que você deseja usar.

1. Escolha **Salvar alterações**.

A distribuição começa a ser implantada em todos os locais da borda do CloudFront. Quando um local da borda recebe a nova configuração, ele assina todas as solicitações enviadas para a origem do Lambda Web Function.

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

Use o comando **create-origin-access-control**. Para um endpoint regional (o nome do host termina em `.lambda-web.{{AWS-Region}}.on.aws`), use o protocolo de assinatura `sigv4`:

```
aws cloudfront create-origin-access-control \
    --origin-access-control-config '{
        "Name": "my-lambda-web-oac",
        "Description": "OAC for Lambda Web Function origin",
        "SigningProtocol": "sigv4",
        "SigningBehavior": "always-amz-auth",
        "OriginAccessControlOriginType": "lambda"
    }'
```

Para um endpoint global (o nome do host termina em `.lambda-web.global.on.aws`), use o protocolo de assinatura `sigv4a`:

```
aws cloudfront create-origin-access-control \
    --origin-access-control-config '{
        "Name": "my-lambda-web-global-oac",
        "Description": "OAC for global Lambda Web Function origin",
        "SigningProtocol": "sigv4a",
        "SigningBehavior": "always-amz-auth",
        "OriginAccessControlOriginType": "lambda"
    }'
```

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

Especifique os seguintes valores em `OriginAccessControlConfig`:
+ `SigningProtocol`: `sigv4` (endpoint regional) ou `sigv4a` (endpoint global)
+ `SigningBehavior`: `always-amz-auth`
+ `OriginAccessControlOriginType`: `lambda`

**Example CloudFormationModelo do**  

```
Type: AWS::CloudFront::OriginAccessControl
Properties:
  OriginAccessControlConfig:
    Description: An optional description for the origin access control
    Name: my-lambda-web-oac
    OriginAccessControlOriginType: lambda
    SigningBehavior: always-amz-auth
    SigningProtocol: sigv4a
```

Para obter mais informações, consulte [AWS::CloudFront::OriginAccessControl](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html) no *Guia do usuário do AWS CloudFormation*.

------

O OAC entra em vigor para cada solicitação somente após a conclusão da implantação da distribuição. Para um endpoint que abrange mais de uma Região, a política baseada em recursos que você anexou anteriormente também deve concluir a replicação para cada Região que atende ao endpoint. Até que ambos sejam concluídos, algumas solicitações poderão receber uma resposta HTTP 403 transitória da origem. Esses erros são resolvidos automaticamente depois que a distribuição conclui a implantação e a política conclui a replicação.

## Comportamento de assinatura
<a name="oac-signing-behavior-lambda-web"></a>

Origens do Lambda Web Function oferecem suporte apenas ao comportamento de assinatura `always-amz-auth` (**Sempre assinar, preservar autorização do visualizador** no console). O CloudFront sempre assina todas as solicitações enviadas à Lambda Web Function, mas não substitui o cabeçalho `Authorization` da solicitação do visualizador. Em vez disso, o CloudFront adiciona sua assinatura em um cabeçalho dedicado do CloudFront e passa o cabeçalho `Authorization` do visualizador para a origem sem modificações. Com esse comportamento, sua Lambda Web Function pode receber o cabeçalho original `Authorization` do visualizador (por exemplo, para realizar sua própria autenticação ou autorização). O CloudFront ainda assina todas as solicitações que envia para a origem. Para encaminhar o cabeçalho `Authorization` do visualizador, você deve adicioná-lo a uma [política de cache](controlling-the-cache-key.md) para cada comportamento de cache que usa a origem.

Os outros comportamentos de assinatura (`always`, `never`, e `no-override`) não são compatíveis com as origens do Lambda Web Function. O comportamento de assinatura `always-amz-auth` não é compatível com nenhum outro tipo de origem, incluindo origens de URL da função do Lambda.

Para solicitações `PUT`, `POST`, e `PATCH`, o CloudFront assina a solicitação de origem com uma carga útil não assinada (`UNSIGNED-PAYLOAD`). O corpo da solicitação não é coberto pela assinatura do CloudFront. A assinatura ainda cobre o método da solicitação, o caminho, a string de consulta e os cabeçalhos que identificam sua distribuição. Portanto, o endpoint pode verificar se cada solicitação vem do CloudFront em nome de sua distribuição antes de invocar sua Lambda Web Function. O corpo da solicitação é protegido em trânsito pela conexão HTTPS entre o CloudFront e o endpoint. Você não precisa incluir um cabeçalho `x-amz-content-sha256` nas solicitações para o CloudFront. Se um visualizador enviar um, o CloudFront não o usará ao assinar a solicitação de origem.