現在のプランを確認
Suite すべてのプラン
Support すべてのプラン
ファストパス: 管理センター >「アプリおよびインテグレーション」>「アクションとWebhook」 > 「Webhook」

Zendeskの強力なツールであるWebhookを使って、Zendeskアカウントの変更を常に他のシステムに反映させることができます。Amazon EventBridgeとの統合にWebhookを使用すると、リアルタイムのデータ処理のワークフローを洗練化することができます。この記事では、Webhookを使用してZendeskのイベントをAmazon EventBridgeに送信する方法について説明します。

この記事では、次のトピックについて説明します。
  • Webhooksを使用してAmazon EventBridgeにイベントを送信するための要件
  • EventBridgeイベントバスを作成する
  • Webhookのペイロードを受け取るLambda関数を作成する
  • Amazon EventBridgeに接続するためのZendesk Webhookを作成する

Webhooksを使用してAmazon EventBridgeにイベントを送信するための要件

Webhookを使用してAmazon EventBridgeと接続するには、以下の要件を満たす必要があります。
  • Zendeskアカウントの管理者であること。
  • EventBridgeが設定されたAWSアカウントがあること。

    また、EventBridgeも含め、AWSサービスの基本的な知識が必要です。

EventBridgeイベントバスを作成する

Webhookを作成する前に、EventBridgeイベントバスを作成する必要があります。

ARNをメモしておきます。後のステップで必要になります。ARNは、以下のようなフォーマットになっています。
arn:aws:events:{REGION}:{AWS_ID}:event-bus/{EVENT_BUS_ID}

Webhookのペイロードを受け取るLambda関数を作成する

Webhookを受け取り、Webhookの署名を確認し、作成したEventBridgeイベントバスにWebhookペイロードを渡すには、Lambda関数が必要です。

