

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

# Merutekan panggilan ke AWS Lambda fungsi untuk audio Amazon Chime SDK PSTN ()AWS CLI
<a name="route-calls-events-cli"></a>

Tutorial ini memandu Anda melalui proses pengaturan routing panggilan ke fungsi Lambda menggunakan layanan audio Amazon Chime SDK PSTN. Anda akan belajar cara membuat fungsi Lambda, menyiapkan aplikasi media SIP, dan mengonfigurasi aturan SIP untuk menangani panggilan masuk.

## Prasyarat
<a name="route-calls-events-cli-prerequisites"></a>

Sebelum Anda memulai tutorial ini, pastikan Anda melakukan hal berikut:
+ Instal AWS CLI. Untuk informasi selengkapnya, lihat [Menginstal atau memperbarui ke versi terbaru](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) dari *Panduan AWS CLI Pengguna*. AWS CLI
+ Konfigurasikan Anda AWS CLI dengan kredensi yang sesuai. Jalankan `aws configure` jika Anda belum menyiapkan kredensi Anda.
+ Memiliki keakraban dasar dengan AWS Lambda dan konsep Amazon Chime SDK.
+ Siapkan izin yang memadai untuk membuat dan mengelola sumber daya Amazon Chime SDK dan Lambda di akun AWS Anda.
+ Untuk perutean berbasis nomor telepon, Anda harus memiliki nomor telepon di inventaris nomor telepon Amazon Chime SDK Anda.
+ Untuk perutean berbasis Konektor Suara, Anda harus memiliki Konektor Suara yang dikonfigurasi di akun Anda.

## Pertimbangan Biaya
<a name="route-calls-events-cli-cost"></a>

