Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Transformasi EventBridge masukan Amazon Pipes
Amazon EventBridge Pipes mendukung transformator input opsional saat meneruskan data ke pengayaan dan target. Anda dapat menggunakan transformator Input untuk membentuk kembali muatan input peristiwa JSON untuk melayani kebutuhan pengayaan atau layanan target. Untuk tujuan Amazon API Gateway dan API, ini adalah cara Anda membentuk peristiwa input ke model RESTful API Anda. Transformator input dimodelkan sebagai InputTemplate parameter. Mereka dapat berupa teks bebas, jalur JSON ke muatan acara, atau objek JSON yang menyertakan jalur JSON sebaris ke muatan acara. Untuk pengayaan, muatan acara berasal dari sumbernya. Untuk target, muatan peristiwa adalah apa yang dikembalikan dari pengayaan, jika salah satu dikonfigurasi pada pipa. Selain data khusus layanan dalam muatan acara, Anda dapat menggunakan variabel yang dicad angkan dalam referensi data InputTemplate untuk pipa Anda.
Untuk mengakses item dalam array, gunakan notasi tanda kurung persegi.
catatan
EventBridge tidak mendukung semua sintaks JSON Path dan mengevaluasinya saat runtime. Sintaks yang didukung meliputi:
notasi titik (misalnya,
$.detail)tanda hubung
menggarisbawahi
karakter alfanumerik
indeks array
karakter pengganti (*)
garis miring ke depan
Berikut ini adalah contoh InputTemplate parameter yang mereferensikan payload peristiwa Amazon SQS:
String statis
InputTemplate: "Hello, sender"
Jalur JSON
InputTemplate: <$.attributes.SenderId>
String dinamis
InputTemplate: "Hello, <$.attributes.SenderId>"
JSON statis
InputTemplate: > { "key1": "value1", "key2": "value2", "key3": "value3", }
JSON dinamis
InputTemplate: > { "key1": "value1" "key2": <$.body.key>, "d": <aws.pipes.event.ingestion-time> }
Menggunakan notasi tanda kurung persegi untuk mengakses item dalam array:
InputTemplate: > { "key1": "value1" "key2": <$.body.Records[3]>, "d": <aws.pipes.event.ingestion-time> }
catatan
EventBridge menggantikan transformator input saat runtime untuk memastikan output JSON yang valid. Karena itu, letakkan tanda kutip di sekitar variabel yang merujuk ke parameter jalur JSON, tetapi jangan menaruh tanda kutip di sekitar variabel yang merujuk ke objek atau array JSON.
Variabel yang dicadangkan
Template input dapat menggunakan variabel cadangan berikut:
<aws.pipes.pipe-arn>— Nama Sumber Daya Amazon (ARN) dari pipa.<aws.pipes.pipe-name>— Nama pipa.<aws.pipes.source-arn>— ARN dari sumber peristiwa pipa.<aws.pipes.enrichment-arn>— ARN pengayaan pipa.<aws.pipes.target-arn>— ARN target pipa.<aws.pipes.event.ingestion-time>- Waktu di mana acara diterima oleh transformator input. Ini adalah stempel waktu ISO 8601. Waktu ini berbeda untuk transformator input pengayaan dan transformator input target, tergantung pada kapan pengayaan selesai memproses acara.<aws.pipes.event>— Acara seperti yang diterima oleh transformator input.Untuk transformator input pengayaan, ini adalah peristiwa dari sumbernya. Ini berisi payload asli dari sumber, ditambah metadata khusus layanan tambahan. Lihat topik di Sumber EventBridge Pipa Amazon untuk contoh khusus layanan.
Untuk transformator input target, ini adalah peristiwa yang dikembalikan oleh pengayaan, jika dikonfigurasi, tanpa metadata tambahan. Dengan demikian, muatan yang dikembalikan pengayaan mungkin non-JSON. Jika tidak ada pengayaan yang dikonfigurasi pada pipa, ini adalah peristiwa dari sumber dengan metadata.
<aws.pipes.event.json>— Sama sepertiaws.pipes.event, tetapi variabel hanya memiliki nilai jika muatan asli, baik dari sumber atau dikembalikan oleh pengayaan, adalah JSON. Jika pipa memiliki bidang yang dikodekan, seperti bidang Amazon SQS atau Kinesisdata,bodybidang tersebut diterjemahkan dan diubah menjadi JSON yang valid. Karena tidak lolos, variabel hanya dapat digunakan sebagai nilai untuk bidang JSON. Untuk informasi selengkapnya, lihat Penguraian data tubuh implisit.
Contoh transformasi masukan
Berikut ini adalah contoh acara Amazon EC2 yang dapat kita gunakan sebagai contoh acara kita.
{
"version": "0",
"id": "7bf73129-1428-4cd3-a780-95db273d1602",
"detail-type": "EC2 Instance State-change Notification",
"source": "aws.ec2",
"account": "123456789012",
"time": "2015-11-11T21:29:54Z",
"region": "us-east-1",
"resources": [
"arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
],
"detail": {
"instance-id": "i-0123456789",
"state": "RUNNING"
}
}
Mari kita gunakan JSON berikut sebagai Transformer kita.
{
"instance" : <$.detail.instance-id>,
"state": <$.detail.state>,
"pipeArn" : <aws.pipes.pipe-arn>,
"pipeName" : <aws.pipes.pipe-name>,
"originalEvent" : <aws.pipes.event.json>
}
Berikut ini akan menjadi Output yang dihasilkan:
{
"instance" : "i-0123456789",
"state": "RUNNING",
"pipeArn" : "arn:aws:pipe:us-east-1:123456789012:pipe/example",
"pipeName" : "example",
"originalEvent" : {
... // commented for brevity
}
}
Penguraian data tubuh implisit
Bidang berikut dalam payload yang masuk mungkin JSON-escaped, seperti objek Amazon SQS, atau dikodekan base64, seperti body objek Kinesis. data Untuk pem filteran dan transformasi input, ubah EventBridge bidang ini menjadi JSON yang valid sehingga sub-nilai dapat direferensikan secara langsung. Misalnya, <$.data.someKey> untuk Kinesis.
Agar target menerima muatan asli tanpa metadata tambahan, gunakan transformator input dengan data tubuh ini, khusus untuk sumbernya. Misalnya, <$.body> untuk Amazon SQS, atau <$.data> untuk Kinesis. Jika muatan asli adalah string JSON yang valid (misalnya{"key": "value"}), maka penggunaan transformator input dengan data tubuh spesifik sumber akan mengakibatkan kutipan dalam muatan sumber asli dihapus. Misalnya, {"key": "value"} akan menjadi "{key: value}" ketika dikirim ke target. Jika target Anda memerlukan payload JSON yang valid (misalnya, EventBridge Lambda atau Step Functions), ini akan menyebabkan kegagalan pengiriman. Agar target menerima data sumber asli tanpa menghasilkan JSON yang tidak valid, bungkus transformator input data badan sumber dalam JSON. Misalnya, {"data": <$.data>}.
Penguraian tubuh implisit juga dapat digunakan untuk mengisi nilai secara dinamis untuk sebagian besar target pipa atau parameter pengayaan. Untuk informasi selengkapnya, lihat Parameter jalur dinamis
catatan
Jika payload asli adalah JSON yang valid, bidang ini akan berisi JSON yang tidak tersingkir dan tidak dikodekan base64. Namun, jika payload bukan JSON yang valid, EventBridge base64-encode untuk bidang yang tercantum di bawah ini, dengan pengecualian Amazon SQS.
MQ aktif —
dataKinesis —
dataAmazon MSK — dan
keyvalueKelinci MQ —
dataApache Kafka yang dikelola sendiri; — dan
keyvalueAmazon SQS —
body
Masalah umum dengan mengubah input
Ini adalah beberapa masalah umum saat mengubah input dalam EventBridge pipa:
-
Untuk String, tanda kutip diperlukan.
-
Tidak ada validasi saat membuat jalur JSON untuk templat Anda.
-
Jika Anda menentukan variabel untuk mencocokkan jalur JSON yang tidak ada dalam acara, EventBridge ganti variabel itu dengan string kosong. EventBridge menyertakan kunci dalam output dengan nilai string kosong alih-alih menghilangkannya.
-
Properti JSON seperti hanya
aws.pipes.event.jsondapat digunakan sebagai nilai bidang JSON, bukan sebaris dalam string lain. -
EventBridge tidak lu put dari nilai yang diekstraksi oleh Jal ur Input, saat mengisi Template Input untuk target.
-
Jika jalur JSON mereferensikan objek atau array JSON, tetapi variabel direferensikan dalam string, EventBridge menghapus tanda kutip internal untuk memastikan string yang valid. Misalnya, “Body is <$.body>” akan menghasilkan penghapusan tanda kutip dari EventBridge objek.
Oleh karena itu, jika Anda ingin menampilkan objek JSON berdasarkan variabel jalur JSON tunggal, Anda harus menempatkannya sebagai kunci. Dalam contoh ini,
{"body": <$.body>}. -
Kutipan tidak diperlukan untuk variabel yang mewakili string. Mereka diizinkan, tetapi Pip EventBridge es secara otomatis menambahkan tanda kutip ke nilai variabel string selama transformasi, untuk memastikan output transformasi adalah JSON yang valid. EventBridge Pipes tidak menambahkan tanda kutip ke variabel yang mewakili objek JSON atau array. Jangan menambahkan tanda kutip untuk variabel yang mewakili objek JSON atau array.
Misalnya, template input berikut menyertakan variabel yang mewakili string dan objek JSON:
{ "pipeArn" : <aws.pipes.pipe-arn>, "pipeName" : <aws.pipes.pipe-name>, "originalEvent" : <aws.pipes.event.json> }Menghasilkan JSON yang valid dengan kutipan yang tepat:
{ "pipeArn" : "arn:aws:events:us-east-2:123456789012:pipe/example", "pipeName" : "example", "originalEvent" : { ... // commented for brevity } } -
Untuk pengayaan atau target Lambda atau Step Functions, batch dikirim ke target sebagai array JSON, bahkan jika ukuran batch adalah 1. Namun, transformator input masih akan diterapkan ke catatan individu dalam JSON Array, bukan array secara keseluruhan. Untuk informasi selengkapnya, lihat Pengelompokan dan konkurensi EventBridge Pipa Amazon.
-
Transformator input dan penyaringan dapat mengekstrak nilai JSON yang telah dikodekan string sekali, tetapi bukan nilai yang telah dikodekan string dua kali. Hal ini biasanya terjadi ketika pesan Amazon SNS dikirim ke Amazon SQS. Ketika Amazon SQS menerima pesan Amazon SNS, itu merangkai seluruh pesan. Ketika Pipes kemudian menerima pesan Amazon SQS ini, konten pesan Amazon SNS muncul di
bodylapangan dan dapat diakses. Namun, jikaMessagebidang Amazon SNS itu sendiri berisi JSON yang disatukan, konten bersarang itu dikodekan ganda dan tidak dapat diakses oleh transformator atau filter input. Misalnya, dapat<$.body.TopicArn>diakses, tetapi<$.body.Message.operation>tidak jikaMessagebidang berisi JSON berstringified seperti."{\\\"operation\\\":\\\"UPDATE\\\",\\\"email\\\":\\\"user@example.com\\\"}"Untuk mengatasi batasan ini, gunakan langkah pengayaan dengan fungsi Lambda untuk mengurai konten yang dikodekan ganda dan mengekstrak nilai bersarang. Untuk informasi lebih lanjut tentang pengayaan, lihatPengayaan.