Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Distribuzione delle funzioni Go Lambda con immagini di container
Esistono due modi per creare un'immagine di container per una funzione Lambda in Go:
-
Uso di un'immagine di base solo per il sistema operativo AWS
Go è implementato in modo diverso rispetto ad altri runtime gestiti. Poiché Go viene compilato nativamente in un file binario eseguibile, non richiede un runtime linguistico dedicato. Usa un'immagine di base solo per il sistema operativo per creare immagini Go per Lambda. Per rendere l'immagine compatibile con Lambda, devi includere il pacchetto
aws-lambda-go/lambda
nell'immagine. -
Utilizzo di un'immagine di base non AWS
È possibile utilizzare un'immagine di base alternativa da un altro registro del container, come ad esempio Alpine Linux o Debian. Puoi anche utilizzare un'immagine personalizzata creata dalla tua organizzazione. Per rendere l'immagine compatibile con Lambda, devi includere il pacchetto
aws-lambda-go/lambda
nell'immagine.
Suggerimento
Per ridurre il tempo necessario all'attivazione delle funzioni del container Lambda, consulta Utilizzo di compilazioni a più fasi
Questa pagina spiega come creare, testare e implementare le immagini di container per Lambda.
Immagini di base AWS per l'implementazione delle funzioni Go
Go è implementato in modo diverso rispetto ad altri runtime gestiti. Poiché Go viene compilato nativamente in un file binario eseguibile, non richiede un runtime linguistico dedicato. Usa un'immagine di base solo per il sistema operativo per distribuire le funzioni Go su Lambda.
Nome | Identificatore | Sistema operativo | Data di ritiro | Blocco creazione funzioni | Blocco aggiornamento funzioni |
---|---|---|---|---|---|
Runtime solo per il sistema operativo |
|
Amazon Linux 2023 |
Non programmato |
Non programmato |
Non programmato |
Runtime solo per il sistema operativo |
|
Amazon Linux 2 |
Non programmato |
Non programmato |
Non programmato |
Galleria pubblica di Amazon Elastic Container Registry: gallery.ecr.aws/lambda/provided
Client di interfaccia di runtime per Go
Il pacchetto aws-lambda-go/lambda
include un'implementazione dell'interfaccia di runtime. Per esempi di come utilizzare aws-lambda-go/lambda
nell'immagine, consulta le sezioni Uso di un'immagine di base solo per il sistema operativo AWS o Utilizzo di un'immagine di base non AWS.
Uso di un'immagine di base solo per il sistema operativo AWS
Go è implementato in modo diverso rispetto ad altri runtime gestiti. Poiché Go viene compilato nativamente in un file binario eseguibile, non richiede un runtime linguistico dedicato. Utilizza un'immagine di base solo per il sistema operativo per creare immagini di container per le funzioni Go.
Tag | Runtime | Sistema operativo | Dockerfile | Definizione come obsoleto |
---|---|---|---|---|
al2023 |
Runtime solo per il sistema operativo | Amazon Linux 2023 | Dockerfile per runtime solo per il sistema operativo su GitHub |
Non programmato |
al2 |
Runtime solo per il sistema operativo | Amazon Linux 2 | Dockerfile per runtime solo per il sistema operativo su GitHub |
Non programmato |
Per ulteriori informazioni su queste immagini di base, consulta la documentazione fornita
Devi includere il pacchetto aws-lambda-go/lambda
Per completare le fasi riportate in questa sezione, è necessario:
Creazione e implementazione di una funzione Go con l'immagine di base provided.al2023
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir hello cd hello
-
Inizializza un nuovo modulo Go.
go mod init
example.com/hello-world
-
Aggiungi la libreria lambda come dipendenza del nuovo modulo.
go get github.com/aws/aws-lambda-go/lambda
-
Crea un file denominato
main.go
, quindi aprilo in un editor di testo. Questo è il codice per la funzione Lambda. A fini di test, puoi utilizzare il codice di esempio seguente o sostituirlo con il tuo codice personalizzato.package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
-
Utilizza un editor di testo per creare un file Dockerfile nella directory del progetto.
-
Il seguente Dockerfile di esempio utilizza una build multi-fase
. Ciò consente di utilizzare un'immagine di base diversa in ogni passaggio. Puoi utilizzare un'immagine, ad esempio un'immagine di base Go , per compilare il codice e creare il file binario eseguibile. È quindi possibile utilizzare un'immagine diversa, ad esempio provided.al2023
, nell'istruzioneFROM
finale per definire l'immagine da implementare in Lambda. Il processo di compilazione è separato dall'immagine di implementazione finale, quindi l'immagine finale contiene solo i file necessari per eseguire l'applicazione. -
Puoi usare il tag facoltativo
lambda.norpc
per escludere il componente Remote Procedure Call (RPC) della libreria lambda. Il componente RPC è richiesto solo quando si utilizza il runtime Go 1.x obsoleto. L'esclusione dell'RPC riduce le dimensioni del pacchetto di implementazione. -
Nota che l'esempio Dockerfile non include un'istruzione USER
. Quando implementi un'immagine di container su Lambda, Lambda definisce automaticamente un utente Linux predefinito con autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente root
quando non viene fornita alcuna istruzioneUSER
.
Esempio - Dockerfile di compilazione multi-fase
Nota
Assicurati che la versione di Go specificata nel tuo Dockerfile (ad esempio
golang:1.20
) sia la stessa versione di Go che hai usato per creare l'applicazione.FROM
golang:1.20
as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build with optional lambda.norpc tag COPY main.go . RUN go build-tags lambda.norpc
-o main main.go # Copy artifacts to a clean image FROMpublic.ecr.aws/lambda/provided:al2023
COPY --from=build /helloworld/main ./main ENTRYPOINT [ "./main" ] -
-
Crea l'immagine Docker con il comando docker build
. L'esempio seguente assegna un nome all'immagine docker-image
e le assegna il tagtest
.docker build --platform linux/amd64 -t
docker-image
:test
.Nota
Il comando specifica l'opzione
--platform linux/amd64
per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Per creare una funzione Lambda utilizzando l'architettura del set di istruzioni ARM64, accertati di modificare il comando per utilizzare l'opzione--platform linux/arm64
.
Usa il simulatore dell'interfaccia di runtimeprovided.al2023
.
Esecuzione del simulatore dell'interfaccia di runtime sul computer locale
-
Avvia l'immagine Docker con il comando docker run. Tieni presente quanto segue:
-
docker-image
è il nome dell'immagine etest
è il tag. -
./main
è l'ENTRYPOINT
del Dockerfile.
docker run -d -p 9000:8080 \ --entrypoint /usr/local/bin/aws-lambda-rie \
docker-image:test ./main
Questo comando esegue l'immagine come container e crea un endpoint locale in
localhost:9000/2015-03-31/functions/function/invocations
. -
-
Da una nuova finestra di terminale, invia un evento al seguente endpoint utilizzando un comando curl:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
Questo comando richiama la funzione con un evento vuoto e restituisce una risposta. Alcune funzioni potrebbero richiedere un payload JSON. Esempio:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '
{"payload":"hello world!"}
' -
Ottieni l'ID del container.
docker ps
-
Utilizza il comando docker kill
per arrestare il container. In questo comando, sostituisci 3766c4ab331c
con l'ID del container del passaggio precedente.docker kill
3766c4ab331c
Caricamento dell'immagine su Amazon ECR e creazione della funzione Lambda
-
Per autenticare la CLI Docker nel registro Amazon ECR, esegui il comando get-login-password
. -
Imposta il valore di
--region
sulla Regione AWS in cui desideri creare il repository Amazon ECR. -
Sostituisci
111122223333
con l'ID dell'Account AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Crea un repository in Amazon ECR utilizzando il commando create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENota
Il repository Amazon ECR deve essere nella stessa Regione AWS della funzione Lambda.
In caso di esito positivo, dovresti ottenere una risposta simile a questa:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copia il
repositoryUri
dall'output del passaggio precedente. -
Esegui il comando docker tag
per etichettare l'immagine locale nel repository Amazon ECR come versione più recente. In questo comando: -
docker-image:test
è il nome e tagdell'immagine Docker. Si tratta del nome e del tag dell'immagine specificati nel comando docker build
. -
Sostituisci l'
<ECRrepositoryUri>
con l'repositoryUri
copiato. Assicurati di includere:latest
alla fine dell'URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestEsempio:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Esegui il comando docker push
per implementare la tua immagine locale sul repository Amazon ECR. Assicurati di includere :latest
alla fine dell'URI del repository.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Il nome della risorsa Amazon (ARN) del ruolo ti occorrerà nel passaggio successivo.
-
Creazione della funzione Lambda Per
ImageUri
, specifica l'URI del repository creato in precedenza. Assicurati di includere:latest
alla fine dell'URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Nota
È possibile creare una funzione utilizzando un'immagine in un account AWS diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.
-
Richiama la funzione.
aws lambda invoke --function-name
hello-world
response.jsonDovresti ottenere una risposta simile a questa:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Per vedere l'output della funzione, controlla il file
response.json
.
Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel repository Amazon ECR e quindi utilizzare il comando update-function-code
Lambda risolve il tag dell'immagine in un digest di immagine specifico. Ciò significa che se punti il tag immagine utilizzato per implementare la funzione su una nuova immagine in Amazon ECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.
Per implementare la nuova immagine nella stessa funzione Lambda, devi utilizzare il comando update-function-code--publish
crea una nuova versione della funzione utilizzando l'immagine del container aggiornata.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
Utilizzo di un'immagine di base non AWS
È possibile creare un'immagine di container per Go da un'immagine di base non AWS. Nei passaggi di esempio che seguono, Dockerfile utilizza un'immagine di base Alpine
Devi includere il pacchetto aws-lambda-go/lambda
Per completare le fasi riportate in questa sezione, è necessario:
Creazione e implementazione di una funzione Go con un'immagine di base Alpine
-
Crea una directory per il progetto, quindi passa a quella directory.
mkdir hello cd hello
-
Inizializza un nuovo modulo Go.
go mod init
example.com/hello-world
-
Aggiungi la libreria lambda come dipendenza del nuovo modulo.
go get github.com/aws/aws-lambda-go/lambda
-
Crea un file denominato
main.go
, quindi aprilo in un editor di testo. Questo è il codice per la funzione Lambda. A fini di test, puoi utilizzare il codice di esempio seguente o sostituirlo con il tuo codice personalizzato.package main import ( "context" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" ) func handler(ctx context.Context, event events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { response := events.APIGatewayProxyResponse{ StatusCode: 200, Body: "\"Hello from Lambda!\"", } return response, nil } func main() { lambda.Start(handler) }
-
Utilizza un editor di testo per creare un file Dockerfile nella directory del progetto. Nell'esempio che segue, Dockerfile utilizza un'immagine di base Alpine
. Nota che l'esempio Dockerfile non include un'istruzione USER . Quando implementi un'immagine di container su Lambda, Lambda definisce automaticamente un utente Linux predefinito con autorizzazioni con privilegi minimi. Questo è diverso dal comportamento standard di Docker, che per impostazione predefinita è l'utente root
quando non viene fornita alcuna istruzioneUSER
.Esempio Dockerfile
Nota
Assicurati che la versione di Go specificata nel tuo Dockerfile (ad esempio
golang:1.20
) sia la stessa versione di Go che hai usato per creare l'applicazione.FROM golang:1.20.2-alpine3.16 as build WORKDIR /helloworld # Copy dependencies list COPY go.mod go.sum ./ # Build COPY main.go . RUN go build -o main main.go # Copy artifacts to a clean image FROM alpine:3.16 COPY --from=build /helloworld/main /main ENTRYPOINT [ "/main" ]
-
Crea l'immagine Docker con il comando docker build
. L'esempio seguente assegna un nome all'immagine docker-image
e le assegna il tagtest
.docker build --platform linux/amd64 -t
docker-image
:test
.Nota
Il comando specifica l'opzione
--platform linux/amd64
per garantire che il container sia compatibile con l'ambiente di esecuzione di Lambda, indipendentemente dall'architettura della macchina di sviluppo. Per creare una funzione Lambda utilizzando l'architettura del set di istruzioni ARM64, accertati di modificare il comando per utilizzare l'opzione--platform linux/arm64
.
Usa il simulatore dell'interfaccia di runtime
Installazione ed esecuzione dell'emulatore di interfaccia di runtime sul computer locale
-
Dalla directory del progetto, esegui il comando seguente per scaricare l'emulatore di interfaccia di runtime (architettura x86-64) da GitHub e installarlo sul computer locale.
-
Avvia l'immagine Docker con il comando docker run. Tieni presente quanto segue:
-
docker-image
è il nome dell'immagine etest
è il tag. -
/main
è l'ENTRYPOINT
del Dockerfile.
Questo comando esegue l'immagine come container e crea un endpoint locale in
localhost:9000/2015-03-31/functions/function/invocations
.Nota
Per creare l'immagine Docker per l'architettura del set di istruzioni ARM64, assicurati di utilizzare l'opzione
--platform linux/
anzichéarm64
--platform linux/
.amd64
-
-
Pubblica un evento nell'endpoint locale.
-
Ottieni l'ID del container.
docker ps
-
Utilizza il comando docker kill
per arrestare il container. In questo comando, sostituisci 3766c4ab331c
con l'ID del container del passaggio precedente.docker kill
3766c4ab331c
Caricamento dell'immagine su Amazon ECR e creazione della funzione Lambda
-
Per autenticare la CLI Docker nel registro Amazon ECR, esegui il comando get-login-password
. -
Imposta il valore di
--region
sulla Regione AWS in cui desideri creare il repository Amazon ECR. -
Sostituisci
111122223333
con l'ID dell'Account AWS.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
Crea un repository in Amazon ECR utilizzando il commando create-repository
. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLENota
Il repository Amazon ECR deve essere nella stessa Regione AWS della funzione Lambda.
In caso di esito positivo, dovresti ottenere una risposta simile a questa:
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
Copia il
repositoryUri
dall'output del passaggio precedente. -
Esegui il comando docker tag
per etichettare l'immagine locale nel repository Amazon ECR come versione più recente. In questo comando: -
docker-image:test
è il nome e tagdell'immagine Docker. Si tratta del nome e del tag dell'immagine specificati nel comando docker build
. -
Sostituisci l'
<ECRrepositoryUri>
con l'repositoryUri
copiato. Assicurati di includere:latest
alla fine dell'URI.
docker tag docker-image:test
<ECRrepositoryUri>
:latestEsempio:
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
Esegui il comando docker push
per implementare la tua immagine locale sul repository Amazon ECR. Assicurati di includere :latest
alla fine dell'URI del repository.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
Crea un ruolo di esecuzione per la funzione, se non lo hai già fatto. Il nome della risorsa Amazon (ARN) del ruolo ti occorrerà nel passaggio successivo.
-
Creazione della funzione Lambda Per
ImageUri
, specifica l'URI del repository creato in precedenza. Assicurati di includere:latest
alla fine dell'URI.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
Nota
È possibile creare una funzione utilizzando un'immagine in un account AWS diverso, purché l'immagine si trovi nella stessa regione della funzione Lambda. Per ulteriori informazioni, consulta Autorizzazioni Amazon ECR per più account.
-
Richiama la funzione.
aws lambda invoke --function-name
hello-world
response.jsonDovresti ottenere una risposta simile a questa:
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
Per vedere l'output della funzione, controlla il file
response.json
.
Per aggiornare il codice della funzione, devi creare nuovamente l'immagine, caricare la nuova immagine nel repository Amazon ECR e quindi utilizzare il comando update-function-code
Lambda risolve il tag dell'immagine in un digest di immagine specifico. Ciò significa che se punti il tag immagine utilizzato per implementare la funzione su una nuova immagine in Amazon ECR, Lambda non aggiorna automaticamente la funzione per utilizzare la nuova immagine.
Per implementare la nuova immagine nella stessa funzione Lambda, devi utilizzare il comando update-function-code--publish
crea una nuova versione della funzione utilizzando l'immagine del container aggiornata.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish