仿¥ã®ããžã¿ã«ã©ã³ãã¹ã±ãŒãã§ã¯ãæé©ãªã¢ããªã±ãŒã·ã§ã³ããã©ãŒãã³ã¹ã確ä¿ããããšãéåžžã«éèŠã§ãããAmazon CloudWatch Synthetics ã¯ãŠã§ãã¢ããªã±ãŒã·ã§ã³ãš API ã®ããã¢ã¯ãã£ããªãã¹ããå¯èœã«ããŸãããã®ããã°ã§ã¯ãèªå·±çœ²åèšŒææžãå©çšããŠç£èŠæ©èœã匷åãããå Žåããšã³ããã€ã³ãã®èªå·±çœ²åèšŒææžããµããŒãããããã« Canary ã®ãœãŒã¹ã³ãŒãã倿Žããæ¹æ³ãé ã远ã£ãŠèª¬æããŸããæå€§ã®å©ç¹ã¯ããã®æ¹æ³ã§ã¯èªèšŒããã»ã¹ã倿Žããå¿
èŠããªãããšã§ãã Amazon CloudWatch Synthetics Canary ãããŒãããŒããã«ãŒããªã³ããšãšãã«äœ¿çšããŠãèªå·±çœ²åèšŒææžã«äŸåããã¢ããªã±ãŒã·ã§ã³ãã¢ãã¿ãªã³ã°ããæ¹æ³ã説æããŸããèªå·±çœ²åèšŒææžãšã¯ã(å
¬åŒæ©é¢ã«) æ¿èªãããŠããªãä¿¡é Œã§ãã第äžè
èªèšŒå±ïŒCAïŒã«ãã£ãŠçºè¡ããã³çœ²åãããèšŒææžã§ãã ããã«ãAPI ãç£èŠããä»ã®æ¹æ³ã«ã€ããŠèª¬æããŠãã以åã®ããã°ã確èªããããšããå§ãããŸãã Multi-step API monitoring using Amazon CloudWatch Synthetics ãšããã¿ã€ãã«ã®ããã°ã§ã¯ãAmazon CloudWatch Synthetics ã¹ã¯ãªãããäœæããŠããã«ãã¹ããã API æ€èšŒãå®è¡ããAPI ã®æ©èœæ§ãšå®å®æ§ã確ä¿ããããã®è©³çŽ°ãªæé ã玹ä»ããŠããŸããããã«ã2 ã€ç®ã®ããã° How to validate authentication using Amazon CloudWatch Synthetics â Part 2 ã§ã¯ãSynthetic ãã«ãŒããªã³ããæŽæ°ããŠããµãŒããŒãšã¯ã©ã€ã¢ã³ãã®äž¡æ¹ãçžäºèªèšŒ (mTLS) ã®ããã«ããžã¿ã«èšŒææžã®æç€ºããå¿
èŠã®ããã¢ããªã±ãŒã·ã§ã³ãã¢ãã¿ãªã³ã°ããããã®æ¹æ³ãé ã远ã£ãŠèª¬æããŠããŸãããããã®ãªãœãŒã¹ã¯çè§£ãè£å®ããå
æ¬çãªç£èŠæŠç¥ãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸãã ãœãªã¥ãŒã·ã§ã³æŠèŠ ãã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãæ¢åã®ãã«ãŒããªã³ãã«åºã¥ããŠããŒãããŒãã¢ãã¿ãŒ Canary ãäœæããæäŸããããã«ãŒããªã³ãã«èªå·±çœ²åèšŒææžãæ¿å
¥ããæé ã瀺ããŸããããã«ããããã«ãŒããªã³ããæäŸããæ©èœãæ¡åŒµã§ããŸãã Canary ã®äœæ CloudWatch Synthetics ã§ã¯ãããã«äœ¿çšã§ãããã«ãŒããªã³ãã¹ã¯ãªãããå©çšã§ããŸãããã ããèšŒææžã§èªèšŒããã«ã¯ãã³ã³ãœãŒã«ã®ãšãã£ã¿ãŒã䜿çšããŠã³ãŒãã¹ããããã远å ããå¿
èŠããããŸãã CloudWatch Synthetics ãã©ã®ããã«èªèšŒãåŠçããããã·ãã¥ã¬ãŒãããããã«ã self-signed.badssl.com ãŠã§ããµã€ãã䜿çšããŸããç¬èªã® HTTP ãšã³ããã€ã³ãã䜿çšããŠåãåºåãã·ãã¥ã¬ãŒãããããšãã§ããŸããèšŒææžããŸã 远å ãããŠããªããããæåã®åŒã³åºãã§ã¯å€±æå¿çãè¿ãããŸãããã ãããã®ãšã©ãŒã¯æ¬¡ã®æé ã§ä¿®æ£ãããŸãã ããŒãããŒããã«ãŒããªã³ãã¹ã¯ãªããã«åºã¥ã㊠Canary ãäœæããæé CloudWatch ã³ã³ãœãŒã« ã® ãSyntheticsãã¡ãã¥ãŒãéããŸãã Canary ãäœæ ãéžæããŸãã èšèšå³ã®ãªã¹ããã ããŒãããŒãã®ã¢ãã¿ãªã³ã° ãéžæããŸãã åå ã« Canary ã®ååãå
¥åããŸããããšãã°ããhttps-selfsigned-testããšå
¥åããŸãã ã¢ããªã±ãŒã·ã§ã³ ãŸã㯠ãšã³ããã€ã³ã URL ã« ã https://self-signed.badssl.com/ ã ãå
¥åããŸãã ãã®ä»ã®èšå®ã¯ãã¹ãŠããã©ã«ãã®ãŸãŸã«ããŠãã ãããå¿
èŠãªæš©éãæã€ IAM ããŒã«ãèªåçã«äœæãããããã«ãcw-syn-results-accountID-regionã ãšããååã®ãã±ãããäœæãããŸãããã±ãããã¢ã«ãŠã³ãã«ãã§ã«ååšããå Žåã¯ããcw-syn-resultsã ãšããååãæ€çŽ¢ããããç¬èªã®ååãäœæã§ããŸãã詳现ã«ã€ããŠã¯ã Canary ãäœæãã ãåç
§ããŠãã ããã ãCanary ãäœæããéžæããŸããCanary ãäœæããããšãå³ 1 ã«ç€ºãããã«ãCanary ã®ãªã¹ãã«è¡šç€ºãããŸããCanary ã®ããŒãããŒãã¢ãã¿ãŒãã«ãŒããªã³ãã®äœ¿ç𿹿³ã«ã€ããŠã¯ãAmazon CloudWatch ãŠãŒã¶ãŒã¬ã€ã ã® ããŒãããŒãã®ã¢ãã¿ãŒãªã³ã° ãåç
§ããŠãã ããã å³ 1. CloudWatch ã³ã³ãœãŒã«ã® Canary ããŒãž ã¬ããŒãã®ç¢ºèª Canary ã¬ããŒãã«ã¯ããã¹ãŠã®ã¹ããããšçµæã衚瀺ãããŸãããã®å ŽåãCanary ã¯å³ 2 ã«ç€ºãããã« ERR_CERT_AUTHORITY_INVALID ãšã©ãŒãè¿ããŸããããšã³ããã€ã³ãã¯ä¿¡é Œã§ãã CA ã«ãã£ãŠçºè¡ãããŠããªãèšŒææžã䜿çšããŠãããCanary ã¯ä¿¡é ŒãããèªèšŒå±ã«å¯ŸããŠèªå·±çœ²åèšŒææžã®ä¿¡é Œæ§ãæ€èšŒã§ããªãããããã®ãšã©ãŒã¯äºæ³ããããã®ã§ãã å³ 2. HTTP-steps-test ã¬ããŒãã ERR_CERT_AUTHORITY_INVALID ãšãããšã©ãŒã§å€±æ èšŒææžã®è©³çްãããŠã³ããŒã èªå·±çœ²åèšŒææžã«é¢ããæ€èšŒã®åé¡ã«å¯ŸåŠããããã«ãbadsslã®Webãµã€ãããå¿
èŠãªèšŒææžãããŠã³ããŒãã§ããŸãããã®ããŠã³ããŒããããèšŒææžã¯ä¿¡é Œã確ç«ããç®çã§äœ¿çšããã self-signed.badssl.com ãšã³ããã€ã³ãã«å¯ŸããŠè¡ããã API ãªã¯ãšã¹ããèªèšŒããããã« Canary ã«ãã£ãŠäœ¿çšãããŸãã以äžã®ã¹ãããã¯ãAWS CloudShell äžã§ CLI ã³ãã³ãã䜿çšããŠããããå®çŸããæ¹æ³ã瀺ããŠããŸããããããã®èšŒææžã¯ãã©ãŠã¶ã䜿çšã㊠badssl ãŠã§ããµã€ãããæåã§ããŠã³ããŒãããããšãã§ããŸãã Note: çºè¡å
ãä¿¡é Œã§ããããšã確å®ã§ãªãéããèªå·±çœ²åèšŒææžã¯ãå§ãããŸããã badssl.com ãããããªãã¯èšŒææžãããŠã³ããŒã ãã®æé ã§ã¯ãAWS ãªãœãŒã¹ã®å®å
šãªç®¡çãæ¢çŽ¢ãæäœã容æã«ãããã©ãŠã¶ããŒã¹ã®ã·ã§ã«ã§ãã AWS CloudShell ã䜿çšããŸãã以äžã®ã¹ã¯ãªãããå®è¡ããã«ã¯ CloudShell ããå§ãããŸãããã ããåãåºåã«ã¯ç¬èªã®ã³ãã³ãã©ã€ã³ã䜿çšããããšãã§ããŸãã self-signed.badssl.com ãã.pem ãã¡ã€ã«ãããŠã³ããŒãããã«ã¯ã以äžã®æé ã«åŸããŸãã CloudShell ã³ã³ãœãŒã«ãéããŸãã ç°å¢ãäœæãããã®ãåŸ
ã¡ãŸãã 以äžã®ã¹ã¯ãªãããã³ããŒããŠãAWS CloudShell ã«ãã£ãŠäœæããã bash ã³ã³ãœãŒã«ã«è²Œãä»ããŸãã # Install openssl if you don't have that installed # Ubuntu users -> sudo apt-get install openssl sudo yum install openssl -y # Download the self-signed.badssl.com certificate openssl s_client -showcerts -connect self-signed.badssl.com:443 -servername self-signed.badssl.com </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' | awk '{printf "%s%s", (NR>1 ? "\\n" : ""), $0} END {print ""}' > self-signed.pem # Get the certificate content to be pasted on the canary code cat self-signed.pem ã貌ãä»ãããéžæããŸãã å³ 3. è€æ°è¡ã®ããã¹ãã貌ãä»ããããã® CloudShell ãããã¢ãã äžèšã®ã¹ã¯ãªããã¯èšŒææžãå«ãããã¹ããçæããŸããæ¬¡ã®ã¹ãããã§äœ¿çšããããã ââBEGIN CERTIFICATEââ ã§å§ãŸã ââEND CERTIFICATEââ ã§çµããå
容ãã³ããŒããŸãã Canary ã¹ã¯ãªãããç·šéããŠèšŒææžã远å èšŒææžãã€ã³ããŒãããã«ã¯ãäœæãã Canary ã«ã¢ã¯ã»ã¹ããå
ã»ã©ã³ããŒããèšŒææžã®åºåãå«ã倿°ã远å ããå¿
èŠããããŸãã ã³ãŒããç·šéããã«ã¯ãæ¬¡ã®æé ã«åŸããŸãã CloudWatch ã³ã³ãœãŒã« ã® Synthetics ã¡ãã¥ãŒãéããŸãã äœæãã Canary ãéžæããŠãã ãããããšãã°ã https-selfsigned-test ã§ãã ã¢ã¯ã·ã§ã³ ãéžæãã ç·šé ãéžæããŸãã ã¹ã¯ãªãããšãã£ã¿ ã®ããã¯ã¹ã䜿çšããŠãã¹ã¯ãªããã®äžéšã§ https ããã±ãŒãžãã€ã³ããŒãããŸãããã®ããã±ãŒãžã«ãããã¹ã¯ãªããã¯èšŒææžã«å©çšããããã«ãããã³ã«ã®èšå®ã調æŽã§ããŸãã const https = require('https'); âpage.goto()â 颿°ã䜿çšããŠãšã³ããã€ã³ãã«ã¢ã¯ã»ã¹ããåã«ã以äžã®ã³ãŒããããã¯ãæ¿å
¥ããŠãã ããããã«ãŒããªã³ãã®å Žåããã㯠éåæé¢æ° loadBlueprint ã® âconst sanitizedUrlâ è¡ãš âconst response = await page.goto...â è¡ã®éã«ãããŸãã await page.setRequestInterception(true); const cert = '<YOUR_CERTIFICATE_HERE>' log.info("Injecting request with self-signed certificate."); page.on("request", (interceptedRequest) => { const options = { method: interceptedRequest.method(), headers: interceptedRequest.headers(), body: interceptedRequest.postData(), ca: cert, cert: cert, }; const request = https .request(interceptedRequest.url(), options, function (response) { response.on("data", function (data) { interceptedRequest.respond({ status: response.statusCode, contentType: response.headers["content-type"], headers: response.headers, body: data, }); }); }) .on("error", function (err) { console.error("Unable to call %s", options.uri, err); return interceptedRequest.abort("connectionrefused"); }); request.end(); }); Note: ãã®ã³ãŒãã¯ãCanary ãããšã³ããã€ã³ããžã®ãªã¯ãšã¹ããã€ã³ã¿ãŒã»ããããã¢ããããŒãããèšŒææžãä¿¡é Œã§ããèªèšŒå±ãšããŠå«ããããã«ãªã¯ãšã¹ããªãã·ã§ã³ã倿ŽããŸãã äŸãã°ãã³ãŒãã®å
šæã¯ä»¥äžã®ããã«ãªããŸãã const { URL } = require('url'); const synthetics = require('Synthetics'); const log = require('SyntheticsLogger'); const syntheticsConfiguration = synthetics.getConfiguration(); const syntheticsLogHelper = require('SyntheticsLogHelper'); const https = require('https'); const loadBlueprint = async function () { const urls = ['https://self-signed.badssl.com/']; // Set screenshot option const takeScreenshot = true; /* Disabling default step screen shots taken during Synthetics.executeStep() calls * Step will be used to publish metrics on time taken to load dom content but * Screenshots will be taken outside the executeStep to allow for page to completely load with domcontentloaded * You can change it to load, networkidle0, networkidle2 depending on what works best for you. */ syntheticsConfiguration.disableStepScreenshots(); syntheticsConfiguration.setConfig({ continueOnStepFailure: true, includeRequestHeaders: true, // Enable if headers should be displayed in HAR includeResponseHeaders: true, // Enable if headers should be displayed in HAR restrictedHeaders: [], // Value of these headers will be redacted from logs and reports restrictedUrlParameters: [] // Values of these url parameters will be redacted from logs and reports }); let page = await synthetics.getPage(); await certRequestIntercept(page) for (const url of urls) { await loadUrl(page, url, takeScreenshot); } }; const certRequestIntercept = async function(page) { await page.setRequestInterception(true); const cert = '<YOUR_CERTIFICATE_HERE>' log.info("Injecting request with self-signed certificate."); page.on("request", (interceptedRequest) => { const options = { method: interceptedRequest.method(), headers: interceptedRequest.headers(), body: interceptedRequest.postData(), ca: cert, cert: cert, }; const request = https.request(interceptedRequest.url(), options, function (response) { response.on("data", function (data) { interceptedRequest.respond({ status: response.statusCode, contentType: response.headers["content-type"], headers: response.headers, body: data, }); }); }).on("error", function (err) { console.error("Unable to call %s", options.uri, err); return interceptedRequest.abort("connectionrefused"); }); request.end(); }); } // Reset the page in-between const resetPage = async function(page) { try { await page.goto('about:blank',{waitUntil: ['load', 'networkidle0'], timeout: 30000} ); } catch (e) { synthetics.addExecutionError('Unable to open a blank page. ', e); } } const loadUrl = async function (page, url, takeScreenshot) { let stepName = null; let domcontentloaded = false; try { stepName = new URL(url).hostname; } catch (e) { const errorString = `Error parsing url: ${url}. ${e}`; log.error(errorString); /* If we fail to parse the URL, don't emit a metric with a stepName based on it. It may not be a legal CloudWatch metric dimension name and we may not have an alarms setup on the malformed URL stepName. Instead, fail this step which will show up in the logs and will fail the overall canary and alarm on the overall canary success rate. */ throw e; } await synthetics.executeStep(stepName, async function () { const sanitizedUrl = syntheticsLogHelper.getSanitizedUrl(url); /* You can customize the wait condition here. For instance, using 'networkidle2' or 'networkidle0' to load page completely. networkidle0: Navigation is successful when the page has had no network requests for half a second. This might never happen if page is constantly loading multiple resources. networkidle2: Navigation is successful when the page has no more then 2 network requests for half a second. domcontentloaded: It's fired as soon as the page DOM has been loaded, without waiting for resources to finish loading. If needed add explicit wait with await new Promise(r => setTimeout(r, milliseconds)) */ const response = await page.goto(url, { waitUntil: ['domcontentloaded'], timeout: 30000}); if (response) { domcontentloaded = true; const status = response.status(); const statusText = response.statusText(); logResponseString = `Response from url: ${sanitizedUrl} Status: ${status} Status Text: ${statusText}`; //If the response status code is not a 2xx success code if (response.status() < 200 || response.status() > 299) { throw new Error(`Failed to load url: ${sanitizedUrl} ${response.status()} ${response.statusText()}`); } } else { const logNoResponseString = `No response returned for url: ${sanitizedUrl}`; log.error(logNoResponseString); throw new Error(logNoResponseString); } }); // Wait for 15 seconds to let page load fully before taking screenshot. if (domcontentloaded && takeScreenshot) { await new Promise(r => setTimeout(r, 15000)); await synthetics.takeScreenshot(stepName, 'loaded'); await resetPage(page); } }; const urls = []; exports.handler = async () => { return await loadBlueprint(); }; å
ã»ã©è²Œãä»ããã³ãŒãã® <YOUR_CERTIFICATE_HERE> ã眮ãæããŠãèšŒææžã®å
容ã远å ããŸãã const cert = '<YOUR_CERTIFICATE_HERE>' ä¿å ãéžæããŸãã èšŒææžã®ããŒãã³ãŒãã£ã³ã°ã¯ãã¹ããã©ã¯ãã£ã¹ã§ã¯ãããŸãããããã®ããã°ã§ã¯æé ãå¹çåããããã«ãã®ã¢ãããŒããæ¡çšããŸãããå ããŠãä»åã®èšŒææžã¯å
¬éãããŠããããããªã¹ã¯ã¯äœããªããŸãããã¹ããã©ã¯ãã£ã¹ã«åŸããç°å¢ãžãããã€ããéã®ãªã¹ã¯ã軜æžã«ã¯ã How to validate authentication using Amazon CloudWatch Synthetics â Part 2 ã®èª¬æã®ããã«ãAWS Secrets Manager ã䜿çšããããšã§ãã·ãŒã¯ã¬ãããå®å
šã«ä¿åã§ããŸãã ã³ãŒãã倿Žããããä¿åã㊠Canary ãåã³å®è¡ãããã®ãåŸ
ã¡ãŸããCanary ã®å®è¡ ã æå ããã¹ãããã®ã¿ãã§ãªã¯ãšã¹ãã¹ããŒã¿ã¹ã æå ãšè¡šç€ºãããã¯ãã§ãã å³ 4: https-selfsigne-test ã®ã¹ããŒã¿ã¹ããæåããšè¡šç€ºããã Synthetics ã®äœ¿ç𿹿³ã«ãã§ã«æ
£ããŠãããŠãŒã¶ãŒåãã«ãèšŒææžãå«ã Canary ã¹ã¯ãªããã ZIP ãã¡ã€ã«ã«ãã³ãã«ã§ããé«åºŠãªãªãã·ã§ã³ãçšæãããŠããŸãããã®ã¢ãããŒãã«ã€ããŠã¯ã Node.js Canary ã¹ã¯ãªããã®èšè¿° ãš Python Canary ã¹ã¯ãªããã®èšè¿° ãšããããã¥ã¡ã³ãã§èª¬æãããŠãããã·ãŒã ã¬ã¹ãªå®è£
ã®ããã®å
æ¬çãªã¬ã€ãã³ã¹ãæäŸãããŠããŸãã ã¯ãªãŒã³ã¢ãã Canary ãåé€ãããšå
ã«æ»ãããšã¯ã§ãããé¢é£ããããŒã¿ãšèšå®ã¯ãã¹ãŠå€±ãããããšã«æ³šæããŠãã ãããåé€ãç¶è¡ããåã«ãå¿
èŠãªããã¯ã¢ããããã¹ãŠäœæããããé¢é£ããããŒã¿ããã¹ãŠæœåºããããšã確èªããŠãã ããã CloudWatch Synthetics Canary ãåé€ããã«ã¯ã以äžã®æé ã«åŸã£ãŠãã ããã CloudWatch ã³ã³ãœãŒã« ã® Synthetics ã¡ãã¥ãŒãéããŸãã äžèšã§äœæãã Canary ãéžæããŠãã ãããããšãã°ã https-selfsigned-test ã§ãã ã¢ã¯ã·ã§ã³ ãéžæãã äžæ¢ ãéžæããŸãã Canary ã®ç¶æ
ã 忢 ã«å€ãããŸã§åŸ
ã£ãŠãã ããã ããäžåºŠ ã¢ã¯ã·ã§ã³ ãéžæãã åé€ ãéžæããŸãã Canary ã䜿çšãã ããŒã« ãš ããŒã«ããªã·ãŒ ãªã©ãåé€ãããªãœãŒã¹ãéžæããŸãã Canary ã«ãã£ãŠäœæããããªãœãŒã¹ãåé€ããã«ã¯ã åé€ ãéžæããŸãã ãã®ã¯ãŒã¯ã·ã§ããã§äœæãããªãœãŒã¹ãåé€ããããšã確èªããã«ã¯ããã£ãŒã«ãã« Delete ãšãããã¬ãŒãºãå
¥åããŸãã ç¢ºèª ãéžæããŸãã ã³ã³ãœãŒã«äžã§ãéžæãããªãœãŒã¹ãåé€ãããCanary ãæ£åžžã«åé€ãããããšã衚瀺ãããŸãã å³ 5. Canary ãåé€ãããããšã瀺ã Synthetics ããŒãž çµè« ãã®ããã°ã§ã¯ãCloudWatch Synthetics ã§èªå·±çœ²åèšŒææžãå©çšããæ¹æ³ã«ã€ããŠèª¬æããŸãããããã«ãããèšŒææžãä¿¡é Œã§ãããµãŒãããŒã㣠CA ã«ãã£ãŠçœ²åãããŠããªããŠãããã«ãŒããªã³ãã®æ©èœãæ¡åŒµã㊠API ã«æ¥ç¶ã§ããããã«ãªããŸããããããã®ç¥èŠãæŠåšã«ãèªä¿¡ãæã£ãŠèªå·±çœ²åèšŒææžãèªåã®ãããžã§ã¯ãã«å®è£
ã§ããŸãã ãã®æ©èœããã®ä»ã®ãã¹ãŠã®æ©èœã®äœ¿ç𿹿³ã®è©³çްã«ã€ããŠã¯ã CloudWatch Synthetics ã®ããã¥ã¡ã³ã ãã芧ãã ããããŸããSynthetics ã® AWS Command Line Interface (CLI) ããã¥ã¡ã³ã㯠ãã¡ã ã«ãããŸãã èè
ã«ã€ã㊠Mario Jorge Salheb Leitao Mario Leitao ã¯ãã·ãããŒãæ ç¹ãšãã AWS Managed Services (AMS) ããŒã ã® Senior Cloud Architect ã§ããæè¡ã¬ã€ãã³ã¹ãæäŸããã客æ§ã AWS ã§æåã§ããããã«ãè²»çšå¯Ÿå¹æãé«ãå¹ççãªãœãªã¥ãŒã·ã§ã³ãèšèšããã³æ§ç¯ããŠããŸããCloud Architect ãšããŠåãåã¯ãã¢ã€ã«ã©ã³ãã®ãããªã³ã§ Network Development Engineer ãšããŠåããŠããŸããã Matheus Canela Matheus ã¯ãAmazon Web Services ã® Solutions Architect ãšããŠãããžã¿ã«ãã€ãã£ãäŒæ¥ã«ãã¯ãããžãŒãã©ãããã©ãŒã ã®å€é©ã«ã€ããŠå©èšãããã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠããããã¬ãã«ã®ãšã³ãžãã¢ãç®æšãéæã§ããããæ¯æŽããŠããŸããAWS ã«å
¥ç€ŸããåãMatheus ã¯ã·ãããŒãæ ç¹ãšãã Premier Consulting Partner ã§ãã CMD Solutions ã§ Senior DevOps Consultant ãåããŠããŸãããMatheus ã¯éçºè
ããã³ã»ãã¥ãªãã£ã¹ãã·ã£ãªã¹ããšããŠãåããŠããŸãããã³ãã¥ããã£ãæ¯æŽããããšã圌ã®DNAã§ããããã.NET Meetups ãéå¬ããIT.BR ã³ãã¥ããã£ãæ¯æŽããŠããã©ãžã«ãããªãŒã¹ãã©ãªã¢ã«ç§»äœãããšã³ãžãã¢ãæ¯æŽããŠããŸãã Edgar Yu Edgar 㯠AWS ã® CloudWatch Synthetics ããŒã ã® Software Development Engineer ã§ãã圌ã®çŸåšã®çŠç¹ã¯ã顧客ãããå€ãã®ããã©ãŒãã³ã¹ããŒã¿ãåéãããŠã§ãã¢ããªã±ãŒã·ã§ã³ãããé©åã«ç£èŠã§ããããã«ãããœãããŠã§ã¢ã®æ§ç¯ãšæ¹åã«ãããŸããAWS 以å€ã§ã¯ã圌ã¯é£äºã楜ããã§ããŸãã 翻蚳ã¯ãã¯ãã«ã«ã¢ã«ãŠã³ããããŒãžã£ãŒã®æ¥å¹³ãæ
åœããŸãããåæã¯ ãã¡ã ã§ãã