Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menulis skrip canary Node.js
Topik
- Membuat kenari CloudWatch Synthetics dari awal
- Mengemas file kenari Node.js Anda
- Mengubah skrip Puppeteer yang sudah ada untuk digunakan sebagai canary Synthetic
- Variabel-variabel lingkungan
- Mengintegrasikan kenari Anda dengan layanan lain AWS
- Menyempurnakan canary Anda untuk menggunakan alamat IP statis
Membuat kenari CloudWatch Synthetics dari awal
Berikut adalah contoh skrip Canary Synthetic minimal. skrip ini berhasil dijalani, dan mengembalikan rangkaian. Untuk melihat bentuk canary yang gagal, ubah let fail = false;
untuk let fail = true;
.
Anda harus menetapkan fungsi titik masuk untuk skrip canary. Untuk melihat cara mengunggah file ke lokasi Amazon S3 yang ditentukan sebagai ArtifactS3Location
canary, buat file ini di bawah folder /tmp. Setelah skrip berjalan, status lulus/gagal dan metrik durasi dipublikasikan ke CloudWatch dan file di bawah/tmp diunggah ke S3.
const basicCustomEntryPoint = async function () { // Insert your code here // Perform multi-step pass/fail check // Log decisions made and results to /tmp // Be sure to wait for all your code paths to complete // before returning control back to Synthetics. // In that way, your canary will not finish and report success // before your code has finished executing // Throw to fail, return to succeed let fail = false; if (fail) { throw "Failed basicCanary check."; } return "Successfully completed basicCanary checks."; }; exports.handler = async () => { return await basicCustomEntryPoint(); };
Selanjutnya, kita akan memperluas script untuk menggunakan Synthetics logging dan membuat panggilan menggunakan SDK AWS . Untuk tujuan demonstrasi, skrip ini akan menciptakan klien Amazon DynamoDB dan memanggil API listTables DynamoDB. skrip ini mencatat respons terhadap permintaan dan log akan lulus atau gagal bergantung pada permintaan berhasil atau tidak.
const log = require('SyntheticsLogger'); const AWS = require('aws-sdk'); // Require any dependencies that your script needs // Bundle additional files and dependencies into a .zip file with folder structure // nodejs/node_modules/
additional files and folders
const basicCustomEntryPoint = async function () { log.info("Starting DynamoDB:listTables canary."); let dynamodb = new AWS.DynamoDB(); var params = {}; let request = await dynamodb.listTables(params); try { let response = await request.promise(); log.info("listTables response: " + JSON.stringify(response)); } catch (err) { log.error("listTables error: " + JSON.stringify(err), err.stack); throw err; } return "Successfully completed DynamoDB:listTables canary."; }; exports.handler = async () => { return await basicCustomEntryPoint(); };
Mengemas file kenari Node.js Anda
Jika Anda mengunggah skrip canary Anda menggunakan lokasi Amazon S3, file zip Anda harus menyertakan skrip Anda di bawah struktur folder ini: nodejs/node_modules/
.myCanaryFilename.js file
Jika Anda memiliki lebih dari satu file .js
tunggal atau Anda memiliki dependensi yang bergantung pada skrip, Anda dapat menggabungkan semuanya ke dalam satu paketan file ZIP yang memuat struktur folder nodejs/node_modules/
. Jika Anda menggunakan myCanaryFilename.js file and other folders and files
syn-nodejs-puppeteer-3.4
atau yang lebih baru, Anda dapat secara opsional meletakkan file canary Anda di folder lain dan membuat struktur folder Anda seperti ini: nodejs/node_modules/
.myFolder
/myCanaryFilename.js file and other folders and files
Nama handler
Pastikan untuk mengatur titik masuk skrip canary Anda (handler) myCanaryFilename.functionName
agar cocok dengan nama file dari titik masuk skrip Anda. Jika Anda menggunakan runtime yang lebih awal dari syn-nodejs-puppeteer-3.4
, functionName
harus handler
. Jika Anda menggunakan syn-nodejs-puppeteer-3.4
atau yang lebih baru, Anda dapat memilih nama fungsi apa pun sebagai handler. Jika Anda menggunakan syn-nodejs-puppeteer-3.4
atau lebih baru, Anda juga dapat secara opsional menyimpan canary di folder terpisah seperti nodejs/node_modules/myFolder/my_canary_filename
. Jika Anda menyimpannya di folder terpisah, tentukan jalur itu di titik entri skrip Anda, seperti myFolder/my_canary_filename.functionName
.
Mengubah skrip Puppeteer yang sudah ada untuk digunakan sebagai canary Synthetic
Bagian ini menjelaskan cara mengambil skrip Puppeteer dan memodifikasinya untuk berjalan sebagai skrip canary Synthetic. Untuk informasi selengkapnya tentang Puppeteer, silakan lihat API Puppeteer v1.14.0
Kita akan mulai dengan contoh skrip Puppeteer:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://example.com'); await page.screenshot({path: 'example.png'}); await browser.close(); })();
Langkah konversinya adalah sebagai berikut:
Membuat dan mengekspor
handler
fungsi. Penanggung jawab adalah fungsi titik masuk untuk skrip. Jika Anda menggunakan runtime yang lebih awal darisyn-nodejs-puppeteer-3.4
, fungsi handler harus diberi namahandler
. Jika Anda menggunakansyn-nodejs-puppeteer-3.4
atau lebih baru, fungsi tersebut dapat memiliki nama apa pun, tetapi harus nama yang sama yang digunakan dalam skrip. Juga, jika Anda menggunakansyn-nodejs-puppeteer-3.4
atau yang lebih baru, Anda akan dapat menyimpan skrip Anda di bawah folder apa pun dan menentukan folder itu sebagai bagian dari nama handler.const basicPuppeteerExample = async function () {}; exports.handler = async () => { return await basicPuppeteerExample(); };
Gunakan dependensi
Synthetics
.var synthetics = require('Synthetics');
Gunakan fungsi
Synthetics.getPage
untuk mendapatkan objekPage
Puppeteer.const page = await synthetics.getPage();
Objek halaman yang dikembalikan oleh fungsi Synthetics.getPage memiliki peristiwa page.on
request
,response
danrequestfailed
yang terinstrumentasi untuk pembuatan log. Synthetics juga mengatur pembuatan file HAR untuk permintaan dan respons di halaman tersebut, serta menambahkan ARN canary ke header agen-pengguna atas permintaan keluar di halaman tersebut.
skripnya sekarang siap untuk dijalankan sebagai canary Synthetics. Berikut adalah skrip yang diperbarui:
var synthetics = require('Synthetics'); // Synthetics dependency const basicPuppeteerExample = async function () { const page = await synthetics.getPage(); // Get instrumented page from Synthetics await page.goto('https://example.com'); await page.screenshot({path: '/tmp/example.png'}); // Write screenshot to /tmp folder }; exports.handler = async () => { // Exported handler function return await basicPuppeteerExample(); };
Variabel-variabel lingkungan
Anda dapat menggunakan variabel lingkungan saat membuat canary. Hal ini memungkinkan Anda untuk menulis skrip canary tunggal dan kemudian menggunakan skrip tersebut dengan nilai yang berbeda untuk dengan cepat membuat beberapa canary yang memiliki tugas serupa.
Misalnya, andaikan organisasi Anda memiliki titik akhir seperti prod
, dev
, dan pre-release
untuk berbagai tahap pengembangan perangkat lunak Anda, dan Anda perlu membuat canary untuk menguji setiap titik akhir ini. Anda dapat menulis skrip canary tunggal yang menguji perangkat lunak Anda dan kemudian menentukan nilai yang berbeda untuk variabel lingkungan titik akhir ketika Anda membuat masing-masing dari tiga canary. Kemudian, ketika Anda membuat canary, Anda menentukan skrip dan nilai-nilai yang akan digunakan untuk variabel lingkungan.
Nama-nama variabel lingkungan dapat memuat huruf, angka, dan karakter garis bawah. Nama variavel harus dimulai dengan sebuah huruf dan setidaknya dua karakter. Ukuran total variabel lingkungan Anda tidak dapat lebih dari 4 KB. Anda tidak dapat menentukan variabel lingkungan yang dicadangkan Lambda sebagai nama variabel lingkungan Anda. Untuk informasi selengkapnya tentang variabel lingkungan yang dicadangkan, silakan lihat Variabel lingkungan runtime.
penting
Kunci dan nilai variabel lingkungan tidak dienkripsi. Jangan menyimpan informasi sensitif di dalamnya.
Contoh skrip berikut menggunakan dua variabel lingkungan. Skrip ini adalah untuk canary yang memeriksa apakah sebuah halaman web tersedia. Ini menggunakan variabel lingkungan untuk membuat parameter URL yang diperiksa dan tingkat log CloudWatch Synthetics yang digunakannya.
Fungsi berikut menetapkan LogLevel
ke nilai variabel lingkungan LOG_LEVEL
.
synthetics.setLogLevel(process.env.LOG_LEVEL);
Fungsi ini menetapkan URL
ke nilai variabel lingkungan URL
.
const URL = process.env.URL;
Ini adalah skrip yang lengkap. Ketika Anda membuat canary menggunakan skrip ini, Anda menentukan nilai untuk variabel lingkungan LOG_LEVEL
dan URL
.
var synthetics = require('Synthetics'); const log = require('SyntheticsLogger'); const pageLoadEnvironmentVariable = async function () { // Setting the log level (0-3) synthetics.setLogLevel(process.env.LOG_LEVEL); // INSERT URL here const URL = process.env.URL; let page = await synthetics.getPage(); //You can customize the wait condition here. For instance, //using 'networkidle2' may be less restrictive. const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000}); if (!response) { throw "Failed to load page!"; } //Wait for page to render. //Increase or decrease wait time based on endpoint being monitored. await page.waitFor(15000); await synthetics.takeScreenshot('loaded', 'loaded'); let pageTitle = await page.title(); log.info('Page title: ' + pageTitle); log.debug('Environment variable:' + process.env.URL); //If the response status code is not a 2xx success code if (response.status() < 200 || response.status() > 299) { throw "Failed to load page!"; } }; exports.handler = async () => { return await pageLoadEnvironmentVariable(); };
Meneruskan variabel lingkungan ke script Anda
Untuk meneruskan variabel lingkungan ke skrip Anda ketika Anda membuat canary di konsol, tentukan kunci dan nilai-nilai variabel lingkungan di bagian Variabel lingkungan pada konsol. Untuk informasi selengkapnya, lihat Membuat canary.
Untuk meneruskan variabel lingkungan melalui API atau AWS CLI, gunakan EnvironmentVariables
parameter di RunConfig
bagian. Berikut ini adalah contoh AWS CLI perintah yang menciptakan kenari yang menggunakan dua variabel lingkungan dengan kunci Environment
danRegion
.
aws synthetics create-canary --cli-input-json '{ "Name":"nameofCanary", "ExecutionRoleArn":"roleArn", "ArtifactS3Location":"s3://cw-syn-results-123456789012-us-west-2", "Schedule":{ "Expression":"rate(0 minute)", "DurationInSeconds":604800 }, "Code":{ "S3Bucket": "canarycreation", "S3Key": "cwsyn-mycanaryheartbeat-12345678-d1bd-1234-abcd-123456789012-12345678-6a1f-47c3-b291-123456789012.zip", "Handler":"pageLoadBlueprint.handler" }, "RunConfig": { "TimeoutInSeconds":60, "EnvironmentVariables": { "Environment":"Production", "Region": "us-west-1" } }, "SuccessRetentionPeriodInDays":13, "FailureRetentionPeriodInDays":13, "RuntimeVersion":"syn-nodejs-2.0" }'
Mengintegrasikan kenari Anda dengan layanan lain AWS
Semua kenari dapat menggunakan pustaka AWS SDK. Anda dapat menggunakan perpustakaan ini ketika Anda menulis kenari Anda untuk mengintegrasikan kenari dengan layanan lain AWS .
Untuk melakukan hal itu, Anda perlu menambahkan kode berikut ke canary. Untuk contoh-contoh AWS Secrets Manager ini, digunakan sebagai layanan yang terintegrasi dengan kenari.
Impor AWS SDK.
const AWS = require('aws-sdk');
Buat klien untuk AWS layanan yang Anda integrasikan.
const secretsManager = new AWS.SecretsManager();
Gunakan klien untuk melakukan panggilan API ke layanan tersebut.
var params = { SecretId: secretName }; return await secretsManager.getSecretValue(params).promise();
Kode skrip snippet canary berikut menunjukkan contoh integrasi dengan Secrets Manager secara lebih terperinci.
var synthetics = require('Synthetics'); const log = require('SyntheticsLogger'); const AWS = require('aws-sdk'); const secretsManager = new AWS.SecretsManager(); const getSecrets = async (secretName) => { var params = { SecretId: secretName }; return await secretsManager.getSecretValue(params).promise(); } const secretsExample = async function () { let URL = "<URL>"; let page = await synthetics.getPage(); log.info(`Navigating to URL: ${URL}`); const response = await page.goto(URL, {waitUntil: 'domcontentloaded', timeout: 30000}); // Fetch secrets let secrets = await getSecrets("secretname") /** * Use secrets to login. * * Assuming secrets are stored in a JSON format like: * { * "username": "<USERNAME>", * "password": "<PASSWORD>" * } **/ let secretsObj = JSON.parse(secrets.SecretString); await synthetics.executeStep('login', async function () { await page.type(">USERNAME-INPUT-SELECTOR<", secretsObj.username); await page.type(">PASSWORD-INPUT-SELECTOR<", secretsObj.password); await Promise.all([ page.waitForNavigation({ timeout: 30000 }), await page.click(">SUBMIT-BUTTON-SELECTOR<") ]); }); // Verify login was successful await synthetics.executeStep('verify', async function () { await page.waitForXPath(">SELECTOR<", { timeout: 30000 }); }); }; exports.handler = async () => { return await secretsExample(); };
Menyempurnakan canary Anda untuk menggunakan alamat IP statis
Anda dapat menyiapkan canary sehingga menggunakan alamat IP statis.
Untuk memaksa canary menggunakan alamat IP statis
Buat VPC baru. Untuk informasi selengkapnya, silakan lihat Menggunakan DNS dengan VPC Anda.
Membuat gateway internet baru. Untuk informasi selengkapnya, silakan lihat Menambahkan gateway internet ke VPC Anda.
Buat subnet publik di dalam VPC Anda yang baru.
Tambahkan tabel rute baru ke VPC.
Tambahkan rute di tabel rute baru, yang dimulai dari
0.0.0.0/0
ke gateway internet.Kaitkan tabel rute baru dengan subnet publik.
Buat alamat IP elastis. Untuk informasi selengkapnya, silakan lihat Alamat IP elastis.
Buat gateway NAT baru dan tetapkan ke subnet publik dan alamat IP elastis.
Buat subnet privat di dalam VPC.
Tambahkan rute ke tabel rute bawaan VPC, yang dimulai dari
0.0.0.0/0
ke gateway NATBuat canary Anda.