

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

# Membangun fungsi Lambda Penyedia Ketersediaan Kustom
<a name="building_cap"></a>

Penyedia Ketersediaan Kustom (CAPs) dikonfigurasi dengan protokol permintaan dan respons berbasis JSON yang ditulis dalam skema JSON yang terdefinisi dengan baik. Fungsi Lambda akan mengurai permintaan dan memberikan respons yang valid.

**Topics**
+ [Elemen permintaan dan respons](#cap_request_response_elements)
+ [Memberi Akses](#granting_access)
+ [Contoh Amazon WorkMail menggunakan fungsi CAP Lambda](#cap_example_github)

## Elemen permintaan dan respons
<a name="cap_request_response_elements"></a>

### Elemen permintaan
<a name="cap_request"></a>

Berikut ini adalah contoh permintaan yang digunakan untuk mengonfigurasi CAP untuk WorkMail pengguna Amazon: 

```
{
    "requester": {
        "email": "user1@internal.example.com",
        "userName": "user1",
        "organization": "m-0123456789abcdef0123456789abcdef",
        "userId": "S-1-5-18",
        "origin": "127.0.0.1"
    },
    "mailboxes": [
        "user2@external.example.com",
        "unknown@internal.example.com"
    ],
    "window": {
        "startDate": "2021-05-04T00:00:00.000Z",
        "endDate": "2021-05-06T00:00:00.000Z"
    }
}
```

**Permintaan terdiri dari tiga bagian: **pemohon**, **kotak surat**, dan jendela.** Ini dijelaskan dalam berikut[Pemohon](#cap_request_requester),[Kotak surat](#cap_request_mailboxes), dan [Jendela](#cap_request_window) bagian dari panduan ini.

#### Pemohon
<a name="cap_request_requester"></a>

Bagian *pemohon* memberikan informasi tentang pengguna yang membuat permintaan asli ke Amazon WorkMail. CAPs gunakan informasi ini untuk mengubah perilaku penyedia. Misalnya, data ini dapat digunakan untuk menyamar sebagai pengguna yang sama di penyedia ketersediaan backend atau detail tertentu dapat dihilangkan dari respons.


| Bidang | Deskripsi | Diperlukan | 
| --- | --- | --- | 
|  `Email`  |  Alamat email utama pemohon.  |  Ya  | 
|  `Username`  |  Nama pengguna pemohon.  |  Ya  | 
|  `Organization`  |  ID organisasi pemohon.  |  Ya  | 
|  `UserID`  |  ID pemohon.  |  Ya  | 
|  `Origin`  |  Alamat jarak jauh dari permintaan.  |  Tidak  | 
|  `Bearer`  |  Terpesan untuk digunakan di masa mendatang.  |  Tidak  | 

#### Kotak surat
<a name="cap_request_mailboxes"></a>

Bagian *kotak pesan* berisi daftar alamat email pengguna yang dipisahkan koma yang meminta informasi ketersediaannya.

#### Jendela
<a name="cap_request_window"></a>

Bagian *jendela* berisi jendela waktu yang diminta informasi ketersediaan. Keduanya `startDate` dan `endDate` ditentukan dalam UTC dan diformat sesuai dengan [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339. Acara tidak diharapkan terpotong. Dengan kata lain, jika suatu peristiwa dimulai sebelum yang ditentukan`StartDate`, awal asli akan digunakan.

### Elemen jawaban
<a name="cap_response"></a>

Amazon WorkMail akan menunggu selama 25 detik untuk mendapatkan respons dari fungsi CAP Lambda. Setelah 25 detik, Amazon WorkMail akan menganggap fungsi tersebut gagal dan menghasilkan kegagalan untuk kotak pesan terkait dalam respons EWS GetUserAvailability. Ini tidak akan menyebabkan seluruh GetUserAvailability operasi gagal.

Berikut ini adalah contoh respons dari konfigurasi yang ditentukan di awal bagian ini: 

```
{
    "mailboxes": [{
        "mailbox": "user2@external.example.com",
        "events": [{
            "startTime": "2021-05-03T23:00:00.000Z",
            "endTime": "2021-05-04T03:00:00.000Z",
            "busyType": "BUSY"|"FREE"|"TENTATIVE",
            "details": {  // optional
                "subject": "Late meeting",
                "location": "Chime",
                "instanceType": "SINGLE_INSTANCE"|"RECURRING_INSTANCE"|"EXCEPTION",
                "isMeeting": true,
                "isReminderSet": true,
                "isPrivate": false
            }
        }],
        "workingHours": {
            "timezone": {
                "name": "W. Europe Standard Time"
                "bias": 60,
                "standardTime": {  // optional (not needed for fixed offsets)
                    "offset": 60,
                    "time": "02:00:00",
                    "month": "JAN"|"FEB"|"MAR"|"APR"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC",
                    "week": "FIRST"|"SECOND"|"THIRD"|"FOURTH"|"LAST",
                    "dayOfWeek": "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"
                },
                "daylightTime": {  // optional (not needed for fixed offsets)
                    "offset": 0,
                    "time": "03:00:00",
                    "month": "JAN"|"FEB"|"MAR"|"APR"|"JUN"|"JUL"|"AUG"|"SEP"|"OCT"|"NOV"|"DEC",
                    "week": "FIRST"|"SECOND"|"THIRD"|"FOURTH"|"LAST",
                    "dayOfWeek": "SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"
                },                
            },
            "workingPeriods":[{
                "startMinutes": 480,
                "endMinutes": 1040,
                "days": ["SUN"|"MON"|"TUE"|"WED"|"THU"|"FRI"|"SAT"]
            }]
        }
    },{
        "mailbox": "unknown@internal.example.com",
        "error": "MailboxNotFound"
    }]
}
```

Respons terdiri dari satu bagian *kotak pesan* yang terdiri dari daftar kotak pesan. *Setiap kotak pesan yang ketersediaannya berhasil diperoleh terdiri dari tiga bagian: *kotak surat*, *acara*, dan jam kerja.* *Jika penyedia ketersediaan gagal mendapatkan informasi ketersediaan untuk kotak pesan, bagian ini terdiri dari dua bagian: *kotak pesan dan kesalahan*.* Ini dijelaskan dalam bagian berikut[Kotak surat](#cap_response_mailbox),, [Peristiwa](#cap_response_events)[Jam Kerja](#cap_response_workinghours),[Zona waktu](#cap_response_timezone),[Periode Kerja](#cap_response_workingperiods), dan [Kesalahan](#cap_response_error) bagian dari panduan ini.

#### Kotak surat
<a name="cap_response_mailbox"></a>

Bagian *kotak pesan* adalah alamat email pengguna yang ditemukan di bagian *kotak pesan* permintaan.

#### Peristiwa
<a name="cap_response_events"></a>

Bagian *peristiwa* adalah daftar peristiwa yang terjadi di jendela yang diminta. Setiap peristiwa didefinisikan dengan parameter berikut:


| Bidang | Deskripsi | Diperlukan | 
| --- | --- | --- | 
|  `startTime`  |  Waktu mulai acara di UTC dan diformat sesuai dengan [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339.  |  Ya  | 
|  `endTime`  |  Waktu akhir acara di UTC dan diformat sesuai dengan [RFC](https://www.rfc-editor.org/rfc/rfc3339) 3339.  |  Ya  | 
|  `busyType`  |  Jenis acara yang sibuk. Dapat berupa `Busy`, `Free`, atau `Tentative`.  |  Ya  | 
|  `details`  |  Detail acara.  |  Tidak  | 
|  `details.subject`  |  Subjek acara.  |  Ya  | 
|  `details.location`  |  Lokasi acara.  |  Ya  | 
|  `details.instanceType`  |  Jenis instance dari acara tersebut. Dapat berupa `Single_Instance`, `Recurring_Instance`, atau `Exception`.  |  Ya  | 
|  `details.isMeeting`  |  Sebuah Boolean untuk menunjukkan apakah acara memiliki peserta.  |  Ya  | 
|  `details.isReminderSet`  |  Sebuah Boolean untuk menunjukkan jika acara memiliki set pengingat.  |  Ya  | 
|  `details.isPrivate`  |  Sebuah Boolean untuk menunjukkan jika acara diatur ke pribadi.  |  Ya  | 

#### Jam Kerja
<a name="cap_response_workinghours"></a>

Bagian *WorkingHours* berisi informasi tentang jam kerja pemilik kotak pesan. Ini berisi dua bagian: *zona waktu* dan *WorkingPeriod*. 

#### Zona waktu
<a name="cap_response_timezone"></a>

Subbagian *zona waktu* menjelaskan zona waktu pemilik kotak pesan. Penting untuk merender jam kerja pengguna dengan benar saat pemohon bekerja di zona waktu yang berbeda. Penyedia ketersediaan diharuskan untuk menjelaskan zona waktu secara eksplisit, daripada menggunakan nama. Menggunakan deskripsi zona waktu standar membantu menghindari ketidakcocokan zona waktu.


| Bidang | Deskripsi | Diperlukan | 
| --- | --- | --- | 
|  `name`  |  Nama zona waktu.  |  Ya  | 
|  `bias`  |  Offset default dari GMT dalam hitungan menit.  |  Ya  | 
|  `standardTime`  |  Awal waktu standar untuk zona waktu yang ditentukan.  |  Tidak  | 
|  `daylightTime`  |  Awal waktu penghematan siang hari untuk zona waktu yang ditentukan.  |  Tidak  | 

Anda harus mendefinisikan keduanya `standardTime` dan`daylightTime`, atau menghilangkan keduanya. Bidang dalam `standardTime` dan `daylightTime` objek adalah:


| Bidang | Deskripsi | Nilai yang Diizinkan | 
| --- | --- | --- | 
|  `offset`  |  Offset relatif terhadap offset default dalam hitungan menit.  |  TA  | 
|  `time`  |  Waktu di mana transisi antara waktu standar dan waktu musim panas terjadi, ditentukan sebagai`hh:mm:ss`.  |  TA  | 
|  `month`  |  Bulan di mana transisi antara waktu standar dan waktu musim panas terjadi.  |  `JAN`,`FEB`, `MAR`, `APR`, `JUN`, `JUL`, `AUG`, `SEP`, `OCT`, `NOV`, `DEC`  | 
|  `week`  |  Minggu dalam bulan yang ditentukan bahwa transisi antara waktu standar dan waktu musim panas terjadi.  |  `FIRST`, `SECOND`, `THIRD`, `FOURTH`, `LAST`  | 
|  `dayOfWeek`  |  Hari dalam minggu yang ditentukan bahwa transisi antara waktu standar dan waktu musim panas terjadi.  |  `SUN`, `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`  | 

#### Periode Kerja
<a name="cap_response_workingperiods"></a>

Bagian *WorkingPeriod* berisi satu atau lebih objek periode kerja. Setiap periode menentukan awal dan akhir hari kerja selama satu hari atau lebih. 


| Bidang | Deskripsi | Nilai yang Diizinkan | 
| --- | --- | --- | 
|  `startMinutes`  |  Awal hari kerja dalam hitungan menit dari tengah malam.  |  TA  | 
|  `endMinutes`  |  Akhir hari kerja dalam hitungan menit dari tengah malam.  |  TA  | 
|  `days`  |  Hari-hari di mana periode ini berlaku.  |  `SUN`, `MON`, `TUE`, `WED`, `THU`, `FRI`, `SAT`  | 

#### Kesalahan
<a name="cap_response_error"></a>

Bidang *kesalahan* dapat berisi pesan kesalahan arbitrer. Tabel berikut mencantumkan pemetaan kode terkenal untuk kode kesalahan EWS. Semua pesan lainnya akan dipetakan ke`ERROR_FREE_BUSY_GENERATION_FAILED`. 


| Nilai | Kode kesalahan EWS | 
| --- | --- | 
|  `MailboxNotFound`  |  `ERROR_MAIL_RECIPIENT_NOT_FOUND`  | 
|  `ErrorAvailabilityConfigNotFound`  |  `ERROR_AVAILABILITY_CONFIG_NOT_FOUND`  | 
|  `ErrorServerBusy`  |  `ERROR_SERVER_BUSY`  | 
|  `ErrorTimeoutExpired`  |  `ERROR_TIMEOUT_EXPIRED`  | 
|  `ErrorFreeBusyGenerationFailed`  |  `ERROR_FREE_BUSY_GENERATION_FAILED`  | 
|  `ErrorResponseSchemaValidation`  |  `ERROR_RESPONSE_SCHEMA_VALIDATION`  | 

## Memberi Akses
<a name="granting_access"></a>

Jalankan perintah Lambda berikut dari AWS Command Line Interface ()AWS CLI. Perintah ini menambahkan kebijakan sumber daya ke fungsi Lambda yang mem-parsing CAP. Fungsi ini memungkinkan layanan WorkMail ketersediaan Amazon untuk menjalankan fungsi Lambda Anda.

```
aws lambda add-permission \
    --region LAMBDA_REGION \
    --function-name CAP_FUNCTION_NAME \
    --statement-id AllowWorkMail \
    --action "lambda:InvokeFunction" \
    --principal availability.workmail.WM_REGION.amazonaws.com \
    --source-account WM_ACCOUNT_ID \
    --source-arn arn:aws:workmail:WM_REGION:WM_ACCOUNT_ID:organization/ORGANIZATION_ID
```

Dalam perintah, tambahkan parameter berikut di mana ditunjukkan:
+ *LAMBDA\$1REGION*— Nama wilayah tempat CAP Lambda dikerahkan. Misalnya, `us-east-1`.
+ *CAP\$1FUNCTION\$1NAME*— Nama fungsi CAP Lambda. 
**catatan**  
Ini bisa berupa nama, alias, atau ARN sebagian atau penuh dari fungsi CAP Lambda.
+ *WM\$1REGION*— Nama wilayah tempat WorkMail organisasi Amazon memanggil fungsi Lambda. 
**catatan**  
Hanya Wilayah berikut yang tersedia untuk digunakan dengan CAP:  
AS Timur (Virginia Utara)
US West (Oregon)
Eropa (Irlandia)
+ *WM\$1ACCOUNT\$1ID*— ID akun Organisasi.
+ *ORGANIZATION\$1ID*— ID Organisasi yang memanggil CAP Lambda. Misalnya, ID Org: m-934ebb9eb57145d0a6cab566ca81a21f.

**catatan**  
*LAMBDA\$1REGION*dan *WM\$1REGION* akan berbeda hanya jika panggilan lintas wilayah diperlukan. Jika panggilan lintas wilayah tidak diperlukan, mereka akan sama.

## Contoh Amazon WorkMail menggunakan fungsi CAP Lambda
<a name="cap_example_github"></a>

Untuk contoh Amazon yang WorkMail menggunakan fungsi CAP Lambda untuk menanyakan titik akhir EWS, lihat [AWS contoh aplikasi ini di aplikasi](https://github.com/aws-samples/amazon-workmail-lambda-templates/tree/master/workmail-cap-exchange) *Tanpa Server* untuk repositori Amazon. WorkMail GitHub 