Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Creación de funciones de Rust Lambda con Cargo Lambda en AWS SAM
Esta función se encuentra en versión preliminar AWS SAM y está sujeta a cambios. |
Utilice la interfaz de línea de AWS Serverless Application Model comandos (AWS SAM CLI) con sus AWS Lambda funciones de Rust.
Requisitos previos
- Rust language
-
Para instalar Rust, consulte Instalar Rust
en la Rust sitio web de idiomas. - Cargo Lambda
-
El AWS SAM CLI requiere la instalación de Cargo Lambda
, un subcomando para Cargo. Para obtener instrucciones de instalación, consulte Instalación en el Cargo Lambda documentación. - Docker
-
Construcción y pruebas Rust Las funciones Lambda requieren Docker. Para obtener instrucciones de instalación, consulteInstalar Docker.
- Inscríbase en AWS SAM CLI función beta
-
Como esta característica está en versión preliminar, debes acceder usando uno de los siguientes métodos:
-
Usa las variables de entorno:
SAM_CLI_BETA_RUST_CARGO_LAMBDA=1
. -
Añade lo siguiente a tu archivo
samconfig.toml
:[default.build.parameters] beta_features = true [default.sync.parameters] beta_features = true
-
Utilice la
--beta-features
opción cuando utilice una compatible AWS SAM CLI comando. Por ejemplo:$
sam build --beta-features
-
Elija la opción
y
cuando el AWS SAM CLI le pide que se inscriba. A continuación, se muestra un ejemplo:$
sam build
Starting Build use cache Build method "rust-cargolambda" is a beta feature. Please confirm if you would like to proceed You can also enable this beta feature with "sam build --beta-features". [y/N]:y
-
Configuración AWS SAM para su uso con las funciones de Rust Lambda
Paso 1: Configura tu AWS SAM plantilla
Configure su AWS SAM plantilla con lo siguiente:
-
Binario: opcional. Especifica cuándo tu plantilla contiene varias funciones Rust de Lambda.
-
BuildMethod –
rust-cargolambda
. -
CodeUri— ruta a su
Cargo.toml
archivo. -
Controlador:
bootstrap
. -
Tiempo de ejecución:
provided.al2
.
Para obtener más información sobre los tiempos de ejecución personalizados, consulta los tiempos de AWS Lambda ejecución personalizados en la Guía AWS Lambda para desarrolladores.
A continuación, se muestra un ejemplo de una plantilla configurada AWS SAM :
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: rust-cargolambda BuildProperties: function_a Properties: CodeUri: ./rust_app Handler: bootstrap Runtime: provided.al2 ...
Paso 2: utilice la AWS SAM CLI con tu función Rust Lambda
Utilice cualquier AWS SAM CLI comanda con tu AWS SAM plantilla. Para obtener más información, consulte El valor AWS SAMCLI.
Ejemplos
Ejemplo de Hello World
En este ejemplo, creamos la aplicación Hello World de muestra usando Rust como nuestro motor de ejecución.
En primer lugar, inicializamos una nueva aplicación sin servidor utilizando sam init
. Durante el flujo interactivo, seleccionamos la aplicación Hello World y elegimos el tiempo de ejecución de Rust.
$
sam init
... Which template source would you like to use? 1 - AWS Quick Start Templates 2 - Custom Template Location Choice:1
Choose an AWS Quick Start application template 1 - Hello World Example 2 - Multi-step workflow 3 - Serverless API ... Template:1
Use the most popular runtime and package type? (Python and zip) [y/N]:ENTER
Which runtime would you like to use? 1 - aot.dotnet7 (provided.al2) 2 - dotnet6 3 - dotnet5.0 ... 18 - python3.7 19 - python3.10 20 - ruby2.7 21 - rust (provided.al2) Runtime:21
Based on your selections, the only Package type available is Zip. We will proceed to selecting the Package type as Zip. Based on your selections, the only dependency manager available is cargo. We will proceed copying the template using cargo. Would you like to enable X-Ray tracing on the function(s) in your application? [y/N]:ENTER
Would you like to enable monitoring using CloudWatch Application Insights? For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]:ENTER
Project name [sam-app]:hello-rust
----------------------- Generating application: ----------------------- Name: hello-rust Runtime: rust (provided.al2) Architectures: x86_64 Dependency Manager: cargo Application Template: hello-world Output Directory: . Configuration file: hello-rust/samconfig.toml Next steps can be found in the README file at hello-rust/README.md Commands you can use next ========================= [*] Create pipeline: cd hello-rust && sam pipeline init --bootstrap [*] Validate SAM template: cd hello-rust && sam validate [*] Test Function in the Cloud: cd hello-rust && sam sync --stack-name {stack-name} --watch
La siguiente es la estructura de nuestra aplicación Hello World:
hello-rust ├── README.md ├── events │ └── event.json ├── rust_app │ ├── Cargo.toml │ └── src │ └── main.rs ├── samconfig.toml └── template.yaml
En nuestra AWS SAM plantilla, nuestro Rust la función se define de la siguiente manera:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: HelloWorldFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: rust-cargolambda Properties: CodeUri: ./rust_app Handler: bootstrap Runtime: provided.al2 Architectures: - x86_64 Events: HelloWorld: Type: Api Path: /hello Method: get
A continuación, ejecuta sam build
para crear e implementar la aplicación. La AWS SAM CLI crea un .aws-sam
directorio y organiza allí nuestros artefactos de construcción. Nuestra función está construida usando Cargo Lambda y se almacena como un archivo binario ejecutable en.aws-sam/build/HelloWorldFunction/bootstrap
.
nota
Si planeas ejecutar el sam local invoke comando en macOS, necesitas crear funciones diferentes antes de invocarlo. Para ello, utiliza el siguiente comando.
SAM_BUILD_MODE=debug sam build
Este comando solo es necesario si se van a realizar pruebas locales. Esto no se recomienda al compilar para el despliegue.
hello-rust$
sam build
Starting Build use cache Build method "rust-cargolambda" is a beta feature. Please confirm if you would like to proceed You can also enable this beta feature with "sam build --beta-features". [y/N]:y
Experimental features are enabled for this session. Visit the docs page to learn more about the AWS Beta terms https://aws.amazon.com/service-terms/. Cache is invalid, running build and copying resources for following functions (HelloWorldFunction) Building codeuri: /Users/.../hello-rust/rust_app runtime: provided.al2 metadata: {'BuildMethod': 'rust-cargolambda'} architecture: x86_64 functions: HelloWorldFunction Running RustCargoLambdaBuilder:CargoLambdaBuild Running RustCargoLambdaBuilder:RustCopyAndRename Build Succeeded Built Artifacts : .aws-sam/build Built Template : .aws-sam/build/template.yaml Commands you can use next ========================= [*] Validate SAM template: sam validate [*] Invoke Function: sam local invoke [*] Test Function in the Cloud: sam sync --stack-name {{stack-name}} --watch [*] Deploy: sam deploy --guided
A continuación, implementamos nuestra aplicación usando sam deploy --guided
.
hello-rust$
sam deploy --guided
Configuring SAM deploy ====================== Looking for config file [samconfig.toml] : Found Reading default arguments : Success Setting default arguments for 'sam deploy' ========================================= Stack Name [hello-rust]:ENTER
AWS Region [us-west-2]:ENTER
#Shows you resources changes to be deployed and require a 'Y' to initiate deploy Confirm changes before deploy [Y/n]:ENTER
#SAM needs permission to be able to create roles to connect to the resources in your template Allow SAM CLI IAM role creation [Y/n]:ENTER
#Preserves the state of previously provisioned resources when an operation fails Disable rollback [y/N]:ENTER
HelloWorldFunction may not have authorization defined, Is this okay? [y/N]:y
Save arguments to configuration file [Y/n]:ENTER
SAM configuration file [samconfig.toml]:ENTER
SAM configuration environment [default]:ENTER
Looking for resources needed for deployment: ... Uploading to hello-rust/56ba6585d80577dd82a7eaaee5945c0b 817973 / 817973 (100.00%) Deploying with following values =============================== Stack name : hello-rust Region : us-west-2 Confirm changeset : True Disable rollback : False Deployment s3 bucket : aws-sam-cli-managed-default-samcliamzn-s3-demo-source-bucket-1a4x26zbcdkqr Capabilities : ["CAPABILITY_IAM"] Parameter overrides : {} Signing Profiles : {} Initiating deployment ===================== Uploading to hello-rust/a4fc54cb6ab75dd0129e4cdb564b5e89.template 1239 / 1239 (100.00%) Waiting for changeset to be created.. CloudFormation stack changeset --------------------------------------------------------------------------------------------------------- Operation LogicalResourceId ResourceType Replacement --------------------------------------------------------------------------------------------------------- + Add HelloWorldFunctionHelloW AWS::Lambda::Permission N/A orldPermissionProd ... --------------------------------------------------------------------------------------------------------- Changeset created successfully. arn:aws:cloudformation:us-west-2:012345678910:changeSet/samcli-deploy1681427201/f0ef1563-5ab6-4b07-9361-864ca3de6ad6 Previewing CloudFormation changeset before deployment ====================================================== Deploy this changeset? [y/N]:y
2023-04-13 13:07:17 - Waiting for stack create/update to complete CloudFormation events from stack operations (refresh every 5.0 seconds) --------------------------------------------------------------------------------------------------------- ResourceStatus ResourceType LogicalResourceId ResourceStatusReason --------------------------------------------------------------------------------------------------------- CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole - CREATE_IN_PROGRESS AWS::IAM::Role HelloWorldFunctionRole Resource creation ... --------------------------------------------------------------------------------------------------------- CloudFormation outputs from deployed stack --------------------------------------------------------------------------------------------------------- Outputs --------------------------------------------------------------------------------------------------------- Key HelloWorldFunctionIamRole Description Implicit IAM Role created for Hello World function Value arn:aws:iam::012345678910:role/hello-rust-HelloWorldFunctionRole-10II2P13AUDUY Key HelloWorldApi Description API Gateway endpoint URL for Prod stage for Hello World function Value https://ggdxec9le9.execute-api.us-west-2.amazonaws.com/Prod/hello/ Key HelloWorldFunction Description Hello World Lambda Function ARN Value arn:aws:lambda:us-west-2:012345678910:function:hello-rust-HelloWorldFunction- yk4HzGzYeZBj --------------------------------------------------------------------------------------------------------- Successfully created/updated stack - hello-rust in us-west-2
Para probar, podemos invocar nuestra función Lambda utilizando API el punto final.
$
curl https://ggdxec9le9.execute-api.us-west-2.amazonaws.com/Prod/hello/
Hello World!%
Para probar nuestra función localmente, primero nos aseguramos de que la propiedad Architectures
de nuestra función coincida con nuestro equipo local.
... Resources: HelloWorldFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Metadata: BuildMethod: rust-cargolambda # More info about Cargo Lambda: https://github.com/cargo-lambda/cargo-lambda Properties: CodeUri: ./rust_app # Points to dir of Cargo.toml Handler: bootstrap # Do not change, as this is the default executable name produced by Cargo Lambda Runtime: provided.al2 Architectures: - arm64 ...
Como ya modificamos nuestra arquitectura de x86_64
a arm64
en este ejemplo, ejecutamos sam build
para actualizar nuestros artefactos de construcción. A continuación, ejecutamos sam local invoke
para invocar nuestra función de forma local.
hello-rust$
sam local invoke
Invoking bootstrap (provided.al2) Local image was not found. Removing rapid images for repo public.ecr.aws/sam/emulation-provided.al2 Building image..................................................................................................................................... Using local image: public.ecr.aws/lambda/provided:al2-rapid-arm64. Mounting /Users/.../hello-rust/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: fbc55e6e-0068-45f9-9f01-8e2276597fc6 Version: $LATEST {"statusCode":200,"body":"Hello World!"}END RequestId: fbc55e6e-0068-45f9-9f01-8e2276597fc6 REPORT RequestId: fbc55e6e-0068-45f9-9f01-8e2276597fc6 Init Duration: 0.68 ms Duration: 130.63 ms Billed Duration: 131 ms Memory Size: 128 MB Max Memory Used: 128 MB
Proyecto de función de Lambda única
Este es un ejemplo de una aplicación sin servidor que contiene una función Rust de Lambda.
Estructura del directorio del proyecto:
. ├── Cargo.lock ├── Cargo.toml ├── src │ └── main.rs └── template.yaml
AWS SAM plantilla:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: MyFunction: Type: AWS::Serverless::Function Metadata: BuildMethod: rust-cargolambda Properties: CodeUri: ./ Handler: bootstrap Runtime: provided.al2 ...
Proyecto de función de Lambda múltiple
Este es un ejemplo de una aplicación sin servidor que contiene varias funciones Rust de Lambda.
Estructura del directorio del proyecto:
. ├── Cargo.lock ├── Cargo.toml ├── src │ ├── function_a.rs │ └── function_b.rs └── template.yaml
AWS SAM plantilla:
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 ... Resources: FunctionA: Type: AWS::Serverless::Function Metadata: BuildMethod: rust-cargolambda BuildProperties: Binary: function_a Properties: CodeUri: ./ Handler: bootstrap Runtime: provided.al2 FunctionB: Type: AWS::Serverless::Function Metadata: BuildMethod: rust-cargolambda BuildProperties: Binary: function_b Properties: CodeUri: ./ Handler: bootstrap Runtime: provided.al2
Archivo Cargo.toml
:
[package] name = "test-handler" version = "0.1.0" edition = "2021" [dependencies] lambda_runtime = "0.6.0" serde = "1.0.136" tokio = { version = "1", features = ["macros"] } tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } [[bin]] name = "function_a" path = "src/function_a.rs" [[bin]] name = "function_b" path = "src/function_b.rs"