Lambdas em Camadas: AWS SAM e Python
Um pouco de reutilização de código nunca faz mal.
Estas são as instruções passo a passo sobre como adicionar camadas (layers) às AWS Lambdas - em Python. Será utilizado o código base gerado pelo exemplo de modelo padrão “HelloWorld”.

E sim, é claro que você precisa ter tudo o que concerne ao Python e às ferramentas AWS SAM pré-instalado e configurado.
Gerando e executando o projeto de exemplo
Agora, execute sam init e responda às perguntas da maneira padrão, como segue:

Ele mostrará o resumo:

e criará a pasta do projeto com a estrutura e alguns arquivos. O arquivo template.yaml é bastante padrão.

E também o código da função (você removerá os comentários extras gerados).
import json
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
# "location": ip.text.replace("\n", "")
}),
}
Agora vamos construir e chamar esta função localmente:
sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json
O final da resposta deve ser próximo do seguinte:
.....
START RequestId: 6da35464-7c6a-40b2-bcc0-60796994317a Version: $LATEST
END RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599
REPORT RequestId: 737ae28d-2b99-49e6-baae-40ab9bb99599 Init Duration: 0.04 ms Duration: 28.40 ms Billed Duration: 29 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\"}"}
Adicionando a camada (layer)
Adicionar a descrição da camada ao template.yaml
Dois pontos principais:
ApiSharedLayer- bloco que a descreveLayers: ... - !Ref ApiSharedLayer- na função que a utiliza
.....
Resources:
# início do código adicionado
ApiSharedLayer:
Type: AWS::Serverless::LayerVersion
Properties:
ContentUri: api_shared_layer/
LayerName: api-shared-layer
Description: My api-shared-layer
CompatibleRuntimes:
- python3.9
RetentionPolicy: Delete
Metadata:
BuildMethod: python3.9 # Necessário para que o AWS SAM construa esta camada
# fim do código adicionado
HelloWorldFunction:
Type: AWS::Serverless::Function # Mais informações sobre Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction
Properties:
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.9
Architectures:
- x86_64
# início do código adicionado
Layers:
- !Ref ApiSharedLayer
# fim do código adicionado
Events:
.....
Adicionar o código da camada
Na pasta api_shared_layer, adicione algum código:

Atualizar a função para usar este código
import json
from api_version import API_VERSION
def lambda_handler(event, context):
return {
"statusCode": 200,
"body": json.dumps({
"message": "hello world",
"version": API_VERSION
}),
}
Testar a execução
Novamente:
sam validate && sam build --use-container && sam local invoke HelloWorldFunction --event events/event.json
O final da resposta deve ser próximo do seguinte:
.....
START RequestId: 88eb1887-ae94-479d-a059-f87c4b71a282 Version: $LATEST
END RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf
REPORT RequestId: 927f7d05-4d13-44ba-9377-03e6d3e8bacf Init Duration: 0.72 ms Duration: 34.80 ms Billed Duration: 35 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"hello world\", \"version\": \"1.1.1\"}"}
Ótimo.