Terraform Module, que crea casi todos los recursos de AWS Lambda admitidos, así como para cuidar la construcción y el empaque de las dependencias de lambda requeridas para funciones y capas.
Este módulo de Terraform es la parte de serverless.tf framework, cuyo objetivo es simplificar todas las operaciones cuando se trabaja con el servidor en Terraform:
serverless.tf
como HTTP API Gateway (ver ejemplos allí). module "lambda_function" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda1 "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
source_path = " ../src/lambda-function1 "
tags = {
Name = " my-lambda1 "
}
}
module "lambda_function" {
source = " terraform-aws-modules/lambda/aws "
function_name = " lambda-with-layer "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
publish = true
source_path = " ../src/lambda-function1 "
store_on_s3 = true
s3_bucket = " my-bucket-id-with-lambda-builds "
layers = [
module . lambda_layer_s3 . lambda_layer_arn ,
]
environment_variables = {
Serverless = " Terraform "
}
tags = {
Module = " lambda-with-layer "
}
}
module "lambda_layer_s3" {
source = " terraform-aws-modules/lambda/aws "
create_layer = true
layer_name = " lambda-layer-s3 "
description = " My amazing lambda layer (deployed from S3) "
compatible_runtimes = [ " python3.12 " ]
source_path = " ../src/lambda-layer "
store_on_s3 = true
s3_bucket = " my-bucket-id-with-lambda-builds "
}
module "lambda_function_existing_package_local" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-existing-package-local "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
create_package = false
local_existing_package = " ../existing_package.zip "
}
Si desea administrar el código de función y los recursos de infraestructura (como permisos de IAM, políticas, eventos, etc.) en flujos separados (por ejemplo, diferentes repositorios, equipos, tuberías de CI/CD).
Desactive el seguimiento del código fuente para desactivar las implementaciones (y las reversiones) utilizando el módulo configurando ignore_source_code_hash = true
e implementan una función ficticia .
Cuando se implementa la infraestructura y la función ficticia, puede usar una herramienta externa para actualizar el código fuente de la función (por ejemplo, usando AWS CLI) y seguir usando este módulo a través de Terraform para administrar la infraestructura.
Tenga en cuenta que los cambios en el valor local_existing_package
pueden activar la implementación a través de Terraform.
module "lambda_function_externally_managed_package" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-externally-managed-package "
description = " My lambda function code is deployed separately "
handler = " index.lambda_handler "
runtime = " python3.12 "
create_package = false
local_existing_package = " ./lambda_functions/code.zip "
ignore_source_code_hash = true
}
Tenga en cuenta que este módulo no copia los paquetes prebuetados en el cubo S3. Este módulo solo puede almacenar los paquetes que construye localmente y en un cubo S3.
locals {
my_function_source = " ../path/to/package.zip "
}
resource "aws_s3_bucket" "builds" {
bucket = " my-builds "
acl = " private "
}
resource "aws_s3_object" "my_function" {
bucket = aws_s3_bucket . builds . id
key = " ${ filemd5 (local . my_function_source ) } .zip "
source = local . my_function_source
}
module "lambda_function_existing_package_s3" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-existing-package-local "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
create_package = false
s3_existing_package = {
bucket = aws_s3_bucket.builds.id
key = aws_s3_object.my_function.id
}
}
module "lambda_function_container_image" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-existing-package-local "
description = " My awesome lambda function "
create_package = false
image_uri = " 132367819851.dkr.ecr.eu-west-1.amazonaws.com/complete-cow:1.0 "
package_type = " Image "
}
module "lambda_layer_local" {
source = " terraform-aws-modules/lambda/aws "
create_layer = true
layer_name = " my-layer-local "
description = " My amazing lambda layer (deployed from local) "
compatible_runtimes = [ " python3.12 " ]
source_path = " ../fixtures/python-app1 "
}
module "lambda_layer_s3" {
source = " terraform-aws-modules/lambda/aws "
create_layer = true
layer_name = " my-layer-s3 "
description = " My amazing lambda layer (deployed from S3) "
compatible_runtimes = [ " python3.12 " ]
source_path = " ../fixtures/python-app1 "
store_on_s3 = true
s3_bucket = " my-bucket-id-with-lambda-builds "
}
Asegúrese de implementar funciones Lambda@Edge en la región de US East (N. Virginia) ( us-east-1
). Consulte los requisitos y restricciones sobre las funciones de Lambda.
module "lambda_at_edge" {
source = " terraform-aws-modules/lambda/aws "
lambda_at_edge = true
function_name = " my-lambda-at-edge "
description = " My awesome lambda@edge function "
handler = " index.lambda_handler "
runtime = " python3.12 "
source_path = " ../fixtures/python-app1 "
tags = {
Module = " lambda-at-edge "
}
}
module "lambda_function_in_vpc" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-in-vpc "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
source_path = " ../fixtures/python-app1 "
vpc_subnet_ids = module . vpc . intra_subnets
vpc_security_group_ids = [ module . vpc . default_security_group_id ]
attach_network_policy = true
}
module "vpc" {
source = " terraform-aws-modules/vpc/aws "
name = " my-vpc "
cidr = " 10.10.0.0/16 "
# Specify at least one of: intra_subnets, private_subnets, or public_subnets
azs = [ " eu-west-1a " , " eu-west-1b " , " eu-west-1c " ]
intra_subnets = [ " 10.10.101.0/24 " , " 10.10.102.0/24 " , " 10.10.103.0/24 " ]
}
Hay 6 formas compatibles de adjuntar políticas de IAM al rol de IAM utilizada por la función Lambda:
policy_json
- JSON String o HEREDOC, When attach_policy_json = true
.policy_jsons
- Lista de cadenas JSON o HEREDOC, When attach_policy_jsons = true
y number_of_policy_jsons > 0
.policy
- ARN de Política IAM existente, When attach_policy = true
.policies
: lista de ARN de políticas de IAM existentes, cuando attach_policies = true
y number_of_policies > 0
.policy_statements
: mapa de mapas para definir las declaraciones de IAM que se generarán como política IAM. Requiere attach_policy_statements = true
. Ver examples/complete
para más información.assume_role_policy_statements
- Mapa de mapas para definir las declaraciones de IAM que se generarán como política de IAM para asumir el rol de la función Lambda (relación de confianza). Ver examples/complete
para más información. Se deben especificar los permisos de Lambda para permitir que ciertos recursos invocen la función Lambda.
module "lambda_function" {
source = " terraform-aws-modules/lambda/aws "
# ...omitted for brevity
allowed_triggers = {
Config = {
principal = " config.amazonaws.com "
principal_org_id = " o-abcdefghij "
}
APIGatewayAny = {
service = " apigateway "
source_arn = " arn:aws:execute-api:eu-west-1:135367859851:aqnku8akd0/*/*/* "
},
APIGatewayDevPost = {
service = " apigateway "
source_arn = " arn:aws:execute-api:eu-west-1:135367859851:aqnku8akd0/dev/POST/* "
},
OneRule = {
principal = " events.amazonaws.com "
source_arn = " arn:aws:events:eu-west-1:135367859851:rule/RunDaily "
}
}
}
A veces debe tener una forma de crear recursos condicionalmente, pero Terraform no permite el uso del Bloque module
count
Inside, por lo que la solución es especificar los argumentos create
.
module "lambda" {
source = " terraform-aws-modules/lambda/aws "
create = false # to disable all resources
create_package = false # to control build package process
create_function = false # to control creation of the Lambda Function and related resources
create_layer = false # to control creation of the Lambda Layer and related resources
create_role = false # to control creation of the IAM role and policies required for Lambda Function
attach_cloudwatch_logs_policy = false
attach_dead_letter_policy = false
attach_network_policy = false
attach_tracing_policy = false
attach_async_event_policy = false
# ... omitted
}
Esta es una de las partes más complicadas realizadas por el módulo y normalmente no tiene que conocer las partes internas.
package.py
es el script Python que lo hace. Asegúrese de que se instale Python 3.6 o más nuevo. Las funciones principales del script son generar un nombre de archivo de Zip-Archive basado en el contenido de los archivos, verificar si el Zip-Archive ya se ha creado y crear Zip-Archive solo cuando es necesario (durante apply
, no plan
) .
El hash de Zip-Archive creado con el mismo contenido de los archivos siempre es idéntico, lo que evita las actualizaciones innecesarias de los recursos Lambda a menos que se modifique el contenido. Si necesita tener diferentes nombres de archivo para el mismo contenido, puede especificar el argumento de cadena adicional hash_extra
.
Al llamar a este módulo varias veces en una ejecución para crear paquetes con el mismo source_path
, los arquitivos Zip-Archives se dañaron debido a las escrituras concurrentes en el mismo archivo. Hay dos soluciones: establecer diferentes valores para hash_extra
para crear diferentes archivos, o crear un paquete una vez afuera (usando este módulo) y luego pasar el argumento local_existing_package
para crear otros recursos de Lambda.
La construcción y el embalaje han sido históricamente difícil de depurar (especialmente con Terraform), por lo que hicimos un esfuerzo para facilitar el usuario ver información de depuración. Hay 3 niveles de depuración diferentes: DEBUG
: para ver solo lo que está sucediendo durante la fase de planificación y cómo un filtrado de contenido de archivo zip en caso de patrones aplicados, DEBUG2
, para ver más salida de registro, DEBUG3
- para ver todos los valores de registro, DUMP_ENV
- a Consulte todos los valores de registro y variables env (¡ten cuidado compartiendo tus variables envéticas, ya que pueden contener secretos!).
El usuario puede especificar el nivel de depuración como este:
export TF_LAMBDA_PACKAGE_LOG_LEVEL=DEBUG2
terraform apply
El usuario puede habilitar comentarios en cadenas HEREDOC en patterns
que pueden ser útiles en algunas situaciones. Para hacer esto, establecer esta variable de entorno:
export TF_LAMBDA_PACKAGE_PATTERN_COMMENTS=true
terraform apply
Puede especificar source_path
en una variedad de formas para lograr la flexibilidad deseada al construir paquetes de implementación localmente o en Docker. Puede usar rutas absolutas o relativas. Si ha colocado archivos Terraform en subdirectorios, tenga en cuenta que las rutas relativas se especifican desde el directorio donde se ejecuta terraform plan
y no la ubicación de su archivo Terraform.
Tenga en cuenta que, al construir localmente, los archivos no están copiando en ningún lugar de los directorios de origen al hacer paquetes, utilizamos expresiones regulares rápidas de Python para encontrar archivos y directorios coincidentes, lo que hace que el embalaje sea muy rápido y fácil de entender.
Cuando source_path
se establece en una cadena, el contenido de esa ruta se usará para crear el paquete de implementación como es:
source_path = "src/function1"
Cuando source_path
se establece en una lista de directorios, se tomará el contenido de cada uno y se creará un archivo.
Esta es la forma más completa de crear un paquete de implementación a partir de múltiples fuentes con múltiples dependencias. Este ejemplo muestra algunas de las opciones disponibles (ver ejemplos/paquete de compilación y ejemplos/tiempos de ejecución para más):
source_path = [
" src/main-source " ,
" src/another-source/index.py " ,
{
path = " src/function1-dep " ,
patterns = [
" !.*/.* \ .txt " , # Skip all txt files recursively
]
}, {
path = " src/python-app1 " ,
pip_requirements = true ,
pip_tmp_dir = " /tmp/dir/location "
prefix_in_zip = " foo/bar1 " ,
}, {
path = " src/python-app2 " ,
pip_requirements = " requirements-large.txt " ,
patterns = [
" !vendor/colorful-0.5.4.dist-info/RECORD " ,
" !vendor/colorful-.+.dist-info/.* " ,
" !vendor/colorful/__pycache__/?.* " ,
]
}, {
path = " src/nodejs14.x-app1 " ,
npm_requirements = true ,
npm_tmp_dir = " /tmp/dir/location "
prefix_in_zip = " foo/bar1 " ,
}, {
path = " src/python-app3 " ,
commands = [
" npm install " ,
" :zip "
],
patterns = [
" !.*/.* \ .txt " , # Skip all txt files recursively
" node_modules/.+ " , # Include all node_modules
],
}, {
path = " src/python-app3 " ,
commands = [ " go build " ],
patterns = << END
bin/.*
abc/def/.*
END
}
]
Pocas notas:
python
o nodejs
, el proceso de compilación construirá automáticamente dependencias de Python y NodeJS si requirements.txt
o el archivo package.json
se encontrará en la carpeta de origen. Si desea personalizar este comportamiento, utilice la notación del objeto como se explica a continuación.path
son opcionales.patterns
: la lista de nombres de archivo de Python Regex debe satisfacer. El valor predeterminado es "incluir todo" que es igual a patterns = [".*"]
. Esto también se puede especificar como una cadena Heredoc multiline (no se permiten comentarios). Algunos ejemplos de patrones válidos:commands
y los comandos múltiples de cadena, solo el código de salida del último comando se verificará para el éxito. Si prefiere fallar rápidamente, inicie los comandos con la opción bash set -e
o powershell opción $ErrorActionPreference="Stop"
!. * /. * .txt # Filter all txt files recursively
node_modules/. * # Include empty dir or with a content if it exists
node_modules/.+ # Include full non empty node_modules dir with its content
node_modules/ # Include node_modules itself without its content
# It's also a way to include an empty dir if it exists
node_modules # Include a file or an existing dir only
!abc/. * # Filter out everything in an abc folder
abc/def/. * # Re-include everything in abc/def sub folder
!abc/def/hgk/. * # Filter out again in abc/def/hgk sub folder
commands
: lista de comandos para ejecutar. Si se especifica, este argumento anula pip_requirements
y npm_requirements
.:zip [source] [destination]
es un comando especial que crea contenido del directorio de trabajo actual (primer argumento) y lo coloca dentro de la ruta (segundo argumento).pip_requirements
: controla si ejecutar pip install
. Establezca en false
para deshabilitar esta función, true
para ejecutar pip install
con requirements.txt
. Txt encontrado en path
. O Establezca en otro nombre de archivo que desea usar en su lugar. Cuando source_path
se pasa como una cadena que contiene una ruta (y no una lista de mapas), y requirements.txt
está presente, pip install
se ejecuta automáticamente.pip_tmp_dir
: configure el directorio base para hacer el directorio temporal para las instalaciones de PIP. Puede ser útil para Docker en Docker Builds.poetry_install
: controla si ejecutar poetry export
y pip install
. Establezca en false
para deshabilitar esta función, true
para ejecutar poetry export
con pyproject.toml
y poetry.lock
encontrado en path
. Cuando source_path
se pasa como una cadena que contiene una ruta (y no una lista de mapas), y pyproject.toml
con un sistema de compilación está presente, la poetry
poetry export
y pip install
se ejecutan automáticamente.poetry_export_extra_args
: una lista de argumentos de poesía adicionales para agregar al comando de exportación de poesíanpm_requirements
: controla si ejecutar npm install
. Establezca en false
para deshabilitar esta función, true
para ejecutar npm install
con package.json
encontrado en path
. O Establezca en otro nombre de archivo que desea usar en su lugar.npm_tmp_dir
: configure el directorio base para hacer el directorio temporal para instalaciones de NPM. Puede ser útil para Docker en Docker Builds.prefix_in_zip
: si se especifica, se utilizará como prefijo dentro de Zip -Archive. Por defecto, todo se instala en la raíz de Zip-Archive.Si su función o capa Lambda usa algunas dependencias, puede construirlas en Docker y incluirlas en el paquete de implementación. Así es como puedes hacerlo:
build_in_docker = true
docker_file = "src/python-app1/docker/Dockerfile"
docker_build_root = "src/python-app1/docker"
docker_image = "public.ecr.aws/sam/build-python"
runtime = "python3.12" # Setting runtime is required when building package in Docker and Lambda Layer resource.
Usando este módulo puede instalar dependencias de hosts privados. Para hacer esto, necesita un agente SSH avanzado:
docker_with_ssh_agent = true
Tenga en cuenta que, de forma predeterminada, el docker_image
utilizado proviene del registro public.ecr.aws/sam/
/, y se basará en el runtime
que especifique. En otras palabras, si especifica un tiempo de ejecución de python3.12
y no especifica docker_image
, entonces el docker_image
resolverá public.ecr.aws/sam/build-python3.12
. Esto asegura que, por defecto, el runtime
esté disponible en el contenedor Docker.
Si anula docker_image
, asegúrese de mantener la imagen en sincronización con su runtime
. Durante la fase del plan, al usar Docker, no hay verificación de que el runtime
esté disponible para construir el paquete. Eso significa que si usa una imagen que no tiene el tiempo de ejecución, el plan aún tendrá éxito, pero entonces la aplicación fallará.
Para agregar flexibilidad al construir en Docker, puede aprobar cualquier cantidad de opciones adicionales que necesita (consulte la referencia de Docker Ejecutar para las opciones disponibles):
docker_additional_options = [
" -e " , " MY_ENV_VAR='My environment variable value' " ,
" -v " , " /local:/docker-vol " ,
]
Para anular el punto de entrada de Docker cuando se construye en Docker, configure docker_entrypoint
:
docker_entrypoint = " /entrypoint/entrypoint.sh "
El punto de entrada debe asignar a una ruta dentro de su contenedor, por lo que debe construir su propia imagen que contenga el punto de entrada o asignarlo a un archivo en el host al montar un volumen (consulte pasando opciones adicionales de Docker).
De manera predeterminada, este módulo crea un paquete de implementación y lo usa para crear o actualizar la función Lambda o la capa Lambda.
A veces, es posible que desee separar la compilación del paquete de implementación (por ejemplo, para compilar e instalar dependencias) de la implementación de un paquete en dos pasos separados.
Al crear archivos localmente fuera de este módulo, debe establecer create_package = false
y luego argumento local_existing_package = "existing_package.zip"
. Alternativamente, puede preferir mantener sus paquetes de implementación en el cubo S3 y proporcionar una referencia a ellos como esta:
create_package = false
s3_existing_package = {
bucket = " my-bucket-with-lambda-builds "
key = " existing_package.zip "
}
Esto se puede implementar en dos pasos: descargue el archivo localmente usando Curl y pase la ruta al paquete de implementación como argumento local_existing_package
.
locals {
package_url = " https://raw.githubusercontent.com/terraform-aws-modules/terraform-aws-lambda/master/examples/fixtures/python-zip/existing_package.zip "
downloaded = " downloaded_package_ ${ md5 (local . package_url ) } .zip "
}
resource "null_resource" "download_package" {
triggers = {
downloaded = local.downloaded
}
provisioner "local-exec" {
command = " curl -L -o ${ local . downloaded } ${ local . package_url } "
}
}
data "null_data_source" "downloaded_package" {
inputs = {
id = null_resource.download_package.id
filename = local.downloaded
}
}
module "lambda_function_existing_package_from_remote_url" {
source = " terraform-aws-modules/lambda/aws "
function_name = " my-lambda-existing-package-local "
description = " My awesome lambda function "
handler = " index.lambda_handler "
runtime = " python3.12 "
create_package = false
local_existing_package = data . n ull_data_source . downloaded_package . outputs [ " filename " ]
}
AWS Sam CLI es una herramienta de código abierto que ayuda a los desarrolladores a iniciar, construir, probar e implementar aplicaciones sin servidor. La herramienta SAM CLI admite aplicaciones Terraform.
Sam CLI proporciona dos formas de pruebas: pruebas locales y pruebas en la nube (acelerar).
Usando SAM CLI, puede invocar las funciones de Lambda definidas en la aplicación TerraForm localmente utilizando el comando SAM Local Invoke, proporcionando la dirección de TerraForm de la función o el nombre de la función, y para establecer el hook-name
en terraform
para decirle a SAM CLI que el proyecto subyacente es una aplicación Terraform.
Puede ejecutar el comando sam local invoke
desde su directorio raíz de la aplicación Terraform según lo siguiente:
sam local invoke --hook-name terraform module.hello_world_function.aws_lambda_function.this[0]
También puede pasar un evento a su función Lambda o sobrescribir sus variables de entorno. Consulte aquí para obtener más información.
También puede invocar su función Lambda en modo de depuración y paso a través de su código fuente de función Lambda localmente en su editor preferido. Consulte aquí para obtener más información.
Puede usar AWS Sam CLI para probar rápidamente su aplicación en su cuenta de desarrollo de AWS. Usando Sam Acelerate, podrá desarrollar sus funciones Lambda a nivel local, y una vez que guarde sus actualizaciones, Sam CLI actualizará su cuenta de desarrollo con las funciones de Lambda actualizadas. Por lo tanto, puede probarlo en la nube, y si hay algún error, puede actualizar rápidamente el código, y Sam CLI se encargará de empujarlo a la nube. Consulte aquí para obtener más información sobre SAM Accelerate.
Puede ejecutar el comando sam sync
desde su directorio raíz de la aplicación Terraform como lo sigue:
sam sync --hook-name terraform --watch
Por lo general, las actualizaciones de recursos de la función Lambda cuando cambia el código fuente. Si publish = true
se especifica, también se creará una nueva versión de función Lambda.
La función Lambda publicada se puede invocar utilizando por número de versión o usando $LATEST
. Esta es la forma más simple de implementación que no requiere ninguna herramienta o servicio adicional.
Para realizar implementaciones controladas (rodantes, canarios, reversiones) de funciones Lambda, necesitamos usar alias de función Lambda.
En términos simples, el alias Lambda es como un puntero a una versión de la función Lambda (cuando se completa el despliegue), o a dos versiones ponderadas de la función Lambda (durante el despliegue de rodamiento o canario).
Se puede usar una función Lambda en múltiples alias. El uso de alias ofrece un gran control de qué versión implementada al tener múltiples entornos.
Existe el módulo de alias, que simplifica trabajar con alias (crear, administrar configuraciones, actualizaciones, etc.). Consulte ejemplos/alias para varios casos de uso cómo se pueden configurar y usar los alias.
Hay un módulo de implementación, que crea recursos requeridos para realizar implementaciones utilizando AWS CodeDePloy. También crea la implementación y espera completar. Consulte ejemplos/implementación para el proceso completo de compilación/actualización/implementación de extremo a extremo.
Terraform Cloud, Terraform Enterprise y muchos otros SaaS para ejecutar Terraform no tienen Python preinstalados en los trabajadores. Deberá proporcionar una imagen alternativa de Docker con Python instalada para poder usar este módulo allí.
P1: ¿Por qué el paquete de implementación no se recrea cada vez que cambio algo? ¿O por qué el paquete de implementación se recrea cada vez, pero el contenido no se ha cambiado?
Respuesta: Puede haber varias razones relacionadas con ejecuciones concurrentes, o con el hash de contenido. A veces, se han producido cambios dentro de la dependencia que no se usa para calcular el hash de contenido. O múltiples paquetes se están creando al mismo tiempo a partir de las mismas fuentes. Puede forzarlo estableciendo el valor de
hash_extra
a valores distintos.
P2: ¿Cómo forzar el paquete de implementación recreate?
Respuesta: Elimine un directorio de Zip-Archive existente del directorio
builds
o realice un cambio en su código fuente. Si no hay Zip-Archive para el hash de contenido actual, se recreará duranteterraform apply
.
Q3: null_resource.archive[0] must be replaced
Respuesta: Esto probablemente significa que se ha implementado Zip-Archive, pero actualmente está ausente localmente, y debe recrearse localmente. Cuando se encuentra con este problema durante el proceso de CI/CD (donde el espacio de trabajo está limpio) o desde múltiples espacios de trabajo, puede establecer la variable de entorno
TF_RECREATE_MISSING_LAMBDA_PACKAGE=false
o pasarrecreate_missing_package = false
como un parámetro para el módulo yterraform apply
. Alternativamente, puede pasartrigger_on_package_timestamp = false
como parámetro para ignorar la marca de tiempo del archivo al decidir crear el archivo o no.
P4: ¿Qué significa este error? "We currently do not support adding policies for $LATEST."
?
Respuesta: Cuando la función Lambda se crea con
publish = true
la nueva versión aumenta automáticamente y se usa un identificador calificado (número de versión) y se usará al establecer los permisos de Lambda.Cuando
publish = false
(predeterminado), solo está disponible el identificador no calificado ($LATEST
) que conduce al error.La solución es deshabilitar la creación de permisos LAMBDA para la versión actual configurando
create_current_version_allowed_triggers = false
, o para habilitar la publicación de la función lambda (publish = true
).
builds
a menudo está ausente.Nombre | Versión |
---|---|
terraformado | > = 1.0 |
AWS | > = 5.70 |
externo | > = 1.0 |
local | > = 1.0 |
nulo | > = 2.0 |
Nombre | Versión |
---|---|
AWS | > = 5.70 |
externo | > = 1.0 |
local | > = 1.0 |
nulo | > = 2.0 |
Sin módulos.
Nombre | Tipo |
---|---|
aws_cloudwatch_log_group.lambda | recurso |
aws_iam_policy.additional_inline | recurso |
aws_iam_policy.additional_json | recurso |
aws_iam_policy.additional_jsons | recurso |
aws_iam_policy.async | recurso |
aws_iam_policy.dead_letter | recurso |
aws_iam_policy.logs | recurso |
aws_iam_policy.tracing | recurso |
aws_iam_policy.vpc | recurso |
aws_iam_role.lambda | recurso |
aws_iam_role_policy_attachment.additional_inline | recurso |
aws_iam_role_policy_attachment.additional_json | recurso |
aws_iam_role_policy_attachment.additional_jsons | recurso |
aws_iam_role_policy_attachment.additional_many | recurso |
aws_iam_role_policy_attachment.additional_one | recurso |
aws_iam_role_policy_attachment.async | recurso |
aws_iam_role_policy_attachment.dead_letter | recurso |
aws_iam_role_policy_attachment.logs | recurso |
aws_iam_role_policy_attachment.tracing | recurso |
aws_iam_role_policy_attachment.vpc | recurso |
aws_lambda_event_source_mapping.THIS | recurso |
AWS_LAMBDA_FUNCTION.THIS | recurso |
AWS_LAMBDA_FUNCTION_EVENT_INVOKE_CONFIG.THIS | recurso |
AWS_LAMBDA_FUNCTION_URL.THIS | recurso |
AWS_LAMBDA_LAYER_VERSION.THIS | recurso |
aws_lambda_permission.current_version_triggers | recurso |
AWS_LAMBDA_PERMISSION.UNQUALIFICADO_ALIAS_TRIGGERS | recurso |
aws_lambda_provisioned_concurrency_config.current_version | recurso |
AWS_S3_Object.lambda_package | recurso |
local_file.archive_plan | recurso |
null_resource.archive | recurso |
null_resource.sam_metadata_aws_lambda_function | recurso |
null_resource.sam_metadata_aws_lambda_layer_version | recurso |
aws_arn.log_group_arn | fuente de datos |
AWS_CALLER_IDENTITY.CURRENT | fuente de datos |
aws_cloudwatch_log_group.lambda | fuente de datos |
aws_iam_policy.tracing | fuente de datos |
aws_iam_policy.vpc | fuente de datos |
aws_iam_policy_document.additional_inline | fuente de datos |
aws_iam_policy_document.assume_role | fuente de datos |
aws_iam_policy_document.async | fuente de datos |
aws_iam_policy_document.dead_letter | fuente de datos |
aws_iam_policy_document.logs | fuente de datos |
AWS_Partition.Current | fuente de datos |
AWS_region.Current | fuente de datos |
externo_external.archive_prepare | fuente de datos |
Nombre | Descripción | Tipo | Por defecto | Requerido |
---|---|---|---|---|
permitido_triggers | Mapa de desencadenantes permitidos para crear permisos de lambda | map(any) | {} | No |
arquitecturas | Arquitectura de establecimiento de instrucciones para su función Lambda. Los valores válidos son ["x86_64"] y ["ARM64"]. | list(string) | null | No |
artefactos_dir | Nombre del directorio donde se deben almacenar artefactos | string | "builds" | No |
asumir_role_policy_statements | Mapa de declaraciones de política dinámica para asumir el papel de la función Lambda (relación de confianza) | any | {} | No |
adjunte_async_event_policy | Controla si la política de eventos de async debe agregarse al rol de IAM para la función Lambda | bool | false | No |
adjuntar_cloudwatch_logs_policy | Controla si la política de registros de CloudWatch debe agregarse al rol de IAM para la función Lambda | bool | true | No |
adjunte_create_log_group_permission | Controla si agregar el permiso Crear grupo de registro a la Política de registros de CloudWatch | bool | true | No |
adjunte_dead_letter_policy | Controla si la política de notificación de letras muertas SNS/SQS debe agregarse al rol de IAM para la función Lambda | bool | false | No |
Adjunto_network_policy | Controla si la política de VPC/red debe agregarse al rol de IAM para la función LAMBDA | bool | false | No |
adjunte_policies | Controla si la lista de políticas debe agregarse al rol de IAM para la función Lambda | bool | false | No |
adjunte_policy | Controla si la política debe agregarse al rol de IAM para la función Lambda | bool | false | No |
adjunte_policy_json | Controla si Policy_json debe agregarse al rol de IAM para la función Lambda | bool | false | No |
adjunte_policy_jsons | Controla si Policy_jsons debe agregarse al rol de IAM para la función Lambda | bool | false | No |
Adjunto_policy_statements | Controla si Policy_Statements debe agregarse al rol de IAM para la función Lambda | bool | false | No |
adjunte_tracing_policy | Controla si la política de rastreo de rayos X debe agregarse al papel de IAM para la función Lambda | bool | false | No |
autorización_type | El tipo de autenticación que usa la URL de la función Lambda. Establezca en 'AWS_IAM' para restringir el acceso a usuarios de IAM autenticados solamente. Establezca en 'Ninguno' para evitar la autenticación de IAM y crear un punto final público. | string | "NONE" | No |
build_in_docker | Si construir dependencias en Docker | bool | false | No |
CloudWatch_logs_kms_key_id | El ARN de la tecla KMS para usar al cifrar datos de registro. | string | null | No |
CloudWatch_logs_log_group_class | Especificó la clase de registro del grupo log. Los valores posibles son: STANDARD o INFREQUENT_ACCESS | string | null | No |
CloudWatch_logs_Retention_in_days | Especifica la cantidad de días que desea retener eventos de registro en el grupo de registro especificado. Los valores posibles son: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827 y 3653. | number | null | No |
CloudWatch_logs_skip_destroy | Si debe mantener el grupo de registro (y cualquier registro que pueda contener) en el tiempo de destrucción. | bool | false | No |
CloudWatch_logs_tags | Un mapa de etiquetas para asignar al recurso. | map(string) | {} | No |
code_signing_config_arn | Nombre de recursos de Amazon (ARN) para una configuración de firma de código | string | null | No |
compatible_architectures | Una lista de arquitecturas lambda es compatible. Actualmente se pueden especificar X86_64 y Arm64. | list(string) | null | No |
compatible_runtimes | Una lista de tiempos de ejecución con los que esta capa es compatible. Se pueden especificar hasta 5 tiempos de ejecución. | list(string) | [] | No |
CORS | Configuración de CORS para ser utilizado por la URL de la función Lambda | any | {} | No |
crear | Controla si se deben crear recursos | bool | true | No |
create_async_event_config | Controla si se debe crear la configuración de eventos de async para la función lambda/alias | bool | false | No |
create_current_version_allowed_triggers | Si debe permitir desencadenantes en la versión actual de la función Lambda (esto revocará los permisos de la versión anterior porque Terraform gestiona solo los recursos actuales) | bool | true | No |
create_current_version_async_event_config | Si debe permitir la configuración del evento Async en la versión actual de la función Lambda (esto revocará los permisos de la versión anterior porque Terraform administra solo los recursos actuales) | bool | true | No |
create_function | Controla si se debe crear un recurso de función lambda | bool | true | No |
create_lambda_function_url | Controla si se debe crear el recurso URL de la función Lambda | bool | false | No |
create_layer | Controla si se debe crear el recurso de la capa lambda | bool | false | No |
create_package | Controla si se debe crear un paquete Lambda | bool | true | No |
create_role | Controla si se debe crear el rol de IAM para la función lambda | bool | true | No |
create_sam_metadata | Controla si se debe crear el recurso NULL SAM Metadata | bool | false | No |
create_Unualified_alias_allowed_triggers | Si permitir desencadenantes en alias no calificados que apuntan a $ última versión | bool | true | No |
create_unQalified_alias_async_event_config | Si permitir la configuración del evento Async en alias no calificados que apunta a $ última versión | bool | true | No |
create_unQalified_alias_lambda_function_url | Si se debe usar alias no calificados que apunta a $ última versión en URL de la función Lambda | bool | true | No |
Dead_letter_target_arn | El ARN de un tema SNS o la cola SQS para notificar cuándo falla una invocación. | string | null | No |
descripción | Descripción de su función Lambda (o capa) | string | "" | No |
destino_on_failure | Nombre de recursos de Amazon (ARN) del recurso de destino para invocaciones asíncronas fallidas | string | null | No |
Destino_on_success | Nombre de recursos de Amazon (ARN) del recurso de destino para invocaciones asincrónicas exitosas | string | null | No |
docker_additional_options | Opciones adicionales para pasar al comando Docker ejecutivo (por ejemplo, para establecer variables de entorno, volúmenes, etc.) | list(string) | [] | No |
docker_build_root | Root Dir donde construir en Docker | string | "" | No |
docker_entrypoint | Ruta al punto de entrada de Docker para usar | string | null | No |
docker_file | Camino a un Dockerfile cuando se construye en Docker | string | "" | No |
docker_image | Imagen de Docker para usar para la compilación | string | "" | No |
docker_pip_cache | Si montar una carpeta de caché PIP compartida en el entorno Docker o no | any | null | No |
docker_with_ssh_agent | Si pasar ssh_auth_sock al entorno de Docker o no | bool | false | No |
ambiente_variables | Un mapa que define las variables de entorno para la función Lambda. | map(string) | {} | No |
efímero_storage_size | Cantidad de almacenamiento efímero (/TMP) En MB, su función Lambda puede usar en tiempo de ejecución. Valor válido entre 512 MB a 10,240 MB (10 GB). | number | 512 | No |
event_source_mapping | Mapa del mapeo de la fuente de eventos | any | {} | No |
file_system_arn | El nombre de recursos de Amazon (ARN) del punto de acceso de Amazon EFS que proporciona acceso al sistema de archivos. | string | null | No |
file_system_local_mount_path | La ruta donde la función puede acceder al sistema de archivos, comenzando con /mnt /. | string | null | No |
function_name | Un nombre único para su función Lambda | string | "" | No |
function_tags | Un mapa de etiquetas para asignar solo a la función lambda | map(string) | {} | No |
entrenador de animales | Lambda Función Entrada de entrada en su código | string | "" | No |
hash_extra | La cadena para agregar a la función de hashing. Útil al construir la misma ruta fuente para diferentes funciones. | string | "" | No |
ignorar_source_code_hash | Si ignorar los cambios en el código fuente de la función hash. Establezca en True si administra las implementaciones de infraestructura y código por separado. | bool | false | No |
image_config_command | El CMD para la imagen de Docker | list(string) | [] | No |
image_config_entry_point | El punto de entrada para la imagen de Docker | list(string) | [] | No |
image_config_working_directory | El directorio de trabajo para la imagen de Docker | string | null | No |
Image_uri | La imagen ECR URI que contiene el paquete de implementación de la función. | string | null | No |
invoke_mode | Invocar el modo de la URL de la función Lambda. Los valores válidos se almacenan (predeterminados) y respuesta_stream. | string | null | No |
ipv6_allowed_for_dual_stack | Permite el tráfico IPv6 saliente en las funciones VPC que están conectadas a subredes de doble pila | bool | null | No |
KMS_KEY_ARN | La tecla ARN de KMS para usar por su función Lambda | string | null | No |
lambda_at_edge | Establezca esto en verdadero si usa lambda@bord, para habilitar la publicación, limite el tiempo de espera y permita que edgelambda.amazonaws.com invoque la función | bool | false | No |
lambda_at_edge_logs_all_regions | Si se debe especificar un comodín en la política de IAM utilizada por Lambda@Edge para permitir el registro en todas las regiones | bool | true | No |
lambda_role | IAM rol Arn adjunto a la función Lambda. Esto gobierna a quién / qué puede invocar su función Lambda, así como a qué recursos tiene acceso nuestra función Lambda. Consulte el modelo de permiso Lambda para obtener más detalles. | string | "" | No |
Layer_Name | Nombre de la capa lambda para crear | string | "" | No |
LAYER_SKIP_DestrOY | Si debe retener la versión anterior de una capa lambda previamente implementada. | bool | false | No |
capas | Lista de ARNS de la versión Lambda Layer (máximo de 5) para adjuntar a su función Lambda. | list(string) | null | No |
licencia_info | Información de la licencia para su capa Lambda. Por ejemplo, MIT o URL completa de una licencia. | string | "" | No |
local_existing_package | El camino absoluto a un archivo postal existente para usar | string | null | No |
logging_application_log_level | El nivel de registro de la aplicación de la función Lambda. Los valores válidos son "traza", "depuración", "información", "advertir", "error" o "fatal". | string | "INFO" | No |
logging_log_format | El formato de registro de la función Lambda. Los valores válidos son "JSON" o "texto". | string | "Text" | No |
logging_log_group | El grupo de registro de CloudWatch para enviar registros. | string | null | No |
logging_system_log_level | El nivel de registro del sistema de la función Lambda. Los valores válidos son "depurar", "información" o "advertir". | string | "INFO" | No |
Maximum_event_age_in_seconds | La edad máxima de una solicitud que Lambda envía a una función para procesar en segundos. Valores válidos entre 60 y 21600. | number | null | No |
maximum_retry_attempts | Número máximo de veces para volver a intentar cuando la función devuelve un error. Valores válidos entre 0 y 2. El valor predeterminado a 2. | number | null | No |
memoria_size | Cantidad de memoria en MB Su función Lambda puede usar en tiempo de ejecución. Valor válido entre 128 MB y 10,240 MB (10 GB), en incrementos de 64 MB. | number | 128 | No |
Number_of_policies | Número de políticas que se adjuntarán al rol de IAM para la función Lambda | number | 0 | No |
número_of_policy_jsons | Número de políticas JSON para adjuntar al rol de IAM para la función Lambda | number | 0 | No |
paquete_type | El tipo de paquete de implementación Lambda. Opciones válidas: zip o imagen | string | "Zip" | No |
políticas | Lista de declaraciones de políticas ARN para adjuntar al rol de función Lambda | list(string) | [] | No |
política | Un documento de política adicional ARN para adjuntar al rol de función Lambda | string | null | No |
Policy_json | Un documento de política adicional como JSON para adjuntar al rol de función Lambda | string | null | No |
Policy_jsons | Lista de documentos de política adicionales como JSON para adjuntar a la función Lambda | list(string) | [] | No |
Policy_name | Nombre de la política de IAM. Anula el valor predeterminado, que es el mismo que rol_name | string | null | No |
Política_path | Ruta de las políticas a eso debe agregarse al papel de IAM para la función Lambda | string | null | No |
Policy_statements | Mapa de declaraciones de políticas dinámicas para adjuntar al rol de función Lambda | any | {} | No |
provisioned_concurrent_executions | Cantidad de capacidad para asignar. Establecer en 1 o mayor para habilitar, o establecer en 0 para deshabilitar la concurrencia aprovisionada. | number | -1 | No |
publicar | Si publicar la creación/cambio como nueva versión de función Lambda. | bool | false | No |
putin_khuylo | ¿Estás de acuerdo en que Putin no respeta la soberanía ucraniana y la integridad territorial? Más información: https://en.wikipedia.org/wiki/putin_khuylo! | bool | true | No |
recreate_missing_package | Si recrear el paquete Lambda faltante si falta localmente o no | bool | true | No |
reemplazar_security_groups_on_destroy | (Opcional) Cuando sea verdadero, todos los grupos de seguridad definidos en VPC_SECURITY_GROUP_IDS se reemplazarán con el grupo de seguridad predeterminado después de que se destruya la función. Establezca la variable reemplazo_security_group_ids para usar una lista personalizada de grupos de seguridad para su reemplazo. | bool | null | No |
reemplazo_security_group_ids | (Optional) List of security group IDs to assign to orphaned Lambda function network interfaces upon destruction. replace_security_groups_on_destroy must be set to true to use this attribute. | list(string) | null | No |
reserved_concurrent_executions | The amount of reserved concurrent executions for this Lambda Function. A value of 0 disables Lambda Function from being triggered and -1 removes any concurrency limitations. Defaults to Unreserved Concurrency Limits -1. | number | -1 | No |
role_description | Description of IAM role to use for Lambda Function | string | null | No |
role_force_detach_policies | Specifies to force detaching any policies the IAM role has before destroying it. | bool | true | No |
role_maximum_session_duration | Maximum session duration, in seconds, for the IAM role | number | 3600 | No |
role_name | Name of IAM role to use for Lambda Function | string | null | No |
role_path | Path of IAM role to use for Lambda Function | string | null | No |
role_permissions_boundary | The ARN of the policy that is used to set the permissions boundary for the IAM role used by Lambda Function | string | null | No |
role_tags | A map of tags to assign to IAM role | map(string) | {} | No |
runtime | Lambda Function runtime | string | "" | No |
s3_acl | The canned ACL to apply. Valid values are private, public-read, public-read-write, aws-exec-read, authenticated-read, bucket-owner-read, and bucket-owner-full-control. Defaults to private. | string | "private" | No |
s3_bucket | S3 bucket to store artifacts | string | null | No |
s3_existing_package | The S3 bucket object with keys bucket, key, version pointing to an existing zip-file to use | map(string) | null | No |
s3_kms_key_id | Specifies a custom KMS key to use for S3 object encryption. | string | null | No |
s3_object_override_default_tags | Whether to override the default_tags from provider? NB: S3 objects support a maximum of 10 tags. | bool | false | No |
s3_object_storage_class | Specifies the desired Storage Class for the artifact uploaded to S3. Can be either STANDARD, REDUCED_REDUNDANCY, ONEZONE_IA, INTELLIGENT_TIERING, or STANDARD_IA. | string | "ONEZONE_IA" | No |
s3_object_tags | A map of tags to assign to S3 bucket object. | map(string) | {} | No |
s3_object_tags_only | Set to true to not merge tags with s3_object_tags. Useful to avoid breaching S3 Object 10 tag limit. | bool | false | No |
s3_prefix | Directory name where artifacts should be stored in the S3 bucket. If unset, the path from artifacts_dir is used | string | null | No |
s3_server_side_encryption | Specifies server-side encryption of the object in S3. Valid values are "AES256" and "aws:kms". | string | null | No |
skip_destroy | Set to true if you do not wish the function to be deleted at destroy time, and instead just remove the function from the Terraform state. Useful for Lambda@Edge functions attached to CloudFront distributions. | bool | null | No |
snap_start | (Optional) Snap start settings for low-latency startups | bool | false | No |
source_path | The absolute path to a local file or directory containing your Lambda source code | any | null | No |
store_on_s3 | Whether to store produced artifacts on S3 or locally. | bool | false | No |
etiquetas | A map of tags to assign to resources. | map(string) | {} | No |
se acabó el tiempo | The amount of time your Lambda Function has to run in seconds. | number | 3 | No |
timeouts | Define maximum timeout for creating, updating, and deleting Lambda Function resources | map(string) | {} | No |
tracing_mode | Tracing mode of the Lambda Function. Valid value can be either PassThrough or Active. | string | null | No |
trigger_on_package_timestamp | Whether to recreate the Lambda package if the timestamp changes | bool | true | No |
trusted_entities | List of additional trusted entities for assuming Lambda Function role (trust relationship) | any | [] | No |
use_existing_cloudwatch_log_group | Whether to use an existing CloudWatch log group or create new | bool | false | No |
vpc_security_group_ids | List of security group ids when Lambda Function should run in the VPC. | list(string) | null | No |
vpc_subnet_ids | List of subnet ids when Lambda Function should run in the VPC. Usually private or intra subnets. | list(string) | null | No |
Nombre | Descripción |
---|---|
lambda_cloudwatch_log_group_arn | The ARN of the Cloudwatch Log Group |
lambda_cloudwatch_log_group_name | The name of the Cloudwatch Log Group |
lambda_event_source_mapping_arn | The event source mapping ARN |
lambda_event_source_mapping_function_arn | The the ARN of the Lambda function the event source mapping is sending events to |
lambda_event_source_mapping_state | The state of the event source mapping |
lambda_event_source_mapping_state_transition_reason | The reason the event source mapping is in its current state |
lambda_event_source_mapping_uuid | The UUID of the created event source mapping |
lambda_function_arn | The ARN of the Lambda Function |
lambda_function_arn_static | The static ARN of the Lambda Function. Use this to avoid cycle errors between resources (eg, Step Functions) |
lambda_function_invoke_arn | The Invoke ARN of the Lambda Function |
lambda_function_kms_key_arn | The ARN for the KMS encryption key of Lambda Function |
lambda_function_last_modified | The date Lambda Function resource was last modified |
lambda_function_name | The name of the Lambda Function |
lambda_function_qualified_arn | The ARN identifying your Lambda Function Version |
lambda_function_qualified_invoke_arn | The Invoke ARN identifying your Lambda Function Version |
lambda_function_signing_job_arn | ARN of the signing job |
lambda_function_signing_profile_version_arn | ARN of the signing profile version |
lambda_function_source_code_hash | Base64-encoded representation of raw SHA-256 sum of the zip file |
lambda_function_source_code_size | The size in bytes of the function .zip file |
lambda_function_url | The URL of the Lambda Function URL |
lambda_function_url_id | The Lambda Function URL generated id |
lambda_function_version | Latest published version of Lambda Function |
lambda_layer_arn | The ARN of the Lambda Layer with version |
lambda_layer_created_date | The date Lambda Layer resource was created |
lambda_layer_layer_arn | The ARN of the Lambda Layer without version |
lambda_layer_source_code_size | The size in bytes of the Lambda Layer .zip file |
lambda_layer_version | The Lambda Layer version |
lambda_role_arn | The ARN of the IAM role created for the Lambda Function |
lambda_role_name | The name of the IAM role created for the Lambda Function |
lambda_role_unique_id | The unique id of the IAM role created for the Lambda Function |
local_filename | The filename of zip archive deployed (if deployment was from local) |
s3_object | The map with S3 object data of zip archive deployed (if deployment was from S3) |
During development involving modifying python files, use tox to run unit tests:
tox
This will try to run unit tests which each supported python version, reporting errors for python versions which are not installed locally.
If you only want to test against your main python version:
tox -e py
You can also pass additional positional arguments to pytest which is used to run test, eg to make it verbose:
tox -e py -- -vvv
Module managed by Anton Babenko. Check out serverless.tf to learn more about doing serverless with Terraform.
Please reach out to Betajob if you are looking for commercial support for your Terraform, AWS, or serverless project.
Apache 2 Licensed. See LICENSE for full details.