{"id":4354,"date":"2022-04-15T13:58:00","date_gmt":"2022-04-15T11:58:00","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=4354"},"modified":"2022-04-15T12:14:39","modified_gmt":"2022-04-15T10:14:39","slug":"step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/","title":{"rendered":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript"},"content":{"rendered":"\n

Introduzione<\/h2>\n\n\n\n

L’espressione “infrastructure as Code” (IaC) negli ultimi tempi \u00e8 stata una delle keyword pi\u00f9 popolari in ambito cloud.<\/p>\n\n\n\n

Questo ha reso molte implementazioni infrastrutturali molto pi\u00f9 riutilizzabili, versionabili e mantenibili.<\/p>\n\n\n\n

Negli ultimi tempi sono nati parecchi standard e implementazioni che usano questo concetto.<\/p>\n\n\n\n

Alcuni di questi sono pi\u00f9 orientati ai sistemisti, e solitamente sono basati su file di configurazione, alcuni esempi sono Terraform o AWS SAM.<\/p>\n\n\n\n

Altri strumenti sono pi\u00f9 orientati ai developer e si basano su linguaggi di programmazione come Typescript, Java o Python.<\/p>\n\n\n\n

Lo strumento ufficiale orientato agli sviluppatori, per implementare un’infrastruttura usando il concetto di IaC, si chiama Cloud Development Kit (CDK) ed \u00e8 sviluppato da AWS.<\/p>\n\n\n\n

Noi lo abbiamo usato parecchio, per diversi casi d’uso, vorremmo quindi condividere una delle nostre esperienze in questo articolo.<\/p>\n\n\n\n

Il linguaggio di programmazione: Typescript<\/h2>\n\n\n\n

AWS CDK \u00e8 disponibile per diversi linguaggi di programmazione, noi abbiamo scelto di usare Typescript, perch\u00e8 consente allo sviluppatore di usare l’elasticit\u00e0 portata da Javascript, unita ad una type safety simile a Java.<\/p>\n\n\n\n

Queste caratteristiche sono molto utili per mantenere brevi i tempi di sviluppo, senza sacrificare i vantaggi portati da un linguaggio type-oriented, che facilita l’implementazione di design pattern orientati agli oggetti.<\/p>\n\n\n\n

Struttura di progetto<\/h2>\n\n\n\n

Una cosa che ci ha colpito fin da subito di CDK \u00e8 la sua struttura modulare.<\/p>\n\n\n\n

Ogni servizio AWS \u00e8 rappresentato da un modulo Node.JS, quindi identificabile come una dipendenza all’interno del progetto.<\/p>\n\n\n\n

Questo ci consente di mantenere il progetto leggero e senza import inutili.<\/p>\n\n\n\n

Di solito, noi strutturiamo il nostro progetto CDK dividendo lo stack primario in vari nested stack, usando un criterio Domain driven.<\/p>\n\n\n\n

Livelli di astrazione<\/h2>\n\n\n\n

AWS CDK fornisce diversi livelli di astrazione che consentono di creare le risorse AWS.<\/p>\n\n\n\n

Noi abbiamo identificato 3 livelli di astrazione:<\/p>\n\n\n\n

1 – CloudFormation Plain resources:<\/strong><\/h4>\n\n\n\n

Tipicamente possiamo identificarle dalla radice del nome: “Cfn”. Questi elementi danno la possibilit\u00e0 di personalizzare le tue risorse nello stesso modo in cui lo fai in un template Cloudformation.<\/p>\n\n\n\n

(esempio: CfnStateMachineProps<\/a> )<\/p>\n\n\n\n

2 – Attributes abstraction resources:<\/strong><\/h4>\n\n\n\n

Questi costrutti sono i nostri preferiti, sono in grado di astrarre e semplificare la configurazione delle risorse, senza perderne il controllo.<\/p>\n\n\n\n

(esempio: StateMachine<\/a>)<\/p>\n\n\n\n

3 – Group of resource abstraction:<\/strong><\/h4>\n\n\n\n

Questi costrutti possono essere molto utili, se il tuo requisito non prevede una personalizzazione avanzata delle tue risorse, poich\u00e8 viene fornita un unica configurazione per creare gruppi di elementi, gi\u00e0 integrati fra loro.<\/p>\n\n\n\n

Noi raccomandiamo di leggere molto attentamente la documentazione prima di procedere con l’implementazione di questi costrutti, per essere sicuri che le risorse create vi servano realmente.<\/p>\n\n\n\n

(esempio: FargateService<\/a>)<\/p>\n\n\n\n

Un caso di successo con StepFunction<\/h2>\n\n\n\n

AWS StepFunction \u00e8 un servizio che abilita alla creazione di macchine a stati in Cloud.<\/p>\n\n\n\n

Noi lo abbiamo trovato molto comodo e ben implementato all’interno di AWS CDK.<\/p>\n\n\n\n

Ogni step della macchina a stati ha un input e un output e pu\u00f2 essere di diverso tipo:<\/p>\n\n\n\n

  • Pass: <\/strong>Il valore di input viene forwardato in output, pu\u00f2 essere utile a scopo di debug<\/li>
  • Task: <\/strong>Rappresenta un operazione da eseguire, questa tipologia di stato \u00e8 integrabile direttamente con una LambdaInvoke, oppure si pu\u00f2 fare forward dei parametri specificati verso un altro servizio AWS<\/li>
  • Choice: <\/strong>\u00c8 possibile configurare una condizione che permette di cambiare il flusso della macchina a stati in base all’output dello stato precedente<\/li>
  • Wait: <\/strong>\u00c8 possibile sospendere la macchina per un tempo specificato<\/li>
  • Succeed: <\/strong>Determina la fine positiva del nostro flusso<\/li>
  • Fail: <\/strong>Determina la fine negativa del nostro flusso<\/li>
  • Parallel: <\/strong>Permette la creazione di un set di stati in parallelo utilizzando un singolo input. <\/li>
  • Map: <\/strong>Permette l’esecuzione di un set di stati per ogni elemento di una lista di input<\/li><\/ul>\n\n\n\n

    Per creare e far funzionare una macchina a stati, Amazon ha creato un linguaggio basato su JSON, Amazon States Languages.<\/p>\n\n\n\n

    Questo permette agli sviluppatori di creare e personalizzare gli stati, in modo da connetterli a vicenda.<\/p>\n\n\n\n

    Questo linguaggio \u00e8 composto da un macro oggetto JSON che contiene questi attributi:<\/p>\n\n\n\n

    Comment<\/strong><\/h4>\n\n\n\n

    Questo campo \u00e8 usato come i commenti nei linguaggi di programmazione tradizionali.<\/p>\n\n\n\n

    \u00c8 utilizzato per riassumere il comportamento della macchina a stati, non \u00e8 un campo obbligatorio.<\/p>\n\n\n\n

    TimeoutSeconds<\/strong><\/h4>\n\n\n\n

    Questo campo non \u00e8 obbligatorio e definisce il numero massimo di secondi che un esecuzione di una macchina a stati pu\u00f2 impiegare a finire.<\/p>\n\n\n\n

    Se questo limite viene violato, lo stato della macchina diventa Fail.<\/p>\n\n\n\n

    Version<\/strong><\/h4>\n\n\n\n

    Questo campo non \u00e8 obbligatorio, definisce la versione del Amazon State Language utilizzato (il default \u00e8 “1.0”).<\/p>\n\n\n\n

    States<\/strong><\/h4>\n\n\n\n

    Questo campo \u00e8 obbligatorio, \u00e8 un oggetto JSON, e viene usato per descrivere gli stati che compongono la macchina a stati.<\/p>\n\n\n\n

    Ogni chiave di quell’oggetto rappresenta il nome dello stato.<\/p>\n\n\n\n

    Ecco un esempio:<\/p>\n\n\n\n

    {\n    \"State1\" : {\n    },\n\n    \"State2\" : {\n    },\n    ...\n}\n<\/code><\/pre>\n\n\n\n

    StartAt<\/strong><\/h4>\n\n\n\n

    Questo attributo \u00e8 obbligatorio e definisce il primo step della macchina a stati da invocare.<\/p>\n\n\n\n

    Per creare una StepFunction usando le tecnologie IaC tramite strumenti AWS ufficiali, puoi usare il servizio Cloudformation.<\/p>\n\n\n\n

    Qui sotto troviamo un esempio di implementazione di una StepFunction in CloudFormation.<\/p>\n\n\n\n

    <\/p>\n\n\n\n

    \"\"<\/figure><\/div>\n\n\n\n

    <\/p>\n\n\n\n

    Come puoi notare, un semplice HelloWorld pu\u00f2 essere molto verboso e non semplice da configurare con un template Cloudformation, questo succede perch\u00e8 il JSON state language non \u00e8 ben integrato con il nostro YAML Template.<\/p>\n\n\n\n

    In uno dei nostri casi d’uso, avevamo bisogno di sviluppare una macchina che da una serie di operazioni multiple, eseguite in parallelo, riuscisse ad elaborare un report al termine di tutte le computazioni.<\/p>\n\n\n\n

    Con un template standard, questo pu\u00f2 diventare difficile da implementare, cos\u00ec abbiamo provato a farlo usando CDK.<\/p>\n\n\n\n

    Abbiamo scoperto che il costrutto relativo a StepFunction, oltre a fornire un modo semplice per integrare le risorse esterne con la tua macchina a stati, \u00e8 in grado di fornire un ulteriore astrazione per lo State Language visto in precedenza.<\/p>\n\n\n\n

    Grazie a questo, sviluppare un flusso diventa molto pi\u00f9 intuitivo e mantenibile.<\/p>\n\n\n\n

    <\/p>\n\n\n\n

    \"\"<\/figure><\/div>\n\n\n\n

    <\/p>\n\n\n\n

    AWS CDK \u00e8 indubbiamente uno strumento molto potente. Ad ogni modo, \u00e8 importante tenere a mente che, prima di avvicinarsi ai costruttori di CDK, \u00e8 necessario padroneggiare alcune conoscenze di programmazione fondamentali come l’OOP (Programmazione orientata agli oggetti).<\/p>\n\n\n\n

    Per concludere<\/h2>\n\n\n\n

    In questo articolo abbiamo condiviso un caso d’uso reale, dove AWS CDK pu\u00f2 essere molto utile, insieme all’applicazione di qualche nostra best practice interna.<\/p>\n\n\n\n

    Spero che questa panoramica sul modo CDK e Step Function vi sia stata utile. Diteci cosa ne pensate!<\/p>\n\n\n\n

    Ci vediamo tra 14 giorni su Proud2beCloud<\/strong> con un nuovo articolo!<\/p>\n","protected":false},"excerpt":{"rendered":"

    Introduzione L’espressione “infrastructure as Code” (IaC) negli ultimi tempi \u00e8 stata una delle keyword pi\u00f9 popolari in ambito cloud. Questo […]<\/p>\n","protected":false},"author":10,"featured_media":4371,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[477],"tags":[488,253,391],"yoast_head":"\nStep Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript - Proud2beCloud Blog<\/title>\n<meta name=\"description\" content=\"In questo articolo vedremo come utilizzare AWS Step Functions\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript\" \/>\n<meta property=\"og:description\" content=\"Using CDK with Typescript to implement a step function with AWS Step Functions.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/\" \/>\n<meta property=\"og:site_name\" content=\"Proud2beCloud Blog\" \/>\n<meta property=\"article:published_time\" content=\"2022-04-15T11:58:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-04-15T10:14:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2022\/04\/Copertina-blog-15-04-22_15-04-22-social-ita-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Paolo Di Ciaula\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript\" \/>\n<meta name=\"twitter:description\" content=\"Using CDK with Typescript to implement a step function with AWS Step Functions.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2022\/04\/Copertina-blog-15-04-22_15-04-22-social-ita-1.png\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Paolo Di Ciaula\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/\",\"url\":\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/\",\"name\":\"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript - Proud2beCloud Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#website\"},\"datePublished\":\"2022-04-15T11:58:00+00:00\",\"dateModified\":\"2022-04-15T10:14:39+00:00\",\"author\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/a984367e499bce5e12199e34d2c4181c\"},\"description\":\"In questo articolo vedremo come utilizzare AWS Step Functions\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.besharp.it\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#website\",\"url\":\"https:\/\/blog.besharp.it\/it\/\",\"name\":\"Proud2beCloud Blog\",\"description\":\"il blog di beSharp\",\"alternateName\":\"Proud2beCloud Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.besharp.it\/it\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/a984367e499bce5e12199e34d2c4181c\",\"name\":\"Paolo Di Ciaula\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/7a3395eed9ec6267a1c136c3cf0a3903?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/7a3395eed9ec6267a1c136c3cf0a3903?s=96&d=mm&r=g\",\"caption\":\"Paolo Di Ciaula\"},\"description\":\"DevOps Engineer, Frontend Developer, and Mobile App Developer @ beSharp. I divide my free time between good music, development, and... beer (sometimes mixed for better results ;D)\",\"url\":\"https:\/\/blog.besharp.it\/it\/author\/paolo-di-ciaula\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript - Proud2beCloud Blog","description":"In questo articolo vedremo come utilizzare AWS Step Functions","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/","og_locale":"it_IT","og_type":"article","og_title":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript","og_description":"Using CDK with Typescript to implement a step function with AWS Step Functions.","og_url":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/","og_site_name":"Proud2beCloud Blog","article_published_time":"2022-04-15T11:58:00+00:00","article_modified_time":"2022-04-15T10:14:39+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2022\/04\/Copertina-blog-15-04-22_15-04-22-social-ita-1.png","type":"image\/png"}],"author":"Paolo Di Ciaula","twitter_card":"summary_large_image","twitter_title":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript","twitter_description":"Using CDK with Typescript to implement a step function with AWS Step Functions.","twitter_image":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2022\/04\/Copertina-blog-15-04-22_15-04-22-social-ita-1.png","twitter_misc":{"Scritto da":"Paolo Di Ciaula","Tempo di lettura stimato":"6 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/","url":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/","name":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript - Proud2beCloud Blog","isPartOf":{"@id":"https:\/\/blog.besharp.it\/it\/#website"},"datePublished":"2022-04-15T11:58:00+00:00","dateModified":"2022-04-15T10:14:39+00:00","author":{"@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/a984367e499bce5e12199e34d2c4181c"},"description":"In questo articolo vedremo come utilizzare AWS Step Functions","breadcrumb":{"@id":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.besharp.it\/it\/step-function-con-aws-cdk-in-azione-il-nostro-punto-di-vista-utilizzando-typescript\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.besharp.it\/it\/"},{"@type":"ListItem","position":2,"name":"Step Function con AWS CDK in azione: il nostro punto di vista utilizzando Typescript"}]},{"@type":"WebSite","@id":"https:\/\/blog.besharp.it\/it\/#website","url":"https:\/\/blog.besharp.it\/it\/","name":"Proud2beCloud Blog","description":"il blog di beSharp","alternateName":"Proud2beCloud Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.besharp.it\/it\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/a984367e499bce5e12199e34d2c4181c","name":"Paolo Di Ciaula","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/7a3395eed9ec6267a1c136c3cf0a3903?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/7a3395eed9ec6267a1c136c3cf0a3903?s=96&d=mm&r=g","caption":"Paolo Di Ciaula"},"description":"DevOps Engineer, Frontend Developer, and Mobile App Developer @ beSharp. I divide my free time between good music, development, and... beer (sometimes mixed for better results ;D)","url":"https:\/\/blog.besharp.it\/it\/author\/paolo-di-ciaula\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/4354"}],"collection":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/users\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/comments?post=4354"}],"version-history":[{"count":0,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/4354\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media\/4371"}],"wp:attachment":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media?parent=4354"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/categories?post=4354"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/tags?post=4354"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}