

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

# Menghubungkan ServiceNow
<a name="connecting-to-ticketing-and-chat-connecting-servicenow"></a>

Tutorial ini memandu Anda untuk menghubungkan ServiceNow instance ke AWS DevOps Agen untuk memungkinkannya memulai investigasi respons insiden secara otomatis saat tiket dibuat dan memposting temuan utamanya ke dalam tiket asal. Ini juga berisi contoh cara mengonfigurasi ServiceNow instans Anda untuk mengirim hanya tiket tertentu ke Ruang DevOps Agen dan cara mengatur perutean tiket di beberapa Ruang Agen. DevOps 

## Pengaturan Awal
<a name="initial-setup"></a>

Langkah pertama adalah membuat klien ServiceNow OAuth aplikasi yang AWS DevOps dapat digunakan untuk mengakses ServiceNow instance Anda.

### Buat klien ServiceNow OAuth aplikasi
<a name="create-a-servicenow-oauth-application-client"></a>

1. Aktifkan properti sistem kredensi klien instans Anda

   1. Cari `sys_properties.list` di kotak pencarian filter dan kemudian tekan enter (itu tidak akan menampilkan opsi tetapi menekan enter berfungsi)

   1. Pilih Baru

   1. Tambahkan nama as `glide.oauth.inbound.client.credential.grant_type.enabled` dan nilai ke true dengan type as true \$1 false

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/09ed6d5ff911.png)


1. Arahkan ke System OAuth > Application Registry dari kotak pencarian filter

1. Pilih “Baru"> “Pengalaman Integrasi Masuk Baru” > “Integrasi Baru"> “OAuth - Hibah Kredensial Klien”

1. Pilih nama dan atur pengguna OAuth aplikasi ke “Administrator Masalah”, klik “Simpan”

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/aeff4c127f7c.png)


### Connect ServiceNow OAuth klien Anda ke AWS DevOps Agen
<a name="connect-your-servicenow-oauth-client-to-aws-devops-agent"></a>

1. Anda dapat memulai proses ini di dua tempat. **Pertama, dengan menavigasi ke halaman **Penyedia Kemampuan** dan menemukan **ServiceNow**di bawah **Komunikasi**, lalu klik Daftar.** Atau Anda dapat memilih Ruang DevOps Agen yang mungkin telah Anda buat dan menavigasi ke Kemampuan → Komunikasi → Tambah → ServiceNow dan klik Daftar.

1. Selanjutnya, otorisasi DevOps Agen untuk mengakses ServiceNow instans Anda menggunakan klien OAuth aplikasi yang baru saja Anda buat.

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/3db5a9aafc5f.png)

+ Ikuti langkah selanjutnya, dan simpan informasi yang dihasilkan tentang webhook 

**penting**  
Anda tidak akan melihat informasi ini lagi

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/80d0a319f87e.png)


### Konfigurasikan Aturan ServiceNow Bisnis Anda
<a name="configure-your-servicenow-business-rule"></a>

Setelah Anda membuat konektivitas, Anda harus mengonfigurasi aturan bisnis ServiceNow untuk mengirim tiket ke Ruang DevOps Agen Anda.

1. Arahkan ke Langganan Aktivitas → Administrasi → Aturan Bisnis, dan klik Baru.

1. Setel bidang “Tabel” ke “Insiden [insiden]”, centang kotak “Lanjutan”, dan setel aturan untuk dijalankan setelah Sisipkan, Perbarui, dan Hapus.

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/6f2a7370e2c0.png)


1. Arahkan ke tab “Advanced” dan tambahkan skrip webhook berikut, masukkan rahasia webhook dan URL Anda di mana ditunjukkan, dan klik Kirim.

