

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon Chime SDK PSTN オーディオの AWS Lambda 関数への呼び出しのルーティング (AWS CLI)
<a name="route-calls-events-cli"></a>

このチュートリアルでは、Amazon Chime SDK PSTN オーディオサービスを使用して Lambda 関数へのコールルーティングを設定するプロセスについて説明します。Lambda 関数の作成、SIP メディアアプリケーションの設定、着信を処理する SIP ルールの設定方法について説明します。

## 前提条件
<a name="route-calls-events-cli-prerequisites"></a>

このチュートリアルを開始する前に、以下を実行してください。
+ をインストールします AWS CLI。詳細については、「*AWS CLI ユーザーガイド*」の「[AWS CLI の最新バージョンをインストールまたは更新](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)」を参照してください。
+ 適切な認証情報 AWS CLI を使用して を設定します。認証情報をまだ設定していない場合は、`aws configure` を実行します。
+  AWS Lambda および Amazon Chime SDK の概念について基本的な知識を持っている。
+ AWS アカウントで Amazon Chime SDK と Lambda リソースを作成および管理するための十分なアクセス許可を設定します。
+ 電話番号ベースのルーティングでは、Amazon Chime SDK 電話番号インベントリに電話番号が必要です。
+ Voice Connector ベースのルーティングでは、アカウントに Voice Connector を設定する必要があります。

## コストに関する考慮事項
<a name="route-calls-events-cli-cost"></a>

このチュートリアルには、完了後に継続的な料金が発生しないようにするためのクリーンアップ手順が含まれています。詳細については、[「Amazon Chime SDK の料金](https://aws.amazon.com/chime/chime-sdk/pricing/)」を参照してください。

Amazon Chime SDK PSTN オーディオの通話ルーティングの設定を開始しましょう。

## 電話番号を検索してプロビジョニングする
<a name="route-calls-events-cli-search-provision"></a>

電話番号トリガーを使用して SIP ルールを作成する前に、Amazon Chime SDK インベントリに電話番号が必要です。ここでは、使用可能な電話番号を検索してプロビジョニングする方法を示します。

**Example : 利用可能な電話番号を検索する**  

```
# 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
```

このコマンドは、米国のプレフィックス 844 の通話料無料電話番号を検索します。パラメータを変更して、さまざまなタイプの数値を検索できます。

**Example : 電話番号をプロビジョニングする**  
使用可能な電話番号を見つけたら、次のコマンドを使用してプロビジョニングできます。  

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

を検索結果から実際に利用可能な電話番号`+18445550100`に置き換えます。このコマンドは、電話番号をアカウントにプロビジョニングします。

**Example : 電話番号のステータスを確認する**  
電話番号を注文したら、そのステータスを確認できます。  

```
# 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
```

注文 ID を `create-phone-number-order` コマンドから返された ID に置き換えます。

**Example : インベントリ内の電話番号を一覧表示する**  
インベントリ内のすべての電話番号を表示するには:  

```
# List all phone numbers
aws chime-sdk-voice list-phone-numbers \
  --region us-east-1
```
SIP ルールに使用できる未割り当ての電話番号を見つけるには:  

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

## 通話処理用の Lambda 関数を作成する
<a name="route-calls-events-cli-create-function"></a>

次に、着信を処理する Lambda 関数を作成します。関数は PSTN オーディオサービスからイベントを受信し、呼び出しの処理方法に関する指示で応答します。

**Example : Lambda の IAM ロールを作成する**  
Lambda 関数を作成する前に、必要なアクセス許可を付与する IAM ロールを作成する必要があります。  

```
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
```
これらのコマンドは、Lambda が引き受けることを許可する IAM ロールを作成し、Lambda が CloudWatch にログを書き込むためのアクセス許可を提供する基本的な実行ポリシーをアタッチします。

**Example Lambda 関数を作成します。**  
次に、着信を処理するシンプルな Lambda 関数を作成します。  

```
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
```
この Lambda 関数は、着信通話に音声メッセージで応答し、その後ハングアップします。

**Example : Amazon Chime SDK に Lambda アクセス許可を追加する**  
Lambda 関数を呼び出すアクセス許可を Amazon Chime SDK サービスに付与します。  

```
# 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}
```
このコマンドにより、Amazon Chime SDK Voice Connector サービスは Lambda 関数を呼び出すことができます。

## SIP メディアアプリケーションを作成する
<a name="route-calls-events-cli-create-sip-app"></a>

SIP メディアアプリケーションは、Lambda 関数を PSTN オーディオサービスに接続します。このセクションでは、Lambda 関数を使用する SIP メディアアプリケーションを作成します。

**Example : 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}\"}]"
```
SIP メディアアプリケーションは、PSTN オーディオサービスと Lambda 関数間のブリッジとして機能します。

**Example : SIP メディアアプリケーション ID を取得する**  
SIP メディアアプリケーションを作成したら、チュートリアルの後半で使用するために ID を取得する必要があります。  

```
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}"
```
SIP ルールを作成するときに必要になるため、このコマンドによって返される SIP メディアアプリケーション ID を書き留めます。

## SIP ルールを使用して通話ルーティングを設定する
<a name="route-calls-events-cli-call-routing-sip-rules"></a>

SIP ルールは、着信通話を SIP メディアアプリケーションにルーティングする方法を決定します。電話番号または Voice Connector ホスト名に基づいてルールを作成できます。

**Example : 電話番号トリガーを使用して SIP ルールを作成する**  
電話番号に基づいて通話をルーティングするには、次のコマンドを使用します。  

```
# 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}]"
```
このコマンドは、電話番号への通話を SIP メディアアプリケーションにルーティングする SIP ルールを作成します。

**Example : リクエスト URI ホスト名トリガーを使用して SIP ルールを作成する**  
または、着信 Voice Connector SIP コールのリクエスト URI に基づいてコールをルーティングすることもできます。  

```
# 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}]"
```
ホスト名を Voice Connector のアウトバウンドホスト名に置き換えます。

## 複数の SIP メディアアプリケーションで冗長性を設定する
<a name="route-calls-events-cli-sip-redundancy"></a>

冗長性とフェイルオーバーのために、同じ AWS リージョンに複数の SIP メディアアプリケーションを作成し、優先順位を指定できます。

**Example : バックアップ Lambda 関数を作成する**  
まず、同じリージョンにバックアップ Lambda 関数を作成します。  

```
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 : Amazon Chime SDK の Lambda アクセス許可をバックアップ関数に追加する**  