Tutorial ini mencakup instruksi pembersihan untuk memastikan Anda tidak dikenakan biaya berkelanjutan setelah selesai. Untuk informasi selengkapnya, lihat [Harga Amazon Chime SDK](https://aws.amazon.com/chime/chime-sdk/pricing/).

Mari kita mulai dengan mengatur perutean panggilan untuk audio Amazon Chime SDK PSTN.

## Cari dan berikan nomor telepon
<a name="route-calls-events-cli-search-provision"></a>

Sebelum membuat aturan SIP dengan pemicu nomor telepon, Anda harus memiliki nomor telepon di inventaris Amazon Chime SDK Anda. Berikut cara mencari nomor telepon yang tersedia dan menyediakannya.

**Example : Cari nomor telepon yang tersedia**  

```
# Search for available toll-free phone numbers
aws chime-sdk-voice search-available-phone-numbers \
  --phone-number-type TollFree \
  --country US \
  --toll-free-prefix 844 \
  --max-results 5 \
  --region us-east-1
```

Perintah ini mencari nomor telepon bebas pulsa yang tersedia dengan awalan 844 di AS. Anda dapat memodifikasi parameter untuk mencari berbagai jenis angka.

**Example : Menyediakan nomor telepon**  
Setelah Anda menemukan nomor telepon yang tersedia, Anda dapat menyediakannya menggunakan perintah berikut:  

```
# Order a phone number
aws chime-sdk-voice create-phone-number-order \
  --product-type SipMediaApplicationDialIn \
  --e164-phone-numbers "+18445550100" \
  --region us-east-1
```

Ganti `+18445550100` dengan nomor telepon aktual yang tersedia dari hasil pencarian Anda. Perintah ini akan memberikan nomor telepon ke akun Anda.

**Example : Periksa status nomor telepon**  
Setelah memesan nomor telepon, Anda dapat memeriksa statusnya:  

```
# Get the phone number order status
aws chime-sdk-voice get-phone-number-order \
  --phone-number-order-id abcd1234-5678-90ab-cdef-EXAMPLE55555 \
  --region us-east-1
```

Ganti ID pesanan dengan yang dikembalikan dari `create-phone-number-order` perintah.

**Example : Daftar nomor telepon di inventaris Anda**  
Untuk melihat semua nomor telepon di inventaris Anda:  

```
# List all phone numbers
aws chime-sdk-voice list-phone-numbers \
  --region us-east-1
```
Untuk menemukan nomor telepon yang tidak ditetapkan yang dapat digunakan untuk aturan SIP:  

```
# List unassigned phone numbers
aws chime-sdk-voice list-phone-numbers \
  --region us-east-1 \
  --query "PhoneNumbers[?Status=='Unassigned'].E164PhoneNumber"
```

## Buat fungsi Lambda untuk penanganan panggilan
<a name="route-calls-events-cli-create-function"></a>

Sekarang, mari kita buat fungsi Lambda yang akan menangani panggilan masuk. Fungsi ini akan menerima acara dari layanan audio PSTN dan merespons dengan instruksi tentang cara menangani panggilan.

**Example : Buat peran IAM untuk Lambda**  
Sebelum membuat fungsi Lambda, Anda perlu membuat peran IAM yang memberikan izin yang diperlukan.  

```
cat > lambda-trust-policy.json << EOF
{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
```

```
aws iam create-role --role-name ChimeSDKLambdaRole \
  --assume-role-policy-document file://lambda-trust-policy.json
```

```
aws iam attach-role-policy --role-name ChimeSDKLambdaRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
```
Perintah ini membuat peran IAM yang memungkinkan Lambda untuk mengasumsikan dan melampirkan kebijakan eksekusi dasar, yang memberikan izin bagi Lambda untuk menulis log. CloudWatch

**Example : Buat fungsi Lambda**  
Sekarang, buat fungsi Lambda sederhana yang akan menangani panggilan masuk.  

```
mkdir -p lambda
cat > lambda/index.js << EOF
exports.handler = async (event) => {
  console.log('Received event:', JSON.stringify(event, null, 2));
  
  // Simple call handling logic
  const response = {
    SchemaVersion: '1.0',
    Actions: [
      {
        Type: 'Speak',
        Parameters: {
          Engine: 'neural',
          Text: 'Hello! This is a test call from Amazon Chime SDK PSTN Audio.',
          VoiceId: 'Joanna'
        }
      },
      {
        Type: 'Hangup',
        Parameters: {
          SipResponseCode: '200'
        }
      }
    ]
  };
  
  return response;
};
EOF
```

```
cd lambda
zip -r function.zip index.js
cd ..
```

```
# Get your AWS account ID
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

aws lambda create-function \
  --function-name ChimeSDKCallHandler \
  --runtime nodejs18.x \
  --role arn:aws:iam::${ACCOUNT_ID}:role/ChimeSDKLambdaRole \
  --handler index.handler \
  --zip-file fileb://lambda/function.zip
```
Fungsi Lambda ini merespons panggilan masuk dengan pesan yang diucapkan dan kemudian menutup telepon.

**Example : Tambahkan izin Lambda untuk Amazon Chime SDK**  
Berikan izin ke layanan Amazon Chime SDK untuk menjalankan fungsi Lambda Anda.  

```
# Get your AWS account ID
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)

aws lambda add-permission \
  --function-name ChimeSDKCallHandler \
  --statement-id ChimeSDK \
  --action lambda:InvokeFunction \
  --principal voiceconnector.chime.amazonaws.com \
  --source-account ${ACCOUNT_ID}
```
Perintah ini memungkinkan layanan Amazon Chime SDK Voice Connector untuk menjalankan fungsi Lambda Anda.

## Buat aplikasi media SIP
<a name="route-calls-events-cli-create-sip-app"></a>

Aplikasi media SIP menghubungkan fungsi Lambda Anda ke layanan audio PSTN. Di bagian ini, Anda akan membuat aplikasi media SIP yang menggunakan fungsi Lambda Anda.

**Example : Buat aplikasi media SIP**  

```
# Get your Lambda function ARN
LAMBDA_ARN=$(aws lambda get-function --function-name ChimeSDKCallHandler --query Configuration.FunctionArn --output text)

aws chime-sdk-voice create-sip-media-application \
  --aws-region us-east-1 \
  --name "MyCallHandlerApp" \
  --endpoints "[{\"LambdaArn\":\"${LAMBDA_ARN}\"}]"
```
Aplikasi media SIP bertindak sebagai jembatan antara layanan audio PSTN dan fungsi Lambda Anda.

**Example : Dapatkan ID aplikasi media SIP**  
Setelah membuat aplikasi media SIP, Anda perlu mengambil ID-nya untuk digunakan nanti dalam tutorial.  

```
SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \
  --query "SipMediaApplications[?Name=='MyCallHandlerApp'].SipMediaApplicationId" \
  --output text)

echo "SIP Media Application ID: ${SIP_MEDIA_APP_ID}"
```
Catat ID aplikasi media SIP yang dikembalikan oleh perintah ini, karena Anda akan membutuhkannya saat membuat aturan SIP.

## Mengatur perutean panggilan dengan aturan SIP
<a name="route-calls-events-cli-call-routing-sip-rules"></a>

Aturan SIP menentukan bagaimana panggilan masuk diarahkan ke aplikasi media SIP Anda. Anda dapat membuat aturan berdasarkan nomor telepon atau nama host Konektor Suara.

**Example : Buat aturan SIP dengan pemicu nomor telepon**  
Untuk merutekan panggilan berdasarkan nomor telepon, gunakan perintah berikut:  

```
# Get an unassigned phone number from your inventory
PHONE_NUMBER=$(aws chime-sdk-voice list-phone-numbers \
  --query "PhoneNumbers[?Status=='Unassigned'].E164PhoneNumber | [0]" \
  --output text)

# If no unassigned phone number is found, you'll need to provision one
if [ -z "$PHONE_NUMBER" ] || [ "$PHONE_NUMBER" == "None" ]; then
  echo "No unassigned phone numbers found. Please provision a phone number first."
  exit 1
fi

echo "Using phone number: ${PHONE_NUMBER}"

aws chime-sdk-voice create-sip-rule \
  --name "IncomingCallRule" \
  --trigger-type ToPhoneNumber \
  --trigger-value "${PHONE_NUMBER}" \
  --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1}]"
```
Perintah ini membuat aturan SIP yang merutekan panggilan ke nomor telepon Anda ke aplikasi media SIP Anda.

**Example : Buat aturan SIP dengan Permintaan pemicu nama host URI**  
Atau, Anda dapat merutekan panggilan berdasarkan URI permintaan panggilan SIP Konektor Suara yang masuk:  

```
# Replace with your Voice Connector hostname
VOICE_CONNECTOR_HOST="example.voiceconnector.chime.aws"

aws chime-sdk-voice create-sip-rule \
  --name "VoiceConnectorRule" \
  --trigger-type RequestUriHostname \
  --trigger-value "${VOICE_CONNECTOR_HOST}" \
  --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1}]"
```
Ganti nama host dengan nama host keluar Konektor Suara Anda.

## Mengatur redundansi dengan beberapa aplikasi media SIP
<a name="route-calls-events-cli-sip-redundancy"></a>

Untuk redundansi dan failover, Anda dapat membuat beberapa aplikasi media SIP di Wilayah AWS yang sama dan menentukan urutan prioritasnya.

**Example : Buat fungsi Lambda cadangan**  
Pertama, buat fungsi Lambda cadangan di Wilayah yang sama.  

```
cat > lambda/backup-index.js >< EOF
exports.handler = async (event) => {
  console.log('Received event in backup handler:', JSON.stringify(event, null, 2));

  // Simple call handling logic for backup
  const response = {
    SchemaVersion: '1.0',
    Actions: [
      {
        Type: 'Speak',
        Parameters: {
          Engine: 'neural',
          Text: 'Hello! This is the backup handler for Amazon Chime SDK PSTN Audio.',
          VoiceId: 'Matthew'
        }
      },
      {
        Type: 'Hangup',
        Parameters: {
          SipResponseCode: '200'
        }
      }
    ]
  };

  return response;
};
EOF
```

```
                    cd lambda
                    zip -r backup-function.zip backup-index.js
                    cd ..
```

```
                    # Get your AWS account ID
                    ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
                    
                    aws lambda create-function \
                    --function-name ChimeSDKBackupHandler \
                    --runtime nodejs18.x \
                    --role arn:aws:iam::${ACCOUNT_ID}:role/ChimeSDKLambdaRole \
                    --handler backup-index.handler \
                    --zip-file fileb://lambda/backup-function.zip
```

**Example : Tambahkan izin Lambda untuk Amazon Chime SDK ke fungsi pencadangan**  

```
                    # Get your AWS account ID
                    ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
                    
                    aws lambda add-permission \
                    --function-name ChimeSDKBackupHandler \
                    --statement-id ChimeSDK \
                    --action lambda:InvokeFunction \
                    --principal voiceconnector.chime.amazonaws.com \
                    --source-account ${ACCOUNT_ID}
```

**Example : Buat aplikasi media SIP cadangan**  

```
# Get your backup Lambda function ARN
BACKUP_LAMBDA_ARN=$(aws lambda get-function --function-name ChimeSDKBackupHandler --query Configuration.FunctionArn --output text)

aws chime-sdk-voice create-sip-media-application \
  --aws-region us-east-1 \
  --name "BackupCallHandlerApp" \
  --endpoints "[{\"LambdaArn\":\"${BACKUP_LAMBDA_ARN}\"}]"

# Get the backup SIP media application ID
BACKUP_SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \
  --query "SipMediaApplications[?Name=='BackupCallHandlerApp'].SipMediaApplicationId" \
  --output text)
```

**Example : Dapatkan ID aturan SIP**  

```
SIP_RULE_ID=$(aws chime-sdk-voice list-sip-rules \
  --query "SipRules[?Name=='IncomingCallRule'].SipRuleId" \
  --output text)
```

**Example : Perbarui aturan SIP untuk menyertakan kedua aplikasi dengan prioritas**  

```
aws chime-sdk-voice update-sip-rule \
  --sip-rule-id ${SIP_RULE_ID} \
  --target-applications "[{\"SipMediaApplicationId\":\"${SIP_MEDIA_APP_ID}\",\"Priority\":1},{\"SipMediaApplicationId\":\"${BACKUP_SIP_MEDIA_APP_ID}\",\"Priority\":2}]"
```
Perintah ini memperbarui aturan SIP untuk menyertakan aplikasi media SIP primer dan cadangan dengan prioritas masing-masing.

## Buat panggilan keluar
<a name="route-calls-events-cli-create-outbound"></a>

Anda juga dapat membuat panggilan keluar yang memanggil fungsi Lambda Anda menggunakan API. `CreateSIPMediaApplicationCall`

```
# Use a phone number from your inventory for outbound calling
FROM_PHONE_NUMBER=${PHONE_NUMBER}
TO_PHONE_NUMBER="+12065550102"  # Replace with a valid destination number

aws chime-sdk-voice create-sip-media-application-call \
  --from-phone-number "${FROM_PHONE_NUMBER}" \
  --to-phone-number "${TO_PHONE_NUMBER}" \
  --sip-media-application-id ${SIP_MEDIA_APP_ID}
```

Ganti nomor telepon tujuan dengan nomor yang valid. Anda harus memiliki nomor telepon di inventaris Anda untuk melakukan panggilan nyata.

## Memicu Lambda selama panggilan aktif
<a name="route-calls-events-cli-trigger-lambda"></a>

Anda dapat memicu fungsi Lambda Anda selama panggilan aktif menggunakan API. `UpdateSIPMediaApplicationCall`

```
# Replace with an actual transaction ID from an active call
TRANSACTION_ID="txn-3ac9de3f-6b5a-4be9-9e7e-EXAMPLE33333"

aws chime-sdk-voice update-sip-media-application-call \
  --sip-media-application-id ${SIP_MEDIA_APP_ID} \
  --transaction-id ${TRANSACTION_ID} \
  --arguments '{"action":"custom-action"}'
```

ID transaksi disediakan dalam data peristiwa yang dikirim ke fungsi Lambda Anda saat panggilan aktif.

## Pembersihan sumber daya
<a name="route-calls-events-cli-cleanup-resources"></a>

Setelah selesai dengan tutorial ini, Anda harus menghapus sumber daya yang Anda buat untuk menghindari biaya tambahan.

**Example : Hapus aturan SIP**  

```
# Get the SIP rule ID if you don't have it
SIP_RULE_ID=$(aws chime-sdk-voice list-sip-rules \
  --query "SipRules[?Name=='IncomingCallRule'].SipRuleId" \
  --output text)

aws chime-sdk-voice delete-sip-rule --sip-rule-id ${SIP_RULE_ID}
```

**Example : Hapus aplikasi media SIP**  

```
# Get SIP media application IDs if you don't have them
SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \
  --query "SipMediaApplications[?Name=='MyCallHandlerApp'].SipMediaApplicationId" \
  --output text)

BACKUP_SIP_MEDIA_APP_ID=$(aws chime-sdk-voice list-sip-media-applications \
  --query "SipMediaApplications[?Name=='BackupCallHandlerApp'].SipMediaApplicationId" \
  --output text)

aws chime-sdk-voice delete-sip-media-application --sip-media-application-id ${SIP_MEDIA_APP_ID}
aws chime-sdk-voice delete-sip-media-application --sip-media-application-id ${BACKUP_SIP_MEDIA_APP_ID}
```

**Example : Hapus fungsi Lambda**  

```
aws lambda delete-function --function-name ChimeSDKCallHandler
aws lambda delete-function --function-name ChimeSDKBackupHandler
```

**Example : Hapus peran IAM**  

```
aws iam detach-role-policy --role-name ChimeSDKLambdaRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

aws iam delete-role --role-name ChimeSDKLambdaRole
```

**Example : Rilis nomor telepon**  
Jika Anda tidak lagi membutuhkan nomor telepon, Anda dapat melepaskannya:  

```
# List phone numbers
aws chime-sdk-voice list-phone-numbers

# Delete a specific phone number
aws chime-sdk-voice delete-phone-number --phone-number-id ${PHONE_NUMBER}
```

Perhatikan bahwa nomor telepon memasukkan status ReleaseInProgress "" selama 7 hari sebelum dirilis sepenuhnya. Selama periode ini, Anda dapat mengembalikannya menggunakan `restore-phone-number` perintah jika diperlukan.

## Pergi ke produksi
<a name="route-calls-events-cli-going-to-production"></a>

Tutorial ini menunjukkan fungsionalitas dasar perutean panggilan ke fungsi Lambda menggunakan audio Amazon Chime SDK PSTN. Namun, untuk lingkungan produksi, Anda harus mempertimbangkan praktik terbaik berikut:

### Pertimbangan keamanan
<a name="route-calls-events-cli-security"></a>
+ Menerapkan izin hak istimewa paling sedikit. Buat kebijakan IAM khusus yang hanya memberikan izin khusus yang diperlukan oleh fungsi Lambda Anda.
+ Tambahkan kondisi ARN sumber ke izin Lambda. Batasi aplikasi media SIP mana yang dapat menjalankan fungsi Lambda Anda.
+ Menerapkan validasi masukan. Tambahkan validasi ke fungsi Lambda Anda untuk memastikan mereka hanya memproses peristiwa yang valid.
+ Pertimbangkan penyebaran VPC. Untuk meningkatkan keamanan, gunakan fungsi Lambda Anda dalam VPC dengan grup keamanan yang sesuai.
+ Enkripsi data sensitif. Gunakan AWS Key Management Service untuk mengenkripsi data sensitif apa pun yang digunakan oleh aplikasi Anda.

### Pertimbangan arsitektur
<a name="route-calls-events-cli-architecture"></a>
+ Melaksanakan pemantauan dan pencatatan. Siapkan CloudWatch alarm dan log untuk memantau kesehatan dan kinerja aplikasi Anda.
+ Tambahkan penanganan kesalahan. Menerapkan penanganan kesalahan yang komprehensif dalam fungsi Lambda Anda.
+ Pertimbangkan batas penskalaan. Waspadai kuota layanan dan permintaan meningkat jika diperlukan untuk volume panggilan tinggi.
+ Menerapkan infrastruktur sebagai kode. Gunakan CloudFormation atau AWS CDK untuk menyebarkan infrastruktur Anda.
+ Mengatur CI/CD saluran pipa. Terapkan integrasi dan penerapan berkelanjutan untuk fungsi Lambda Anda.

Untuk informasi lebih lanjut tentang membangun aplikasi siap produksi, lihat:
+ [AWS Kerangka Well-Architected](https://docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html) 
+ [Praktik Terbaik untuk Keamanan, Identitas, & Kepatuhan](https://aws.amazon.com/architecture/security-identity-compliance/)
+ [Lensa Aplikasi Tanpa Server](https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/welcome.html) 

## Langkah selanjutnya
<a name="route-calls-events-cli-next-steps"></a>

Sekarang setelah Anda mempelajari cara merutekan panggilan ke fungsi Lambda menggunakan audio Amazon Chime SDK PSTN, Anda dapat menjelajahi fitur yang lebih canggih:
+ Integrasikan dengan Amazon Lex untuk mengelola interaksi dialog untuk skenario agen cerdas. Untuk informasi selengkapnya, lihat [Membuat bot Amazon Lex V2 untuk perpesanan Amazon Chime SDK](create-lex-bot.md).
+ Siapkan analitik suara untuk mendapatkan wawasan dari panggilan Anda. Untuk informasi selengkapnya, lihat [Menghasilkan wawasan dari panggilan menggunakan analitik panggilan untuk Amazon Chime SDK](call-analytics.md).
+ Jelajahi tindakan kontrol panggilan tingkat lanjut untuk membangun alur panggilan yang canggih. Untuk informasi selengkapnya, lihat [Menggunakan konfigurasi analitik panggilan untuk Amazon Chime SDK](using-call-analytics-configurations.md).