

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Deploy fungsi Lambda Go dengan gambar kontainer
<a name="go-image"></a>

Ada dua cara untuk membangun image kontainer untuk fungsi Go Lambda:
+ [Menggunakan gambar AWS dasar khusus OS](#go-image-provided)

  Go diimplementasikan secara berbeda dari runtime terkelola lainnya. Karena Go mengkompilasi secara native ke biner yang dapat dieksekusi, itu tidak memerlukan runtime bahasa khusus. Gunakan gambar [dasar khusus OS untuk membuat gambar](images-create.md#runtimes-images-provided) Go untuk Lambda. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan `aws-lambda-go/lambda` paket dalam gambar.
+ [Menggunakan gambar AWS non-dasar](#go-image-other)

  Anda dapat menggunakan gambar dasar alternatif dari registri kontainer lain, seperti Alpine Linux atau Debian. Anda juga dapat menggunakan gambar kustom yang dibuat oleh organisasi Anda. Untuk membuat gambar kompatibel dengan Lambda, Anda harus menyertakan `aws-lambda-go/lambda` paket dalam gambar.

**Tip**  
Untuk mengurangi waktu yang dibutuhkan agar fungsi kontainer Lambda menjadi aktif, lihat [Menggunakan build multi-tahap](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds) dalam dokumentasi Docker. Untuk membuat gambar kontainer yang efisien, ikuti [Praktik terbaik untuk menulis Dockerfiles](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/).

Halaman ini menjelaskan cara membuat, menguji, dan menyebarkan gambar kontainer untuk Lambda.

## AWS gambar dasar untuk menerapkan fungsi Go
<a name="go-image-base"></a>

Go diimplementasikan secara berbeda dari runtime terkelola lainnya. Karena Go mengkompilasi secara native ke biner yang dapat dieksekusi, itu tidak memerlukan runtime bahasa khusus. Gunakan [gambar dasar khusus OS](images-create.md#runtimes-images-provided) untuk menerapkan fungsi Go ke Lambda.


| Nama | Pengidentifikasi | Sistem operasi | Tanggal pengusangan | Buat fungsi blok | Pembaruan fungsi blok | 
| --- | --- | --- | --- | --- | --- | 
|  Runtime Khusus OS  |  `provided.al2023`  |  Amazon Linux 2023  |   30 Jun 2029   |   Jul 31, 2029   |   Agustus 31, 2029   | 
|  Runtime Khusus OS  |  `provided.al2`  |  Amazon Linux 2  |   Juli 31, 2026   |   Agustus 31, 2026   |   Sep 30, 2026   | 

Galeri Publik Registri Kontainer Elastis Amazon: [gallery.ecr. aws/lambda/provided](https://gallery.ecr.aws/lambda/provided)

## Klien antarmuka Go runtime
<a name="go-image-clients"></a>

Paket `aws-lambda-go/lambda` termasuk implementasi dari antarmuka runtime. Untuk contoh cara menggunakan `aws-lambda-go/lambda` dalam gambar Anda, lihat [Menggunakan gambar AWS dasar khusus OS](#go-image-provided) atau[Menggunakan gambar AWS non-dasar](#go-image-other).

## Menggunakan gambar AWS dasar khusus OS
<a name="go-image-provided"></a>

Go diimplementasikan secara berbeda dari runtime terkelola lainnya. Karena Go mengkompilasi secara native ke biner yang dapat dieksekusi, itu tidak memerlukan runtime bahasa khusus. Gunakan image [dasar khusus OS untuk membuat gambar](images-create.md#runtimes-images-provided) kontainer untuk fungsi Go.


| Tag | Waktu berjalan | Sistem operasi | Dockerfile | penghentian | 
| --- | --- | --- | --- | --- | 
| al2023 | Runtime Khusus OS | Amazon Linux 2023 | [Dockerfile untuk Runtime khusus OS aktif GitHub](https://github.com/aws/aws-lambda-base-images/blob/provided.al2023/Dockerfile.provided.al2023) |   30 Jun 2029   | 
| al2 | Runtime Khusus OS | Amazon Linux 2 | [Dockerfile untuk Runtime khusus OS aktif GitHub](https://github.com/aws/aws-lambda-base-images/blob/provided.al2/Dockerfile.provided.al2) |   Juli 31, 2026   | 

Untuk informasi selengkapnya tentang gambar dasar ini, lihat [disediakan](https://gallery.ecr.aws/lambda/provided) di galeri publik Amazon ECR.

Anda harus menyertakan paket [aws-lambda-go/lambda](https://github.com/aws/aws-lambda-go) dengan handler Go Anda. Paket ini mengimplementasikan model pemrograman untuk Go, termasuk antarmuka runtime.

### Prasyarat
<a name="go-custom-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin [buildx Docker](https://github.com/docker/buildx/blob/master/README.md).
+ Go

### Membuat gambar dari gambar dasar.al2023 yang disediakan
<a name="go-custom-create"></a>

**Untuk membangun dan menerapkan fungsi Go dengan image `provided.al2023` dasar**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir hello
   cd hello
   ```

1. Inisialisasi modul Go baru.

   ```
   go mod init example.com/hello-world
   ```

1. Tambahkan pustaka **lambda** sebagai dependensi modul baru Anda.

   ```
   go get github.com/aws/aws-lambda-go/lambda
   ```

1. Buat file bernama `main.go` dan kemudian buka di editor teks. Ini adalah kode untuk fungsi Lambda. Anda dapat menggunakan kode contoh berikut untuk pengujian, atau menggantinya dengan kode Anda sendiri.

   ```
   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)
   }
   ```

1. Gunakan editor teks untuk membuat Dockerfile di direktori proyek Anda.
   + Contoh berikut Dockerfile menggunakan build [multi-tahap](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds). Ini memungkinkan Anda untuk menggunakan gambar dasar yang berbeda di setiap langkah. Anda dapat menggunakan satu gambar, seperti [image dasar Go](https://hub.docker.com/_/golang), untuk mengkompilasi kode Anda dan membangun biner yang dapat dieksekusi. Anda kemudian dapat menggunakan gambar yang berbeda, seperti`provided.al2023`, dalam `FROM` pernyataan akhir untuk menentukan gambar yang Anda terapkan ke Lambda. Proses build dipisahkan dari image penerapan akhir, sehingga gambar akhir hanya berisi file yang diperlukan untuk menjalankan aplikasi.
   + Anda dapat menggunakan `lambda.norpc` tag opsional untuk mengecualikan komponen Remote Procedure Call (RPC) dari pustaka [lambda](https://github.com/aws/aws-lambda-go/tree/master/lambda). Komponen RPC hanya diperlukan jika Anda menggunakan runtime Go 1.x yang tidak digunakan lagi. Mengecualikan RPC mengurangi ukuran paket penyebaran.
   + Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [USER](https://docs.docker.com/reference/dockerfile/#user). Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example — Multi-tahap membangun Dockerfile**  
**catatan**  
Pastikan bahwa versi Go yang Anda tentukan di Dockerfile Anda (misalnya,`golang:1.20`) adalah versi Go yang sama dengan yang Anda gunakan untuk membuat aplikasi Anda.

   ```
   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
   FROM public.ecr.aws/lambda/provided:al2023
   COPY --from=build /helloworld/main ./main
   ENTRYPOINT [ "./main" ]
   ```

1. Buat image Docker dengan perintah [docker](https://docs.docker.com/engine/reference/commandline/build/) build. Contoh berikut menamai gambar `docker-image` dan memberinya `test` [tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan opsi. `--provenance=false`

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="go-custom-test"></a>

Gunakan [emulator antarmuka runtime](https://github.com/aws/aws-lambda-runtime-interface-emulator/) untuk menguji gambar Anda secara lokal. Emulator antarmuka runtime disertakan dalam gambar `provided.al2023` dasar.

**Untuk menjalankan emulator antarmuka runtime di mesin lokal Anda**

1. Mulai gambar Docker dengan perintah **docker run**. Perhatikan hal-hal berikut:
   + `docker-image`adalah nama gambar dan `test` tag.
   + `./main`adalah `ENTRYPOINT` dari Dockerfile Anda.

   ```
   docker run -d -p 9000:8080 \
   --entrypoint /usr/local/bin/aws-lambda-rie \
   docker-image:test ./main
   ```

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.

1. Dari jendela terminal baru, posting peristiwa ke titik akhir berikut menggunakan perintah **curl**:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Beberapa fungsi mungkin memerlukan payload JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan perintah [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill 3766c4ab331c
   ```

### Menyebarkan gambar
<a name="go-custom-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)perintah untuk mengautentikasi CLI Docker ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [Buat repositori di Amazon ECR menggunakan perintah create-repository.](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html)

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus sama Wilayah AWS dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "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"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan perintah [tag docker](https://docs.docker.com/engine/reference/commandline/tag/) untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [tag](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Contoh:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Jalankan perintah [docker push](https://docs.docker.com/engine/reference/commandline/push/) untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Buat peran eksekusi](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran tersebut di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir 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 \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Anda akan melihat tanggapan seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output dari fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah, meskipun tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

## Menggunakan gambar AWS non-dasar
<a name="go-image-other"></a>

Anda dapat membuat gambar kontainer untuk Go dari gambar AWS non-dasar. Contoh Dockerfile dalam langkah-langkah berikut menggunakan gambar dasar [Alpine](https://hub.docker.com/_/golang/).

Anda harus menyertakan paket [aws-lambda-go/lambda](https://github.com/aws/aws-lambda-go) dengan handler Go Anda. Paket ini mengimplementasikan model pemrograman untuk Go, termasuk antarmuka runtime.

### Prasyarat
<a name="go-alt-prerequisites"></a>

Untuk menyelesaikan langkah-langkah di bagian ini, Anda harus memiliki hal-hal berikut:
+ [AWS CLI versi 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker) (versi minimum 25.0.0)
+ Plugin [buildx Docker](https://github.com/docker/buildx/blob/master/README.md).
+ Go

### Membuat gambar dari gambar dasar alternatif
<a name="go-alt-create"></a>

**Untuk membangun dan menerapkan fungsi Go dengan image dasar Alpine**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir hello
   cd hello
   ```

1. Inisialisasi modul Go baru.

   ```
   go mod init example.com/hello-world
   ```

1. Tambahkan pustaka **lambda** sebagai dependensi modul baru Anda.

   ```
   go get github.com/aws/aws-lambda-go/lambda
   ```

1. Buat file bernama `main.go` dan kemudian buka di editor teks. Ini adalah kode untuk fungsi Lambda. Anda dapat menggunakan kode contoh berikut untuk pengujian, atau menggantinya dengan kode Anda sendiri.

   ```
   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)
   }
   ```

1. Gunakan editor teks untuk membuat Dockerfile di direktori proyek Anda. Contoh berikut Dockerfile menggunakan gambar dasar [Alpine](https://hub.docker.com/_/golang/). Perhatikan bahwa contoh Dockerfile tidak menyertakan instruksi [USER](https://docs.docker.com/reference/dockerfile/#user). Saat Anda menyebarkan gambar kontainer ke Lambda, Lambda secara otomatis mendefinisikan pengguna Linux default dengan izin yang paling tidak memiliki hak istimewa. Ini berbeda dari perilaku Docker standar yang default ke `root` pengguna ketika tidak ada `USER` instruksi yang diberikan.  
**Example Dockerfile**  
**catatan**  
Pastikan bahwa versi Go yang Anda tentukan di Dockerfile Anda (misalnya,`golang:1.20`) adalah versi Go yang sama dengan yang Anda gunakan untuk membuat aplikasi Anda.

   ```
   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" ]
   ```

1. Buat image Docker dengan perintah [docker](https://docs.docker.com/engine/reference/commandline/build/) build. Contoh berikut menamai gambar `docker-image` dan memberinya `test` [tag](https://docs.docker.com/engine/reference/commandline/build/#tag). Untuk membuat gambar Anda kompatibel dengan Lambda, Anda harus menggunakan opsi. `--provenance=false`

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**catatan**  
Perintah menentukan `--platform linux/amd64` opsi untuk memastikan bahwa container Anda kompatibel dengan lingkungan eksekusi Lambda terlepas dari arsitektur mesin build Anda. Jika Anda berniat untuk membuat fungsi Lambda menggunakan arsitektur set ARM64 instruksi, pastikan untuk mengubah perintah untuk menggunakan `--platform linux/arm64` opsi sebagai gantinya.

### (Opsional) Uji gambar secara lokal
<a name="go-alt-test"></a>

Gunakan [emulator antarmuka runtime](https://github.com/aws/aws-lambda-runtime-interface-emulator/) untuk menguji gambar secara lokal. Anda dapat [membangun emulator ke dalam gambar Anda](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image) atau menggunakan prosedur berikut untuk menginstalnya di mesin lokal Anda.

**Untuk menginstal dan menjalankan emulator antarmuka runtime di mesin lokal Anda**

1. Dari direktori proyek Anda, jalankan perintah berikut untuk mengunduh emulator antarmuka runtime (arsitektur x86-64) dari GitHub dan menginstalnya di mesin lokal Anda.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   Untuk menginstal emulator arm64, ganti URL GitHub repositori di perintah sebelumnya dengan yang berikut:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   Untuk menginstal emulator arm64, ganti `$downloadLink` dengan yang berikut ini:

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. Mulai gambar Docker dengan perintah **docker run**. Perhatikan hal-hal berikut:
   + `docker-image`adalah nama gambar dan `test` tag.
   + `/main`adalah `ENTRYPOINT` dari Dockerfile Anda.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       docker-image:test \
           /main
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   docker-image:test `
       /main
   ```

------

   Perintah ini menjalankan gambar sebagai wadah dan membuat titik akhir lokal di`localhost:9000/2015-03-31/functions/function/invocations`.
**catatan**  
Jika Anda membuat image Docker untuk arsitektur set ARM64 instruksi, pastikan untuk menggunakan `--platform linux/arm64` opsi alih-alih. `--platform linux/amd64`

1. Posting acara ke titik akhir lokal.

------
#### [ Linux/macOS ]

   Di Linux dan macOS, jalankan perintah berikut: `curl`

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   Dalam PowerShell, jalankan `Invoke-WebRequest` perintah berikut:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   Perintah ini memanggil fungsi dengan peristiwa kosong dan mengembalikan respons. Jika Anda menggunakan kode fungsi Anda sendiri daripada kode fungsi sampel, Anda mungkin ingin memanggil fungsi dengan payload JSON. Contoh:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. Dapatkan ID kontainer.

   ```
   docker ps
   ```

1. Gunakan perintah [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) untuk menghentikan wadah. Dalam perintah ini, ganti `3766c4ab331c` dengan ID kontainer dari langkah sebelumnya.

   ```
   docker kill 3766c4ab331c
   ```

### Menyebarkan gambar
<a name="go-alt-deploy"></a>

**Untuk mengunggah gambar ke Amazon ECR dan membuat fungsi Lambda**

1. Jalankan [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html)perintah untuk mengautentikasi CLI Docker ke registri Amazon ECR Anda.
   + Tetapkan `--region` nilai ke Wilayah AWS tempat Anda ingin membuat repositori Amazon ECR.
   + Ganti `111122223333` dengan Akun AWS ID Anda.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [Buat repositori di Amazon ECR menggunakan perintah create-repository.](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html)

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**catatan**  
Repositori Amazon ECR harus sama Wilayah AWS dengan fungsi Lambda.

   Jika berhasil, Anda melihat respons seperti ini:

   ```
   {
       "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"
           }
       }
   }
   ```

1. Salin `repositoryUri` dari output pada langkah sebelumnya.

1. Jalankan perintah [tag docker](https://docs.docker.com/engine/reference/commandline/tag/) untuk menandai gambar lokal Anda ke repositori Amazon ECR Anda sebagai versi terbaru. Dalam perintah ini:
   + `docker-image:test`adalah nama dan [tag](https://docs.docker.com/engine/reference/commandline/build/#tag) gambar Docker Anda. Ini adalah nama gambar dan tag yang Anda tentukan dalam `docker build` perintah.
   + Ganti `<ECRrepositoryUri>` dengan `repositoryUri` yang Anda salin. Pastikan untuk menyertakan `:latest` di akhir URI.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   Contoh:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. Jalankan perintah [docker push](https://docs.docker.com/engine/reference/commandline/push/) untuk menyebarkan gambar lokal Anda ke repositori Amazon ECR. Pastikan untuk menyertakan `:latest` di akhir URI repositori.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [Buat peran eksekusi](lambda-intro-execution-role.md#permissions-executionrole-api) untuk fungsi tersebut, jika Anda belum memilikinya. Anda memerlukan Nama Sumber Daya Amazon (ARN) dari peran tersebut di langkah berikutnya.

1. Buat fungsi Lambda. Untuk`ImageUri`, tentukan URI repositori dari sebelumnya. Pastikan untuk menyertakan `:latest` di akhir 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 \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**catatan**  
Anda dapat membuat fungsi menggunakan gambar di AWS akun yang berbeda, selama gambar berada di Wilayah yang sama dengan fungsi Lambda. Untuk informasi selengkapnya, lihat [Izin lintas akun Amazon ECR](images-create.md#configuration-images-xaccount-permissions).

1. Memanggil fungsi.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   Anda akan melihat tanggapan seperti ini:

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. Untuk melihat output dari fungsi, periksa `response.json` file.

Untuk memperbarui kode fungsi, Anda harus membangun gambar lagi, mengunggah gambar baru ke repositori Amazon ECR, dan kemudian menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk menyebarkan gambar ke fungsi Lambda.

Lambda menyelesaikan tag gambar ke intisari gambar tertentu. Ini berarti bahwa jika Anda mengarahkan tag gambar yang digunakan untuk menyebarkan fungsi ke gambar baru di Amazon ECR, Lambda tidak secara otomatis memperbarui fungsi untuk menggunakan gambar baru.

Untuk menyebarkan gambar baru ke fungsi Lambda yang sama, Anda harus menggunakan [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah, meskipun tag gambar di Amazon ECR tetap sama. Dalam contoh berikut, `--publish` opsi membuat versi baru dari fungsi menggunakan gambar kontainer yang diperbarui.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```