EventBridge, olayları standart CloudEvents 1.0 biçiminden olay hedefinizin beklediği yapıya dönüştürür. Hedefe ulaşan verileri kontrol etmek için her olay kuralında bir dönüşüm yöntemi yapılandırın: tam olay, tek bir çıkarılan alan, statik bir yük veya olay değerlerinden oluşturulan özel bir yapı.
Dönüşüm yöntemleri
EventBridge dört dönüşüm yöntemi sunar. Her biri, hedefe teslim edilen olay yükü üzerinde farklı bir kontrol düzeyi sağlar.
| Yöntem | Davranış | Ne zaman kullanılır |
|---|---|---|
| Tam Olay | CloudEvents yükünü değiştirmeden olduğu gibi iletir | Hedef CloudEvents'i yerel olarak kabul eder |
| Kısmi Olay | JSONPath ifadesiyle tek bir değeri çıkarır | Hedefin olaydan yalnızca bir alana ihtiyacı vardır |
| Sabit | Olay içeriğini yok sayarak sabit bir dize iletir | Olay yalnızca bir tetikleyicidir; hedefin statik bir yüke ihtiyacı vardır |
| Şablon | JSONPath ile birden çok değeri çıkarır ve bunları özel bir dize veya JSON yapısında birleştirir | Hedefin belirli bir yük biçimine ihtiyacı vardır |
Aşağıdaki örneklerde bir örnek CloudEvents olayı kullanılmaktadır:
{
"id": "7adc8c1a-645d-4476-bdef-5d6fb57f****",
"source": "acs.oss",
"specversion": "1.0",
"type": "oss:ObjectCreated:PostObject",
"datacontenttype": "application/json",
"dataschema": "http://example.com/test.json",
"subject": "acs:oss:cn-hangzhou:1234567:xls-papk/game_apk/123.jpg",
"time": "2020-08-17T16:04:46.149Asia/Shanghai",
"aliyuneventbusname": "demo-bus",
"aliyunregionid": "Shanghai",
"data": {
"name": "test",
"scope": 100
}
}
Tam Olay
CloudEvents yükünün tamamı değiştirilmeden hedefe iletilir. Yapılandırma gerekmez.
Çıktı:
{
"id": "7adc8c1a-645d-4476-bdef-5d6fb57f****",
"source": "acs.oss",
"specversion": "1.0",
"type": "oss:ObjectCreated:PostObject",
"datacontenttype": "application/json",
"dataschema": "http://example.com/test.json",
"subject": "acs:oss:cn-hangzhou:1234567:xls-papk/game_apk/123.jpg",
"time": "2020-08-17T16:04:46.149Asia/Shanghai",
"aliyuneventbusname": "demo-bus",
"aliyunregionid": "Shanghai",
"data": {
"name": "test",
"scope": 100
}
}
Kısmi Olay
Tek bir JSONPath ifadesi, olaydan bir değeri çıkarır.
Yapılandırma:
$.data.name
Çıktı:
test
Kullanım notları:
Kısmi Olay yapılandırması başına yalnızca bir JSONPath ifadesine izin verilir.
Değer en fazla 10.240 karakter uzunluğunda olabilir.
Sabit
Olay yükünün yerine sabit bir dize kullanılır. Olayın kendisi yalnızca bir tetikleyici olarak işlev görür.
Yapılandırma:
test1
Çıktı:
test1
Kullanım notları:
Değer en fazla 10.240 karakter uzunluğunda olabilir.
Şablon
Şablon en esnek yöntemdir. İki aşamada çalışır:
Değişken -- Değişken adlarını JSONPath ifadelerine (veya sabit değerlere) eşleyen bir JSON nesnesi. Her JSONPath ifadesi olaydan bir değeri çıkarır.
Şablon -- Değişkenlere
${variableName}sözdizimiyle başvuran bir dize veya JSON yapısı.
Yapılandırma:
Değişken:
{
"name": "$.data.name",
"constant": "Please deal with it timely."
}
Şablon:
The instance is broken, which name is ${name}, ${constant}
Çıktı:
The instance is broken, which name is test, Please deal with it timely.
Kullanım notları:
Değişken değerleri JSONPath ifadeleri veya sabit dizeler olabilir.
Değişken tanımlarında iç içe geçmiş yapılar desteklenmez.
Değişken değeri en fazla 10.240 karakter uzunluğunda olabilir.
Şablon değeri en fazla 10.240 karakter uzunluğunda olabilir.
Şablon çıktı biçimleri
Şablonlar dört çıktı biçimini destekler: basit dizeler, basit JSON, karışık değişkenler ve sabitler içeren JSON ve iç içe geçmiş JSON. Basit dize, basit JSON ve değişkenler ile sabitler içeren JSON örnekleri yukarıda gösterilen aynı örnek olayı kullanır; ancak "state": "RUNNING" değeri data alanında "scope": 100 yerine kullanılır. İç içe geçmiş JSON örneği farklı bir örnek olay kullanır.
Basit dize
Değişken:
{
"name": "$.data.name",
"state": "$.data.state"
}
Şablon:
"name ${name} is in ${state}"
Çıktı:
"name test is in RUNNING"
Basit JSON
Değişken:
{
"name": "$.data.name",
"state": "$.data.state"
}
Şablon:
{
"name": "${name}",
"state": "${state}"
}
Çıktı:
{
"name": "test",
"state": "RUNNING"
}
Değişkenler ve sabitler içeren JSON
Tek bir şablonda çıkarılan değerleri sabit kodlanmış sabitlerle, dizilerle ve farklı veri türleriyle birleştirin.
Değişken:
{
"name": "$.data.name",
"state": "$.data.state"
}
Şablon:
{
"name": "${name}",
"state": [
9,
"${state}",
true
],
"Transformed": "Yes"
}
Çıktı:
{
"name": "test",
"state": [
9,
"RUNNING",
true
],
"Transformed": "Yes"
}
İç içe geçmiş JSON
Olaydan iç içe geçmiş nesneleri veya dizileri geçirmek için, EventBridge'in ham JSON yapısını eklemesi amacıyla değişkene tırnak işareti olmadan başvurun.
Aşağıdaki örnek farklı bir örnek olay kullanmaktadır:
{
"id": "45ef4dewdwe1-7c35-447a-bd93-fab****",
"source": "acs.imm",
"specversion": "1.0",
"subject": "acs.imm:cn-hangzhou:123456789098****:215672",
"time": "2020-11-19T21:04:41+08:00",
"type": "imm:FileMeta:Index",
"aliyunaccountid": "123456789098****",
"aliyunpublishtime": "2020-11-19T21:04:42.179PRC",
"aliyuneventbusname": "default",
"aliyunregionid": "cn-hangzhou",
"aliyunpublishaddr": "172.25.XX.XX",
"data": {
"ProjectName": "test_project",
"DatasetName": "test_dataset",
"RequestId": "D2A3AE88-D17C-4CCC-B149-6651115C****",
"StartTime": "2021-07-22T14:03:15.489885+08:00",
"EndTime": "2021-07-22T14:05:15.489885+08:00",
"Message": "InvalidParameter",
"Success": false,
"Files": [
{
"URI": "oss://bucket/file",
"CustomId": "defaultId",
"CustomLabels": {
"Key1": "Val1",
"Key2": "Val2"
},
"Error": "InternalError"
}
]
}
}
Değişken:
{
"ProjectName": "$.data.ProjectName",
"Files": "$.data.Files"
}
Şablon (${Files} bir diziye başvurduğu için tırnak işareti içermez):
{
"ProjectName": "${ProjectName}",
"Files": ${Files}
}
Çıktı:
{
"ProjectName": "test_project",
"Files": [
{
"URI": "oss://bucket/file",
"CustomId": "defaultId",
"CustomLabels": {
"Key1": "Val1",
"Key2": "Val2"
},
"Error": "InternalError"
}
]
}
Çıkarılan değer bir dize olduğunda "${variableName}" (tırnak işaretleriyle) kullanın. Bir JSON nesnesi veya dizi olduğunda ${variableName} (tırnak işareti olmadan) kullanın.
Kaçış işlevleri
EventBridge, şablon değişkenlerindeki özel karakterleri kaçırmak için iki yerleşik işlev sağlar: jsonEscape() ve htmlEscape().
jsonEscape()
Gömülü karakterlerin JSON yapısını bozmasını önlemek için JSON dizelerindeki özel karakterleri kaçırır.
Değişken:
{
"var": "\"abc\""
}
Şablon:
{
"text": "var is ${jsonEscape(var)}"
}
Çıktı:
{
"text": "var is \"abc\""
}
htmlEscape()
HTML özel karakterlerini düz metin olarak görüntülenecek şekilde kaçırır. Olay verileri HTML çıktısına gömülürken komut enjeksiyonunu önlemek için bu işlevi kullanın.
Değişken:
{
"var": "<script>alert('unsafe');</script>"
}
Şablon:
<p>User Input: ${htmlEscape(var)}</p>
Çıktı:
<p>User Input: <script>alert('unsafe');</script></p>
Sınırlamalar
| Öğe | Sınır |
|---|---|
| Kısmi Olay değeri uzunluğu | En fazla 10.240 karakter |
| Sabit değer uzunluğu | En fazla 10.240 karakter |
| Şablon değişkeni değeri uzunluğu | En fazla 10.240 karakter |
| Şablon değeri uzunluğu | En fazla 10.240 karakter |
| Kural başına Kısmi Olay değişkeni | 1 |
| Değişken tanımlarında iç içe geçmiş yapılar | Desteklenmez |
Yaygın sorunlar
| Sorun | Neden | Çözüm |
|---|---|---|
| JSON çıktısı hatalı biçimli | Bir dize değişkenine tırnak işareti olmadan veya bir nesne/dizi değişkenine tırnak işaretiyle başvurulmuş | Dizeler için "${var}" ve nesneler ile diziler için ${var} kullanın |
| Çıktıda değişken değeri boş | JSONPath ifadesi olayda herhangi bir alanla eşleşmiyor | JSONPath ifadesini gerçek olay yapısına göre doğrulayın |
| Özel karakterler JSON çıktısını bozar | Değişken değeri, JSON yapısıyla çakışan çift tırnak gibi karakterler içeriyor | Değişken başvurusunu jsonEscape() ile sarın: ${jsonEscape(var)} |
| HTML enjekte edilen komut dosyalarını işler | Gömme işleminden önce kaçırılmayan HTML veya JavaScript içeren olay verileri | Değişken başvurusunu htmlEscape() ile sarın: ${htmlEscape(var)} |