Lambda関数を作成するには
  1. AWS Lambdaコンソールを使用して、新しいLambda関数を作成します。必要に応じてフィールドに値を入力します。「Advanced settings」で「Enable function URL」を選択し、認証方法に「NONE」を選択します。

    Function URLをメモしておきます。これは、Webhookを接続する公開URLです。

  2. 「 Code source」ウィンドウに以下のコードを追加し、「Deploy」をクリックします。
    import json
    import hashlib
    import hmac
    import os
    import base64
    import logging
    
    import boto3
    
    LOGGER = logging.getLogger()
    LOGGER.setLevel('INFO')
    
    EVENTBRIDGE = boto3.client('events')
    
    # Set these values in your Lambda function environment variables.
    EVENT_BUS_ARN = os.environ['EVENT_BUS_ARN']
    WEBHOOK_SECRET = os.environ['WEBHOOK_SECRET'].encode('utf-8')
    
    
    def verify_signature(payload, signature, timestamp):
        '''Verify the provided webhook signature was created by Zendesk's Webhook feature.'''
        combined = timestamp + payload
        combined_bytes = combined.encode('utf-8')
        computed_hmac = hmac.new(WEBHOOK_SECRET, combined_bytes, hashlib.sha256)
        computed_signature = base64.b64encode(computed_hmac.digest()).decode('utf-8')
        return hmac.compare_digest(computed_signature, signature)
    
    
    def webhook_to_eventbridge(event):
        '''Forward the webhook body to AWS EventBridge.'''
        payload = event['body']
        signature = event['headers'].get('x-zendesk-webhook-signature', '')
        timestamp = event['headers'].get('x-zendesk-webhook-signature-timestamp', '')
    
        if not verify_signature(payload, signature, timestamp):
            LOGGER.warning('Received webhook with invalid signature')
            return {
                'statusCode': 403,
                'body': json.dumps({'message': 'Forbidden'}),
            }
    
        payload_dict = json.loads(payload) if isinstance(payload, str) else payload
        event_source = payload_dict.get('source', 'webhook.custom')
        detail_type = payload_dict.get('type', 'defaultDetailType')
    
        put_events_response = EVENTBRIDGE.put_events(
            Entries=[
                {
                    'Source': event_source,
                    'DetailType': detail_type,
                    'Detail': json.dumps(payload_dict),
                    'EventBusName': EVENT_BUS_ARN,
                }
            ]
        )
    
        response_entries = put_events_response.get('Entries', [])
        if len(response_entries) == 0 or 'ErrorCode' in response_entries[0]:
            LOGGER.error(f'Push to event bridge failed: {response_entries}')
            return {
                'statusCode': 500,
                'body': json.dumps(
                    {
                        'message': 'Failed to send event to EventBridge',
                        'response': put_events_response,
                    }
                ),
            }
    
        return {
            'statusCode': 200,
            'body': json.dumps(
                {
                    'message': 'Event successfully sent to EventBridge',
                    'response': put_events_response,
                }
            ),
        }
    
    
    def lambda_handler(event, context):
        try:
            return webhook_to_eventbridge(event)
        except Exception as e:
            LOGGER.exception('Error handling webhook')
            return {
                'statusCode': 500,
                'body': json.dumps({'message': 'Error handling webhook', 'error': str(e)}),
            }
    
  3. Lambda関数に以下の2つの環境変数を追加します。
    • EVENT_BUS_ARN:EventBridgeイベントバスを作成するときに取得したARNの値を設定します。これがイベントバスの場所になります。
    • WEBHOOK_SECRET:Webhookを作成した後、これをWebhookシークレットに設定する必要があります。
  4. AWS IAMコンソールを使用して、AWS Lambdaサービスのロールを作成します。

    ロールの名前をメモしておきます。Lambda関数にロールを割り当てる際に、この情報が必要になります。

  5. ロールを作成したら、ロールを編集してEventBridgeイベントバスのARNを追加します。
    1. ロールを開きます。
    2. 「Step 2:Add permissions」で「Edit」をクリックし、「Create inline policy」を選択します。
    3. EventBridgeサービスを検索し、PutEventsメソッドを選択します。
    4. 「Resources」で、「 Add ARNs」をクリックします。
    5. EventBridgeイベントバスのARNを入力し、「Next」をクリックします。
    6. 「Name」にポリシーの名前を入力し、「Create policy」をクリックします。
  6. AWS Lambdaコンソールを使用して、作成したLambda関数を開き、IAMロールを割り当てます。「Configuration」タブで、「Permissions」を選択し、「Edit」をクリックします。ページの下部で、ロールの名前を選択し、「Save」をクリックします。

Amazon EventBridgeに接続するためのZendesk Webhookを作成する

EventBridgeイベントバスを作成し、Lambda関数を設定したら、Webhook自体を作成する必要があります。

Amazon EventBrightと統合するWebhookを作成するには
  1. 管理センターで、サイドバーにある「 アプリおよびインテグレーション」をクリックし、「アクションおよびWebhook」>「Webhook」を選択します。
  2. Webhookを作成して、以下の値を指定します。
    • Endpoint URLを、Lambda関数を作成したときに取得したFunction URLに設定します。
    • 「Authentication」を「None」に設定します。
  3. 「Webhookを作成する」をクリックします。
メモ:Zendeskは各Webhookの作成プロセス中にシークレットキーを生成します。WebhookをAmazon EventBridgeに正常に接続するには、このシークレットキーをコピーして、Lambda関数のWEBHOOK_SECRET環境変数に貼り付ける必要があります。「Webhookペイロードを受け取るLambda関数を作成する」を参照してください。
メモ:この記事は、統合コードも含め、一般的な情報提供のみを目的としています。記事内で例示したコードについて、Zendeskではサポートも保証もしません。Zendeskは、Amazon EventBridgeのようなサードパーティのテクノロジーについてサポートを提供することはできません。何か問題が生じた場合はコメント欄に投稿するか、インターネットで解決策を探してみてください。
Powered by Zendesk