```
(function executeRule(current, previous /*null when async*/ ) {

    var WEBHOOK_CONFIG = {
        webhookSecret: GlideStringUtil.base64Encode('<<< INSERT WEBHOOK SECRET HERE >>>'),
        webhookUrl: '<<< INSERT WEBHOOK URL HERE >>>'
    };

    function generateHMACSignature(payloadString, secret) {
        try {
            var mac = new GlideCertificateEncryption();
            var signature = mac.generateMac(secret, "HmacSHA256", payloadString);
            return signature;
        } catch (e) {
            gs.error('HMAC generation failed: ' + e);
            return null;
        }
    }

    function callWebhook(payload, config) {
        try {
            var timestamp = new Date().toISOString();
            var payloadString = JSON.stringify(payload);
            var payloadWithTimestamp =`${timestamp}:${payloadString}`;

            var signature = generateHMACSignature(payloadWithTimestamp, config.webhookSecret);

            if (!signature) {
                gs.error('Failed to generate signature');
                return false;
            }

            gs.info('Generated signature: ' + signature);

            var request = new sn_ws.RESTMessageV2();
            request.setEndpoint(config.webhookUrl);
            request.setHttpMethod('POST');

            request.setRequestHeader('Content-Type', 'application/json');
            request.setRequestHeader('x-amzn-event-signature', signature);
            request.setRequestHeader('x-amzn-event-timestamp', timestamp);

            request.setRequestBody(payloadString);

            var response = request.execute();
            var httpStatus = response.getStatusCode();
            var responseBody = response.getBody();

            if (httpStatus >= 200 && httpStatus < 300) {
                gs.info('Webhook sent successfully. Status: ' + httpStatus);
                return true;
            } else {
                gs.error('Webhook failed. Status: ' + httpStatus + ', Response: ' + responseBody);
                return false;
            }

        } catch (ex) {
            gs.error('Error sending webhook: ' + ex.getMessage());
            return false;
        }
    }

    function createReference(field) {
        if (!field || field.nil()) {
            return null;
        }

        return {
            link: field.getLink(true),
            value: field.toString()
        };
    }

    function getStringValue(field) {
        if (!field || field.nil()) {
            return null;
        }
        return field.toString();
    }

    function getIntValue(field) {
        if (!field || field.nil()) {
            return null;
        }
        var val = parseInt(field.toString());
        return isNaN(val) ? null : val;
    }

    var eventType = (current.operation() == 'insert') ? "create" : "update";

    var incidentEvent = {
        eventType: eventType.toString(),
        sysId: current.sys_id.toString(),
        priority: getStringValue(current.priority),
        impact: getStringValue(current.impact),
        active: getStringValue(current.active),
        urgency: getStringValue(current.urgency),
        description: getStringValue(current.description),
        shortDescription: getStringValue(current.short_description),
        parent: getStringValue(current.parent),
        incidentState: getStringValue(current.incident_state),
        severity: getStringValue(current.severity),
        problem: createReference(current.problem),
        additionalContext: {}
    };

    incidentEvent.additionalContext = {
        number: current.number.toString(),
        opened_at: getStringValue(current.opened_at),
        opened_by: current.opened_by.nil() ? null : current.opened_by.getDisplayValue(),
        assigned_to: current.assigned_to.nil() ? null : current.assigned_to.getDisplayValue(),
        category: getStringValue(current.category),
        subcategory: getStringValue(current.subcategory),
        knowledge: getStringValue(current.knowledge),
        made_sla: getStringValue(current.made_sla),
        major_incident: getStringValue(current.major_incident)
    };

    for (var key in incidentEvent.additionalContext) {
        if (incidentEvent.additionalContext[key] === null) {
            delete incidentEvent.additionalContext[key];
        }
    }

    gs.info(JSON.stringify(incidentEvent, null, 2)); // Pretty print for logging only

    if (WEBHOOK_CONFIG.webhookUrl && WEBHOOK_CONFIG.webhookSecret) {
        callWebhook(incidentEvent, WEBHOOK_CONFIG);
    } else {
        gs.info('Webhook not configured.');
    }

})(current, previous);
```

