

# Armazenamento de código do S3 autogerenciado
<a name="configuration-self-managed-storage"></a>

Por padrão, quando você cria ou atualiza uma função ou camada do Lambda a partir de um arquivo .zip, o Lambda armazena uma cópia do seu código no armazenamento gerenciado pelo Lambda. Cada conta da AWS tem uma cota de 300 GB para o armazenamento gerenciado pelo Lambda por região.

Com o armazenamento de código do S3 autogerenciado, você pode configurar o Lambda para fazer referência ao seu código diretamente de um bucket do S3 em sua conta. O Lambda não armazena uma cópia do seu código e, portanto, o código não conta na sua cota de armazenamento gerenciado pelo Lambda. O Lambda acessa seu código diretamente do bucket do S3.

O armazenamento de código do S3 autogerenciado está disponível para todas as funções e camadas criadas e atualizadas usando arquivos .zip. Ele é compatível com todas as classes de armazenamento do S3, exceto as classes de armazenamento do Glacier.

**nota**  
O armazenamento de código do S3 autogerenciado não altera o tamanho máximo do pacote de implantação .zip, que permanece em 250 MB (descompactado).

**Topics**
+ [Configuração do armazenamento de código do S3 autogerenciado](#self-managed-storage-setup)
+ [Configurar permissões](#self-managed-storage-permissions)
+ [Criação de uma função com armazenamento do S3 autogerenciado](#self-managed-storage-create-function)
+ [Uso do armazenamento do S3 autogerenciado com camadas](#self-managed-storage-layers)
+ [Alternar entre os modos de armazenamento](#self-managed-storage-switching)
+ [Ciclo de vida da função com armazenamento autogerenciado](#self-managed-storage-lifecycle)
+ [Uso entre contas e entre regiões](#self-managed-storage-cross-account)
+ [Considerações](#self-managed-storage-considerations)

## Configuração do armazenamento de código do S3 autogerenciado
<a name="self-managed-storage-setup"></a>

Para usar o armazenamento de código do S3 autogerenciado, conclua as seguintes etapas:

1. Crie um bucket do S3 ou use um bucket existente na sua conta.

1. Ative o [versionamento do S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html) para o bucket. O Lambda exige o versionamento do S3 para rastrear qual versão do objeto de origem será usada. Sempre que você carrega um novo pacote .zip, o S3 cria uma nova versão para que o Lambda possa distinguir as atualizações.

1. Faça o upload do seu pacote de implantação .zip no bucket do S3.

1. Conceda à entidade principal do serviço do Lambda as permissões `s3:GetObject` e `s3:GetObjectVersion` para o objeto de origem. Consulte [Configurar permissões](#self-managed-storage-permissions).

1. Crie ou atualize sua função ou camada, especificando o objeto do S3, a chave do S3, a versão do objeto do S3 e configurando `S3ObjectStorageMode` como `REFERENCE`.

## Configurar permissões
<a name="self-managed-storage-permissions"></a>

Para usar o armazenamento de código do S3 autogerenciado, conceda permissão à entidade principal do serviço do Lambda (`lambda.amazonaws.com`) para acessar seus objetos de origem. Adicione a política de bucket do S3 a seguir:

```
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "LambdaSelfManagedCodeAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:GetObjectVersion"
      ],
      "Resource": [
        "arn:aws:s3:::{{my-bucket}}/{{my-function.zip}}"
      ],
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Condition": {
        "ArnLike": {
          "aws:SourceArn": "arn:aws:lambda:{{us-east-1}}:{{111122223333}}:function:{{my-function}}"
        }
      }
    }
  ]
}
```

## Criação de uma função com armazenamento do S3 autogerenciado
<a name="self-managed-storage-create-function"></a>

Você pode criar uma função com armazenamento de código do S3 autogerenciado usando AWS CLI ou AWS CloudFormation.

### Como usar o AWS CLI
<a name="self-managed-storage-cli"></a>

Use o comando `create-function` com o parâmetro `S3ObjectStorageMode=REFERENCE`:

```
aws lambda create-function \
  --function-name my-function \
  --runtime python3.12 \
  --role arn:aws:iam::111122223333:role/lambda-execution-role \
  --handler lambda_function.lambda_handler \
  --code S3Bucket={{my-bucket}},\
S3Key={{my-function.zip}},\
S3ObjectVersion={{abc123def456}},\
S3ObjectStorageMode=REFERENCE
```

Para atualizar uma função existente para usar o armazenamento do S3 autogerenciado:

```
aws lambda update-function-code \
  --function-name my-function \
  --s3-bucket {{my-bucket}} \
  --s3-key {{my-function.zip}} \
  --s3-object-version {{abc123def456}} \
  --s3-object-storage-mode REFERENCE
```

**Importante**  
Você deve especificar `S3ObjectStorageMode=REFERENCE` em cada chamada para `update-function-code`. Se você omitir `S3ObjectStorageMode`, o padrão será `COPY` e o Lambda armazenará seu código no armazenamento gerenciado pelo Lambda.

### Usar o AWS CloudFormation
<a name="self-managed-storage-cfn"></a>

No seu modelo CloudFormation, defina `S3ObjectStorageMode` como `REFERENCE` na propriedade `Code` do recurso `AWS::Lambda::Function`:

```
Resources:
  MyFunction:
    Type: AWS::Lambda::Function
    Properties:
      FunctionName: my-function
      Runtime: python3.12
      Handler: lambda_function.lambda_handler
      Role: !GetAtt LambdaExecutionRole.Arn
      Code:
        S3Bucket: {{my-bucket}}
        S3Key: {{my-function.zip}}
        S3ObjectVersion: {{abc123def456}}
        S3ObjectStorageMode: REFERENCE
```

## Uso do armazenamento do S3 autogerenciado com camadas
<a name="self-managed-storage-layers"></a>

Você também pode usar o armazenamento de código do S3 autogerenciado para versões de camadas. Use o comando `publish-layer-version` com `S3ObjectStorageMode=REFERENCE`:

```
aws lambda publish-layer-version \
  --layer-name my-layer \
  --content S3Bucket={{my-bucket}},S3Key={{my-layer.zip}},S3ObjectStorageMode=REFERENCE \
  --compatible-runtimes python3.12
```

Você pode usar qualquer combinação de armazenamento gerenciado pelo Lambda e autogerenciado para o código da função e o código da camada.

## Alternar entre os modos de armazenamento
<a name="self-managed-storage-switching"></a>

Você pode alternar entre armazenamento de código do S3 gerenciado pelo Lambda e autogerenciado ao atualizar o código da função ou publicar uma nova versão da camada. Defina `S3ObjectStorageMode` como `COPY` ou `REFERENCE`.
+ `COPY` (padrão): o Lambda copia seu código-fonte para o armazenamento gerenciado pelo Lambda.
+ `REFERENCE`: o Lambda faz referência ao seu código-fonte diretamente do bucket do S3 sem armazenar uma cópia.

Quando você alterna de `COPY` para `REFERENCE`, o Lambda exclui a cópia gerenciada pelo Lambda do seu código-fonte. Quando você alterna de `REFERENCE` para `COPY`, o Lambda faz uma cópia do seu código-fonte no armazenamento gerenciado pelo Lambda. Alternar para `COPY` falhará se você exceder o limite de armazenamento de código gerenciado pelo Lambda.

## Ciclo de vida da função com armazenamento autogerenciado
<a name="self-managed-storage-lifecycle"></a>

O Lambda acessa periodicamente o objeto de origem do bucket do S3 para otimizar de novo o código da função. Você deve manter o acesso ao objeto de origem para que sua função permaneça ativa.
+ Se o Lambda perder o acesso ao objeto de origem de uma função, a função fará a transição para o estado `Inactive`. Para restaurar a função, restaure o acesso ao objeto de origem e atualize a função.
+ Se o Lambda perder o acesso ao objeto de origem de uma camada, a função permanecerá `Active`. Você pode atualizar a configuração da função (sem atualizar as camadas), atualizar o código da função ou atualizar a configuração da função com novas camadas. No entanto, a atualização da configuração da função com a camada inacessível produzirá uma falha.

## Uso entre contas e entre regiões
<a name="self-managed-storage-cross-account"></a>

Você pode criar funções e camadas do código-fonte nos buckets do S3 em diferentes contas e em diferentes regiões. A recuperação de objetos entre regiões gera custos adicionais de transferência de dados do S3. Consulte [Preços do S3](https://aws.amazon.com/s3/pricing/) para obter detalhes.

## Considerações
<a name="self-managed-storage-considerations"></a>
+ O armazenamento de código do S3 autogerenciado está disponível apenas para as funções e camadas do arquivo .zip. As funções da imagem do contêiner continuam usando o Amazon ECR.
+ O tamanho máximo do pacote de implantação .zip (250 MB descompactado) permanece inalterado.
+ Você paga as taxas de armazenamento padrão do Amazon S3 pelo código armazenado em seus buckets autogerenciados. O Lambda não cobra pela recuperação de objetos do S3 na mesma região.
+ O armazenamento de código do S3 autogerenciado é compatível com todas as classes de armazenamento do S3, exceto as classes de armazenamento do Glacier.
+ Você pode usar os recursos do S3, como a replicação entre regiões do S3, para compartilhar artefatos entre regiões e políticas de ciclo de vida do S3 para gerenciar objetos.