

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

# Memanggil fungsi Lambda dengan notifikasi Amazon SNS
<a name="with-sns"></a>

Anda dapat menggunakan fungsi Lambda untuk memproses notifikasi Amazon Simple Notification Service (Amazon SNS). Amazon SNS mendukung fungsi Lambda sebagai target untuk pesan yang dikirim ke topik. Anda dapat melanggankan fungsi Anda ke topik di akun yang sama atau di akun AWS lainnya. Untuk panduan terperinci, lihat. [Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service](with-sns-example.md)

Lambda mendukung pemicu SNS untuk topik SNS standar saja. Topik FIFO tidak didukung.

Lambda memproses pesan SNS secara asinkron dengan mengantri pesan dan menangani percobaan ulang. Jika Amazon SNS tidak dapat mencapai Lambda atau pesan ditolak, Amazon SNS melakukan percobaan ulang dengan interval yang diperpanjang selama beberapa jam. Untuk detailnya, lihat [Keandalan](https://aws.amazon.com/sns/faqs/#Reliability) di Amazon SNS FAQs.

**Awas**  
Pemanggilan asinkron Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

## Utilitas idempotensi dari Powertools untuk Lambda AWS
<a name="services-sns-powertools-idempotency"></a>

Utilitas idempotency dari Powertools untuk Lambda membuat fungsi AWS Lambda Anda idempoten. Ini tersedia untuk Python,, Java TypeScript, dan .NET. [https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/)

**Topics**
+ [Utilitas idempotensi dari Powertools untuk Lambda AWS](#services-sns-powertools-idempotency)
+ [Menambahkan pemicu topik Amazon SNS untuk fungsi Lambda menggunakan konsol](#sns-trigger-console)
+ [Menambahkan pemicu topik Amazon SNS secara manual untuk fungsi Lambda](#sns-trigger-manual)
+ [Contoh bentuk acara SNS](#sns-sample-event)
+ [Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service](with-sns-example.md)

## Menambahkan pemicu topik Amazon SNS untuk fungsi Lambda menggunakan konsol
<a name="sns-trigger-console"></a>

Untuk menambahkan topik SNS sebagai pemicu fungsi Lambda, cara termudah adalah dengan menggunakan konsol Lambda. Saat Anda menambahkan pemicu melalui konsol, Lambda secara otomatis mengatur izin dan langganan yang diperlukan untuk mulai menerima acara dari topik SNS.

**Untuk menambahkan topik SNS sebagai pemicu fungsi Lambda (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi yang ingin Anda tambahkan pemicunya.

1. Pilih **Konfigurasi**, lalu pilih **Pemicu.**

1. Pilih **Tambahkan pemicu**.

1. **Di bawah **konfigurasi Trigger**, di menu tarik-turun, pilih SNS.**

1. Untuk **topik SNS**, pilih topik SNS untuk berlangganan.

## Menambahkan pemicu topik Amazon SNS secara manual untuk fungsi Lambda
<a name="sns-trigger-manual"></a>

Untuk mengatur pemicu SNS untuk fungsi Lambda secara manual, Anda harus menyelesaikan langkah-langkah berikut:
+ Tentukan kebijakan berbasis sumber daya untuk fungsi Anda agar SNS dapat memanggilnya.
+ Berlangganan fungsi Lambda Anda ke topik Amazon SNS.
**catatan**  
Jika topik SNS dan fungsi Lambda Anda berada di akun AWS yang berbeda, Anda juga perlu memberikan izin tambahan untuk mengizinkan langganan lintas akun ke topik SNS. Untuk informasi selengkapnya, lihat [Memberikan izin lintas akun untuk langganan Amazon SNS](with-sns-example.md#with-sns-subscription-grant-permission).

Anda dapat menggunakan AWS Command Line Interface (AWS CLI) untuk menyelesaikan kedua langkah ini. Pertama, untuk menentukan kebijakan berbasis sumber daya untuk fungsi Lambda yang memungkinkan pemanggilan SNS, gunakan perintah berikut. AWS CLI Pastikan untuk mengganti nilai `--function-name` dengan nama fungsi Lambda Anda, dan nilai `--source-arn` dengan ARN topik SNS Anda.

```
aws lambda add-permission --function-name example-function \
    --source-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --statement-id function-with-sns --action "lambda:InvokeFunction" \
    --principal sns.amazonaws.com
```

Untuk berlangganan fungsi Anda ke topik SNS, gunakan AWS CLI perintah berikut. Ganti nilai `--topic-arn` dengan ARN topik SNS Anda, dan nilai `--notification-endpoint` ARN dengan fungsi Lambda Anda.

```
aws sns subscribe --protocol lambda \
    --region us-east-1 \
    --topic-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:example-function
```

## Contoh bentuk acara SNS
<a name="sns-sample-event"></a>

Amazon SNS memanggil fungsi Anda [secara asinkron](invocation-async.md) dengan kejadian yang berisi pesan dan metadata.

**Example Kejadian pesan Amazon SNS**  

```
{
  "Records": [
    {
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
      "EventSource": "aws:sns",
      "Sns": {
        "SignatureVersion": "1",
        "Timestamp": "2019-01-02T12:45:07.000Z",
        "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
        "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "Message": "Hello from SNS!",
        "MessageAttributes": {
          "Test": {
            "Type": "String",
            "Value": "TestString"
          },
          "TestBinary": {
            "Type": "Binary",
            "Value": "TestBinary"
          }
        },
        "Type": "Notification",
        "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
        "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda",
        "Subject": "TestInvoke"
      }
    }
  ]
}
```

# Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service
<a name="with-sns-example"></a>

Dalam tutorial ini, Anda menggunakan fungsi Lambda dalam satu Akun AWS untuk berlangganan topik Amazon Simple Notification Service (Amazon SNS) secara terpisah. Akun AWS Saat memublikasikan pesan ke topik Amazon SNS, fungsi Lambda akan membaca konten pesan dan mengeluarkannya ke Amazon Logs. CloudWatch Untuk menyelesaikan tutorial ini, Anda menggunakan AWS Command Line Interface (AWS CLI).

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_resources.png)


Untuk menyelesaikan tutorial ini, Anda melakukan langkah-langkah berikut:
+ Di **akun A**, buat topik Amazon SNS.
+ Di **akun B**, buat fungsi Lambda yang akan membaca pesan dari topik.
+ Di **akun B**, buat langganan ke topik.
+ Publikasikan pesan ke topik Amazon SNS di **akun A** dan konfirmasikan bahwa fungsi Lambda di **akun B** mengeluarkannya ke Log. CloudWatch 

Dengan menyelesaikan langkah-langkah ini, Anda akan belajar cara mengonfigurasi topik Amazon SNS untuk menjalankan fungsi Lambda. Anda juga akan belajar cara membuat kebijakan AWS Identity and Access Management (IAM) yang memberikan izin untuk sumber daya di sumber lain Akun AWS untuk memanggil Lambda.

Dalam tutorial, Anda menggunakan dua terpisah Akun AWS. AWS CLI Perintah mengilustrasikan hal ini dengan menggunakan dua profil bernama yang disebut `accountA` dan`accountB`, masing-masing dikonfigurasi untuk digunakan dengan yang berbeda Akun AWS. Untuk mempelajari cara mengonfigurasi penggunaan profil yang berbeda, lihat [Pengaturan file konfigurasi dan kredensi](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*. AWS CLI Pastikan untuk mengonfigurasi default yang sama Wilayah AWS untuk kedua profil.

Jika AWS CLI profil yang Anda buat untuk keduanya Akun AWS menggunakan nama yang berbeda, atau jika Anda menggunakan profil default dan satu profil bernama, ubah AWS CLI perintah dalam langkah-langkah berikut sesuai kebutuhan.

## Prasyarat
<a name="with-sns-prereqs"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat topik Amazon SNS (akun A)
<a name="with-sns-create-topic"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_1.png)


**Untuk membuat topik**
+ Di **akun A**, buat topik standar Amazon SNS menggunakan perintah berikut AWS CLI .

  ```
  aws sns create-topic --name sns-topic-for-lambda --profile accountA
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda"
  }
  ```

  Catat Nama Sumber Daya Amazon (ARN) topik Anda. Anda akan membutuhkannya nanti dalam tutorial ketika Anda menambahkan izin ke fungsi Lambda Anda untuk berlangganan topik.

## Buat peran eksekusi fungsi (akun B)
<a name="with-sns-example-create-iam-role"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_2.png)


Peran eksekusi adalah peran IAM yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Sebelum membuat fungsi di **akun B**, Anda membuat peran yang memberikan izin dasar fungsi untuk menulis CloudWatch log ke Log. Kami akan menambahkan izin untuk membaca dari topik Amazon SNS Anda di langkah selanjutnya.

**Untuk membuat peran eksekusi**

1. Di **akun B** buka [halaman peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **AWS layanan**.

1. Untuk **kasus penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Tambahkan kebijakan izin dasar ke peran dengan melakukan hal berikut:

   1. Di kotak pencarian **Kebijakan izin**, masukkan**AWSLambdaBasicExecutionRole**.

   1. Pilih **Berikutnya**.

1. Selesaikan pembuatan peran dengan melakukan hal berikut:

   1. Di bawah **Detail peran**, masukkan **lambda-sns-role** **nama Peran**.

   1. Pilih **Buat peran**.

## Buat fungsi Lambda (akun B)
<a name="with-sns-example-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_3.png)


Buat fungsi Lambda yang memproses pesan Amazon SNS Anda. Kode fungsi mencatat isi pesan dari setiap catatan ke Amazon CloudWatch Logs.

Tutorial ini menggunakan runtime Node.js 24, tetapi kami juga menyediakan kode contoh dalam bahasa runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati. JavaScript Kode yang akan Anda gunakan dalam langkah ini adalah pada contoh pertama yang ditunjukkan di **JavaScript**tab.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using Amazon.Lambda.Core;
using Amazon.Lambda.SNSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SnsIntegration;

public class Function
{
    public async Task FunctionHandler(SNSEvent evnt, ILambdaContext context)
    {
        foreach (var record in evnt.Records)
        {
            await ProcessRecordAsync(record, context);
        }
        context.Logger.LogInformation("done");
    }

    private async Task ProcessRecordAsync(SNSEvent.SNSRecord record, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed record {record.Sns.Message}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, snsEvent events.SNSEvent) {
	for _, record := range snsEvent.Records {
		processMessage(record)
	}
	fmt.Println("done")
}

func processMessage(record events.SNSEventRecord) {
	message := record.SNS.Message
	fmt.Printf("Processed message: %s\n", message)
	// TODO: Process your record here
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;


import java.util.Iterator;
import java.util.List;

public class SNSEventHandler implements RequestHandler<SNSEvent, Boolean> {
    LambdaLogger logger;

    @Override
    public Boolean handleRequest(SNSEvent event, Context context) {
        logger = context.getLogger();
        List<SNSRecord> records = event.getRecords();
        if (!records.isEmpty()) {
            Iterator<SNSRecord> recordsIter = records.iterator();
            while (recordsIter.hasNext()) {
                processRecord(recordsIter.next());
            }
        }
        return Boolean.TRUE;
    }

    public void processRecord(SNSRecord record) {
        try {
            String message = record.getSNS().getMessage();
            logger.log("message: " + message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan JavaScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record) {
  try {
    const message = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Mengkonsumsi acara SNS dengan TypeScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SNSEvent, Context, SNSHandler, SNSEventRecord } from "aws-lambda";

export const functionHandler: SNSHandler = async (
  event: SNSEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record: SNSEventRecord): Promise<any> {
  try {
    const message: string = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

/* 
Since native PHP support for AWS Lambda is not available, we are utilizing Bref's PHP functions runtime for AWS Lambda.
For more information on Bref's PHP runtime for Lambda, refer to: https://bref.sh/docs/runtimes/function

Another approach would be to create a custom runtime. 
A practical example can be found here: https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/
*/

// Additional composer packages may be required when using Bref or any other PHP functions runtime.
// require __DIR__ . '/vendor/autoload.php';

use Bref\Context\Context;
use Bref\Event\Sns\SnsEvent;
use Bref\Event\Sns\SnsHandler;

class Handler extends SnsHandler
{
    public function handleSns(SnsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $message = $record->getMessage();

            // TODO: Implement your custom processing logic here
            // Any exception thrown will be logged and the invocation will be marked as failed

            echo "Processed Message: $message" . PHP_EOL;
        }
    }
}

return new Handler();
```

------
#### [ Python ]

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for record in event['Records']:
        process_message(record)
    print("done")

def process_message(record):
    try:
        message = record['Sns']['Message']
        print(f"Processed message {message}")
        # TODO; Process your record here
        
    except Exception as e:
        print("An error occurred")
        raise e
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].map { |record| process_message(record) }
end

def process_message(record)
  message = record['Sns']['Message']
  puts("Processing message: #{message}")
rescue StandardError => e
  puts("Error processing message: #{e}")
  raise
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sns::SnsEvent;
use aws_lambda_events::sns::SnsRecord;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use tracing::info;

// Built with the following dependencies:
//  aws_lambda_events = { version = "0.10.0", default-features = false, features = ["sns"] }
//  lambda_runtime = "0.8.1"
//  tokio = { version = "1", features = ["macros"] }
//  tracing = { version = "0.1", features = ["log"] }
//  tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }

async fn function_handler(event: LambdaEvent<SnsEvent>) -> Result<(), Error> {
    for event in event.payload.records {
        process_record(&event)?;
    }
    
    Ok(())
}

fn process_record(record: &SnsRecord) -> Result<(), Error> {
    info!("Processing SNS Message: {}", record.sns.message);

    // Implement your record handling code here.

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .with_target(false)
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Untuk membuat fungsi**

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

   ```
   mkdir sns-tutorial
   cd sns-tutorial
   ```

1. Salin JavaScript kode sampel ke file baru bernama`index.js`.

1. Buat paket penyebaran menggunakan `zip` perintah berikut.

   ```
   zip function.zip index.js
   ```

1. Jalankan AWS CLI perintah berikut untuk membuat fungsi Lambda Anda di **akun** B.

   ```
   aws lambda create-function --function-name Function-With-SNS \
       --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
       --role arn:aws:iam::<AccountB_ID>:role/lambda-sns-role  \
       --timeout 60 --profile accountB
   ```

   Anda akan melihat output seperti yang berikut ini.

   ```
   {
       "FunctionName": "Function-With-SNS",
       "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS",
       "Runtime": "nodejs24.x",
       "Role": "arn:aws:iam::123456789012:role/lambda_basic_role",
       "Handler": "index.handler",
       ...
       "RuntimeVersionConfig": {
           "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206"
       }
   }
   ```

1. Rekam Nama Sumber Daya Amazon (ARN) dari fungsi Anda. Anda akan membutuhkannya nanti di tutorial saat Anda menambahkan izin untuk mengizinkan Amazon SNS menjalankan fungsi Anda.

## Tambahkan izin ke fungsi (akun B)
<a name="with-sns-create-function-permissions"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_4.png)


[Agar Amazon SNS dapat menjalankan fungsi Anda, Anda harus memberinya izin dalam pernyataan tentang kebijakan berbasis sumber daya.](access-control-resource-based.md) Anda menambahkan pernyataan ini menggunakan AWS CLI `add-permission` perintah.

**Untuk memberikan izin Amazon SNS untuk menjalankan fungsi Anda**
+ Di **akun B**, jalankan AWS CLI perintah berikut menggunakan ARN untuk topik Amazon SNS yang Anda rekam sebelumnya.

  ```
  aws lambda add-permission --function-name Function-With-SNS \
      --source-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --statement-id function-with-sns --action "lambda:InvokeFunction" \
      --principal sns.amazonaws.com --profile accountB
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":
        \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}},
        \"Action\":[\"lambda:InvokeFunction\"],
        \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\",
        \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},
        \"Sid\":\"function-with-sns\"}"
  }
  ```

**catatan**  
Jika akun dengan topik Amazon SNS di-host dalam [opt-in Wilayah AWS](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html), Anda harus menentukan wilayah di prinsipal. Misalnya, jika Anda bekerja dengan topik Amazon SNS di wilayah Asia Pasifik (Hong Kong), Anda harus menentukan `sns.ap-east-1.amazonaws.com` bukan `sns.amazonaws.com` untuk prinsipal. 

## Berikan izin lintas akun untuk langganan Amazon SNS (akun A)
<a name="with-sns-subscription-grant-permission"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_5.png)


Agar fungsi Lambda Anda di **akun B** berlangganan topik Amazon SNS yang Anda buat **di akun** A, Anda harus memberikan izin kepada **akun B untuk** berlangganan topik Anda. Anda memberikan izin ini menggunakan AWS CLI `add-permission` perintah. 

**Untuk memberikan izin kepada akun B untuk berlangganan topik**
+ Di **akun A**, jalankan AWS CLI perintah berikut. Gunakan ARN untuk topik Amazon SNS yang Anda rekam sebelumnya.

  ```
  aws sns add-permission --label lambda-access --aws-account-id <AccountB_ID> \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \  
      --action-name Subscribe ListSubscriptionsByTopic --profile accountA
  ```

## Buat langganan (akun B)
<a name="with-sns-create-subscription"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_6.png)


**Di **akun B**, Anda sekarang berlangganan fungsi Lambda Anda ke topik Amazon SNS yang Anda buat di awal tutorial di akun A.** **Saat pesan dikirim ke topik ini (`sns-topic-for-lambda`), Amazon SNS akan memanggil fungsi Lambda Anda di akun B. `Function-With-SNS`** 

**Untuk membuat langganan**
+ Di **akun B**, jalankan AWS CLI perintah berikut. Gunakan wilayah default tempat Anda membuat topik dan ARNs untuk topik dan fungsi Lambda Anda.

  ```
  aws sns subscribe --protocol lambda \
      --region us-east-1 \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS \
      --profile accountB
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"
  }
  ```

## Publikasikan pesan ke topik (akun A dan akun B)
<a name="with-sns-publish-message"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_7.png)


Sekarang fungsi Lambda Anda di **akun B** berlangganan topik Amazon SNS Anda di **akun A**, saatnya untuk menguji penyiapan Anda dengan menerbitkan pesan ke topik Anda. Untuk mengonfirmasi bahwa Amazon SNS telah memanggil fungsi Lambda Anda, Anda menggunakan CloudWatch Log untuk melihat output fungsi Anda.

**Untuk memublikasikan pesan ke topik Anda dan melihat output fungsi Anda**

1. Masukkan `Hello World` ke dalam file teks dan simpan sebagai`message.txt`.

1. Dari direktori yang sama tempat Anda menyimpan file teks Anda, jalankan AWS CLI perintah berikut di **akun A**. Gunakan ARN untuk topik Anda sendiri.

   ```
   aws sns publish --message file://message.txt --subject Test \
       --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
       --profile accountA
   ```

   Ini akan mengembalikan ID pesan dengan pengidentifikasi unik, yang menunjukkan bahwa Amazon SNS telah menerima pesan tersebut. Amazon SNS kemudian mencoba mengirimkan pesan ke pelanggan topik. Untuk mengonfirmasi bahwa Amazon SNS telah memanggil fungsi Lambda Anda, gunakan CloudWatch Log untuk melihat output fungsi Anda:

1. Di **akun B**, buka halaman [Grup log](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) di CloudWatch konsol Amazon.

1. Pilih grup log untuk fungsi Anda (`/aws/lambda/Function-With-SNS`).

1. Pilih aliran log terbaru.

1. Jika fungsi Anda dipanggil dengan benar, Anda akan melihat output yang mirip dengan berikut yang menunjukkan konten pesan yang Anda terbitkan ke topik Anda.

   ```
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
   ```

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

Di **Akun A**, bersihkan topik Amazon SNS Anda.

**Untuk menghapus topik Amazon SNS**

1. Buka [halaman Topik](https://console.aws.amazon.com//sns/home#topics:) di konsol Amazon SNS.

1. Pilih topik yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **delete me** di bidang input teks.

1. Pilih **Hapus**.

Di **Akun B**, bersihkan peran eksekusi, fungsi Lambda, dan langganan Amazon SNS.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus langganan Amazon SNS**

1. Buka [halaman Langganan](https://console.aws.amazon.com//sns/home#subscriptions:) di konsol Amazon SNS.

1. Pilih langganan yang Anda buat.

1. Pilih **Delete**, **Delete**.