Jika Anda memilih untuk mendaftarkan ServiceNow koneksi Anda dari halaman **Penyedia Kemampuan**, Anda sekarang harus menavigasi ke Ruang DevOps Agen yang ingin Anda selidiki tiket ServiceNow insiden, pilih Kemampuan → Komunikasi, lalu daftarkan ServiceNow instans yang Anda daftarkan di halaman Penyedia Kemampuan. Sekarang, semuanya harus diatur, dan semua insiden di mana penelepon diatur ke “Administrator Masalah” (untuk meniru izin yang Anda berikan kepada AWS DevOps OAuth klien) akan memicu penyelidikan respons insiden di Ruang Agen yang dikonfigurasi. DevOps Anda dapat menguji ini dengan membuat insiden baru ServiceNow dan menyetel bidang Penelepon insiden tersebut sebagai “Administrator Masalah.” 

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/4c7d24a85f88.png)


### ServiceNow pembaruan tiket
<a name="servicenow-ticket-updates"></a>

Selama semua Investigasi respons insiden yang dipicu, DevOps Agen Anda akan memberikan pembaruan temuan utamanya, analisis akar penyebab, dan rencana mitigasi ke dalam tiket asal. Temuan agen diposting ke komentar insiden, dan saat ini kami hanya akan memposting catatan agen jenis`finding`,,,`cause`, `investigation_summary``mitigation_summary`, dan pembaruan status investigasi (misalnya`AWS DevOps Agent started/finished its investigation`).

## Contoh perutean tiket dan orkestrasi
<a name="ticket-routing-and-orchestration-examples"></a>

### Skenario: Memfilter insiden mana yang dikirim ke Ruang Agen DevOps
<a name="scenario-filtering-which-incidents-are-sent-to-a-devops-agent-space"></a>

Ini adalah skenario sederhana tetapi membutuhkan beberapa konfigurasi ServiceNow untuk membuat bidang ServiceNow untuk melacak sumber insiden. Untuk tujuan contoh ini, buat bidang Sumber (u\$1source) baru menggunakan pembuat formulir SNOW. Ini akan memungkinkan melacak sumber insiden dan menggunakannya untuk merutekan permintaan dari sumber tertentu ke Ruang DevOps Agen. Perutean dilakukan dengan membuat Aturan Bisnis Layanan Sekarang dan di tab Kapan menjalankan pengaturan “Kapan” pemicu dan “Kondisi Filter.” Dalam contoh ini kondisi filter diatur sebagai berikut: 

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/fac7a186beee.png)


### Skenario: Insiden perutean di beberapa Ruang Agen DevOps
<a name="scenario-routing-incidents-across-multiple-devops-agent-spaces"></a>

Contoh ini menunjukkan bagaimana memicu Investigasi di Ruang DevOps Agen B ketika urgensinya adalah`1`, kategori adalah`Software`, atau Layanan adalah`AWS`, dan memicu Investigasi di Ruang DevOps Agen A ketika layanan tersebut`AWS`, dan sumbernya`Dynatrace`.

Skenario ini dapat dicapai dengan dua cara. Skrip webhook itu sendiri dapat diperbarui untuk memasukkan logika bisnis ini. Dalam skenario ini kami akan menunjukkan bagaimana mencapainya dengan Aturan ServiceNow Bisnis, untuk transparansi dan menyederhanakan debugging. Routing dilakukan dengan membuat dua Aturan Bisnis Service Now.
+ Buat Aturan Bisnis ServiceNow untuk Ruang DevOps Agen A dan buat kondisi menggunakan pembuat kondisi untuk hanya mengirim peristiwa berdasarkan kondisi yang kami tentukan.

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/bca2f3928bf0.png)

+ Selanjutnya, buat Aturan Bisnis lain di ServiceNow untuk AgentSpace B yang aturan bisnisnya hanya akan dipicu ketika Layanan AWS dan sumbernya adalah Dynatrace.

![\[alt text not found\]](http://docs.aws.amazon.com/id_id/devopsagent/latest/userguide/images/bc29e4db1a76.png)


Sekarang, ketika Anda membuat Insiden baru yang cocok dengan kondisi yang ditentukan, itu akan memicu penyelidikan pada DevOps Agen Space A atau DevOps Agen Space B, memberi Anda kontrol halus atas perutean insiden.