```
                    # 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 : バックアップ SIP メディアアプリケーションを作成する**  

```
# 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 : SIP ルール ID を取得する**  

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

**Example : SIP ルールを更新して、優先順位を持つ両方のアプリケーションを含める**  

```
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}]"
```
このコマンドは、プライマリ SIP メディアアプリケーションとバックアップ SIP メディアアプリケーションの両方をそれぞれの優先順位に含めるように SIP ルールを更新します。

## 発信通話を作成する
<a name="route-calls-events-cli-create-outbound"></a>

`CreateSIPMediaApplicationCall` API を使用して Lambda 関数を呼び出すアウトバウンド呼び出しを作成することもできます。

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

送信先の電話番号を有効な番号に置き換えます。実際の通話を行うには、インベントリに電話番号が必要です。

## アクティブな通話中に Lambda をトリガーする
<a name="route-calls-events-cli-trigger-lambda"></a>

`UpdateSIPMediaApplicationCall` API を使用して、アクティブな呼び出し中に Lambda 関数をトリガーできます。

```
# 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 は、呼び出しがアクティブなときに Lambda 関数に送信されるイベントデータで提供されます。

## リソースをクリーンアップする
<a name="route-calls-events-cli-cleanup-resources"></a>

このチュートリアルが終了したら、追加料金が発生しないように、作成したリソースを削除する必要があります。

**Example : 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 : 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 : Lambda 関数を削除する**  

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

**Example : 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 : 電話番号を解放する**  
電話番号が不要になった場合は、リリースできます。  

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

電話番号は、完全にリリースされるまで 7 日間、ReleaseInProgress」ステータスになることに注意してください。この期間中は、必要に応じて `restore-phone-number` コマンドを使用して復元できます。

## 本番環境への移行
<a name="route-calls-events-cli-going-to-production"></a>

このチュートリアルでは、Amazon Chime SDK PSTN オーディオを使用して Lambda 関数に呼び出しをルーティングする基本的な機能を示します。ただし、本番環境では、次のベストプラクティスを考慮する必要があります。

### セキュリティに関する考慮事項
<a name="route-calls-events-cli-security"></a>
+ 最小特権のアクセス許可を実装します。Lambda 関数に必要な特定のアクセス許可のみを付与するカスタム IAM ポリシーを作成します。
+ Lambda アクセス許可にソース ARN 条件を追加します。Lambda 関数を呼び出すことができる SIP メディアアプリケーションを制限します。
+ 入力検証を実装します。Lambda 関数に検証を追加して、有効なイベントのみが処理されるようにします。
+ VPC のデプロイを検討してください。セキュリティを強化するには、適切なセキュリティグループを持つ VPC 内に Lambda 関数をデプロイします。
+ 機密データを暗号化します。を使用して AWS Key Management Service 、アプリケーションで使用される機密データを暗号化します。

### アーキテクチャに関する考慮事項
<a name="route-calls-events-cli-architecture"></a>
+ モニタリングとログ記録を実装します。CloudWatch アラームとログを設定して、アプリケーションのヘルスとパフォーマンスをモニタリングします。
+ エラー処理を追加します。Lambda 関数に包括的なエラー処理を実装します。
+ スケーリング制限を検討してください。サービスクォータに注意し、通話量が多い場合は引き上げをリクエストします。
+ Infrastructure as Code を実装します。 CloudFormation または AWS CDK を使用してインフラストラクチャをデプロイします。
+ CI/CD パイプラインを設定します。Lambda 関数に継続的な統合とデプロイを実装します。

本番環境に対応したアプリケーションの構築の詳細については、以下を参照してください。
+ [AWS Well-Architected フレームワーク](https://docs.aws.amazon.com/wellarchitected/latest/framework/welcome.html) 
+ [セキュリティ、アイデンティティ、コンプライアンスのベストプラクティス](https://aws.amazon.com/architecture/security-identity-compliance/)
+ [サーバーレスアプリケーションレンズ](https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/welcome.html) 

## 次の手順
<a name="route-calls-events-cli-next-steps"></a>

Amazon Chime SDK PSTN オーディオを使用して Lambda 関数に呼び出しをルーティングする方法を学習したので、より高度な機能を調べることができます。
+ Amazon Lex と統合して、インテリジェントエージェントシナリオのダイアログインタラクションを管理します。詳細については、「[Amazon Chime SDK メッセージング用の Amazon Lex V2 ボットの作成](create-lex-bot.md)」を参照してください。
+ 音声分析を設定して、通話からインサイトを取得します。詳細については、「[Amazon Chime SDK の通話分析を使用して通話からインサイトを生成する](call-analytics.md)」を参照してください。
+ 高度な通話コントロールアクションを調べて、高度な通話フローを構築します。詳細については、「[Amazon Chime SDK で通話分析の設定を使用する](using-call-analytics-configurations.md)」を参照してください。