{"id":3101,"date":"2021-05-14T13:59:00","date_gmt":"2021-05-14T11:59:00","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=3101"},"modified":"2021-05-14T17:07:49","modified_gmt":"2021-05-14T15:07:49","slug":"file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/","title":{"rendered":"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family"},"content":{"rendered":"\n

I protocolli per il trasferimento di file verso server in remoto esistono dagli albori del networking tra computer. FTP (esattamente, File Transfer Protocol) \u00e8 uno degli elementi fondamentali di Internet. Sviluppato da uno studente del MIT all’inizio degli anni ’70, FTP \u00e8 diventato lo standard per il trasferimento e la gestione dei file remoti per decenni.<\/p>\n\n\n\n

Nel corso degli anni, FTP \u00e8 stato aggiornato per fornire numerosi vantaggi. Gli esempi pi\u00f9 importanti, SFTP e FTPS sono stati sviluppati per soppiantare lo storico protocollo data la capacit\u00e0 di stabilire stream di dati sicuri.<\/p>\n\n\n\n

Il servizio AWS gestito, AWS Transfer Family, fornisce un set di risorse completamente gestite per supportare un modo aggiuntivo per trasferire file dentro e fuori AWS. Questo servizio consente l’esposizione di una comoda interfaccia per gestire gli oggetti su Amazon S3 ed Amazon EFS utilizzando protocolli di trasferimento file ben noti come FTP, SFTP e FTPS.<\/p>\n\n\n\n

Come funziona?<\/h2>\n\n\n\n

Questo servizio AWS consente di evitare gli ostacoli portati dalla manutenzione di server FTP. Infatti, AWS Transfer Family si occupa di far scalare i server EC2 sottostanti garantendo il giusto apporto di risorse, mantenendo l’intero servizio altamente disponibile.<\/p>\n\n\n\n

Per l’autenticazione degli utenti, AWS Transfer Family consente di scegliere tra soluzioni gestite direttamente dal servizio e personalizzate. La prima opzione, tuttavia, pur consentendo una configurazione molto rapida del servizio utilizzando le chiavi SSH RSA generate da AWS per l’autenticazione SFTP, non supporta l’integrazione con i meccanismi di autenticazione esistenti o anche la semplice autenticazione con la vecchia password e nome utente. La seconda opzione invece, ti d\u00e0 carta bianca quando \u00e8 necessario integrare un identity provider esistente. Ad esempio \u00e8 possibile utilizzare LDAP o Microsoft Active Directory come IdP, oppure configurare sistemi di autenticazione personalizzati grazie a funzioni lambda create ad-hoc.<\/p>\n\n\n\n

Come detto in precedenza, AWS Transfer Family consente l’accesso ai file remoti archiviati su S3 o EFS utilizzando i protocolli FTP, SFTP e FTPS. \u00c8 importante notare tuttavia, che l’utilizzo di FTP non \u00e8 supportato per i workload internet-facing, infatti, le connessioni FTP (a differenza di quelle SFTP e FTPS) sono considerate non sicure a causa del trasferimento in chiaro delle credenziali. Infatti, \u00e8 consentita l\u2019esposizione del servizio solo in modalit\u00e0 VPC.<\/p>\n\n\n\n

Perch\u00e9 AWS Transfer Family?<\/h2>\n\n\n\n

Il provisioning dell’infrastruttura necessaria per mantenere un’architettura che consenta il trasferimento di file FTP, SFTP o FTPS pu\u00f2 essere molto onerosa in termini sia economici che di manutenzione. AWS Transfer Family consente di configurare nuovi workload o migrare quelli esistenti limitando queste preoccupazioni.<\/p>\n\n\n\n

Va sottolineato che la migrazione di carichi di lavoro simili a quelli offerti da AWS Transfer Family non influisce sull’esperienza utente, consentendo loro di utilizzare i client FTP a cui sono abituati, come Cyberduck, FileZilla, WinSCP, ecc.<\/p>\n\n\n\n

Al contempo, l’utilizzo di questo servizio consente di portare i tuoi dati all\u2019interno di un servizio di archiviazione durevole e altamente disponibile. Come vedremo nella parte successiva, l’adozione di S3, ad esempio, pu\u00f2 dare spazio a un numero significativo di casi di business interessanti.<\/p>\n\n\n\n

Autenticazione degli utenti autogestita<\/h2>\n\n\n\n

Per configurare l’autenticazione utente autogestita in AWS Transfer Family, dovremo specificare un endpoint di API Gateway e un ruolo per chiamare le sue api.<\/p>\n\n\n\n

\"Self-managed<\/figure><\/div>\n\n\n\n

L\u2019API Gateway (passaggi di configurazione sono disponibili qui<\/a>) deve esporre un’API a cui viene associata una AWS Lambda. Questa API verr\u00e0 chiamata da AWS Transfer Family per verificare le credenziali dell’utente che ha effettuato una richiesta FTP al servizio.<\/p>\n\n\n\n

La funzione Lambda conterr\u00e0 la logica necessaria per autenticare l’utente. Qui \u00e8 dove avviene la magia, infatti, sarai in grado di implementare qualsiasi tipo di autenticazione: dalla chiamata all’API di IdP esterni, ad una implementazione da zero utilizzando, ad esempio, altri servizi AWS.<\/p>\n\n\n\n

Per semplificare la vita dello sviluppatore, AWS Transfer Family includer\u00e0 le seguenti propriet\u00e0 nel payload della richiesta HTTP GET:<\/p>\n\n\n\n

{\n   \"username\": \"The user's username\",\n   \"password\": \"The user's password, if empty SSH authentication is used\",\n   \"serverId\": \"ID of the AWS Transfer Family server\",\n   \"protocol\": \"FTP | SFTP | FTPS\",\n   \"sourceIp\": \"IP Address of the client\"\n}<\/code><\/pre>\n\n\n\n

La funzione lambda, quindi, dovr\u00e0 implementare la logica per verificare le credenziali ricevute dal servizio FTP rispetto allo user store scelto. In caso di convalida riuscita, dovrebbe essere restituito un oggetto JSON.<\/p>\n\n\n\n

Pi\u00f9 specificamente, AWS Transfer Family si aspetta una risposta con il seguente schema:<\/p>\n\n\n\n

{\n   \"Role\": \"[REQUIRED] ARN of a role allowing the base access to S3 buckets and KMS keys (if needed).\",\n   \"HomeDirectory\": \"The S3 bucket prefix that the user will be dropped into when they log in.\",\n   \"Policy\": \"A scope-down policy useful to restrict access to certain buckets according to the user's details.\",\n   \"PublicKeys\": \"If no password was provided (SSH key-based authentication), then the public SSH key associated with the user is returned. This is a comma-separated list and can contain two public keys.\",\n   \"HomeDirectoryDetails\": \"This is useful to define a logical bucket structure (symlink). In this way it's possible to show in the FTP client all the buckets to which a user has access, or create logical links to folders.\"\n}<\/code><\/pre>\n\n\n\n

Uno use case reale<\/h1>\n\n\n\n

Come accennato in precedenza, AWS Transfer Family consente di sviluppare e configurare meccanismi di autenticazione personalizzati. Ad esempio, sarebbe possibile utilizzare questa funzionalit\u00e0, come vedremo in questo capitolo, per creare un meccanismo completamente nuovo utilizzando i mezzi forniti da AWS.<\/p>\n\n\n\n

L’obiettivo di questo articolo \u00e8 presentare un esempio reale della migrazione di un carico di lavoro SFTP ospitato su EC2 ad AWS Transfer Family, utilizzando un’autenticazione personalizzata utilizzando DynamoDB come user store con latenza dell’ordine del millisecondo.<\/p>\n\n\n\n

L\u2019architettura<\/h2>\n\n\n\n

Per raggiungere l’obiettivo descritto sopra, dobbiamo prima delineare gli elementi costitutivi dell’infrastruttura.<\/p>\n\n\n\n

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

Come puoi vedere dallo schema, abbiamo dovuto introdurre un paio di servizi che non avevamo previsto, come un Network Load Balancer e un VPC endpoint. Questi due componenti sono necessari per assicurarsi che gli IP esposti siano fissi e non cambieranno mai. In questo modo, infatti, \u00e8 possibile allocare un elastic IP, consentendo anche di importare indirizzi IP di tua propriet\u00e0 (BYOIP). Questa funzione \u00e8 comunemente richiesta per problemi specifici con alcune regole di firewall.<\/p>\n\n\n\n

A parte i componenti appena citati, quando una richiesta FTP (o SFTP \/ FTPS) viene inviata dal client dell’utente, essa viene instradata attraverso la VPC al servizio AWS Transfer Family.<\/p>\n\n\n\n

A questo punto si verifica lo scenario descritto nel paragrafo sull’Autenticazione degli utenti autogestita.<\/p>\n\n\n\n

Infatti, AWS Transfer Family inoltrer\u00e0 le informazioni richieste per l’autenticazione dell’utente all’API Gateway interno, che invocher\u00e0 la lambda di autenticazione.<\/p>\n\n\n\n

Cosa succede nella lambda di autenticazione<\/h2>\n\n\n\n

Come detto prima, il processo di autenticazione utilizzer\u00e0 la tabella DynamoDB come user store. In questa tabella, infatti, verranno memorizzati alcuni importanti campi ed i suoi record rifletteranno la seguente struttura:<\/p>\n\n\n\n

{\n   \"hashPassword\": \"Used as partition key, is an hash of a combination of the salt, password and username\",\n   \"username\": \"The username by which a user can authenticate with a password\",\n   \"bucket\": \"Name of the bucket to which the user can connect\",\n   \"home\": \"Home directory of the selected bucket\",\n   \"iamPolicyArn\": \"ARN of the scope-down policy of the user\"\n}<\/code><\/pre>\n\n\n\n

Prima di tutto, viene calcolato l’hash della combinazione delle credenziali ricevute pi\u00f9 un salt segreto e fisso (archiviato in AWS Secrets Manager).<\/p>\n\n\n\n

La scelta del campo hashPassword<\/em> come partition key consente l’accesso diretto alle informazioni di un utente. Ancora pi\u00f9 importante, una query restituir\u00e0 il record specifico di un utente solo se le credenziali sono corrette, altrimenti viene ricevuta una risposta vuota. Ci\u00f2, infatti, si traduce in una query molto veloce sulla tabella DynamoDB, garantendo un’autenticazione quasi istantanea.<\/p>\n\n\n\n

Quando si verifica un’autenticazione con esito positivo, la lambda generer\u00e0 un oggetto compatibile con AWS Transfer Family e lo restituir\u00e0 al servizio.<\/p>\n\n\n\n

if user:\n   print(\"Authenticated\")\n   home_directory = \"\/\" + user['bucket'] + \"\/\" + user['home']\n \n   policy_arn = user['iamPolicyArn']\n   policy_info = iam.get_policy(PolicyArn=policy_arn)\n \n   policy_document = json.dumps(iam.get_policy_version(\n       PolicyArn=policy_arn,\n       VersionId=policy_info['Policy']['DefaultVersionId']\n   )['PolicyVersion']['Document'])\n \n   role_arn = \"arn:aws:iam::\" + \\\n       os.environ['AWS_ACCOUNT_ID'] + \":role\/\" + \\\n       os.environ['USER_S3_ACCESS_ROLE']\n \n   body = {\n       'Role': role_arn,\n       'Policy': policy_document,\n       'HomeDirectory': home_directory\n   }\n \n   print(\"Body: \", body)\n   return body\nelse:\n   # Answer is empty if not succeeded\n   print(\"Not Authenticated\")\n   return {}<\/code><\/pre>\n\n\n\n

Per concludere<\/h1>\n\n\n\n

Sebbene esistano molti protocolli per il trasferimento di file, lo storico protocollo FTP \u00e8 ancora ampiamente utilizzato. La creazione o la migrazione di questi carichi di lavoro \u00e8 notevolmente semplificata dall’adozione di servizi gestiti come AWS Transfer Family.<\/p>\n\n\n\n

Inoltre, \u00e8 importante notare che l’integrazione di servizi gestiti e serverless utilizzati, sia per l’archiviazione (S3), sia per la gestione degli utenti e la logica di autenticazione (es. ApiGateway \/ lambda e DynamoDB) consente al servizio di scalare per adattarsi a qualsiasi carico di lavoro e numero di utenti.<\/p>\n\n\n\n

Cosa pensate delle risorse AWS Transfer Family? Le avete gi\u00e0 utilizzate? Raccontateci dei vostri progetti nei commenti! A tra 14 giorni su #Proud2beCloud<\/strong> con un nuovo articolo dei nostri Cloud Expert!<\/p>\n","protected":false},"excerpt":{"rendered":"

I protocolli per il trasferimento di file verso server in remoto esistono dagli albori del networking tra computer. FTP (esattamente, […]<\/p>\n","protected":false},"author":15,"featured_media":3115,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[481],"tags":[251,263,496,498],"yoast_head":"\nFile Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family - Proud2beCloud Blog<\/title>\n<meta name=\"description\" content=\"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.\" \/>\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\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Gestione via SFTP di un bucket Amazon S3 tramite AWS Transfer Family\" \/>\n<meta property=\"og:description\" content=\"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/\" \/>\n<meta property=\"og:site_name\" content=\"Proud2beCloud Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-05-14T11:59:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-14T15:07:49+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2021\/05\/twitter-shared-link-5.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=\"Christian Calabrese\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Gestione via SFTP di un bucket Amazon S3 tramite AWS Transfer Family\" \/>\n<meta name=\"twitter:description\" content=\"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/blog.besharp.it\/wp-content\/uploads\/2021\/05\/twitter-shared-link-5.png\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Christian Calabrese\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/\",\"url\":\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/\",\"name\":\"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family - Proud2beCloud Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#website\"},\"datePublished\":\"2021-05-14T11:59:00+00:00\",\"dateModified\":\"2021-05-14T15:07:49+00:00\",\"author\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/b426de7cb01c2be795d117ac34ed15f7\"},\"description\":\"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.besharp.it\/it\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family\"}]},{\"@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\/b426de7cb01c2be795d117ac34ed15f7\",\"name\":\"Christian Calabrese\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/fd7c6025dc1878a6b0d719e7095fc761?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/fd7c6025dc1878a6b0d719e7095fc761?s=96&d=mm&r=g\",\"caption\":\"Christian Calabrese\"},\"description\":\"DevOps Engineer and Cloud-native Applications Developer @ beSharp. HiFi enthusiast and hardened videogames player!\",\"url\":\"https:\/\/blog.besharp.it\/it\/author\/christian-calabrese\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family - Proud2beCloud Blog","description":"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.","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\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/","og_locale":"it_IT","og_type":"article","og_title":"Gestione via SFTP di un bucket Amazon S3 tramite AWS Transfer Family","og_description":"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.","og_url":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/","og_site_name":"Proud2beCloud Blog","article_published_time":"2021-05-14T11:59:00+00:00","article_modified_time":"2021-05-14T15:07:49+00:00","og_image":[{"width":1200,"height":628,"url":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2021\/05\/twitter-shared-link-5.png","type":"image\/png"}],"author":"Christian Calabrese","twitter_card":"summary_large_image","twitter_title":"Gestione via SFTP di un bucket Amazon S3 tramite AWS Transfer Family","twitter_description":"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.","twitter_image":"https:\/\/blog.besharp.it\/wp-content\/uploads\/2021\/05\/twitter-shared-link-5.png","twitter_misc":{"Scritto da":"Christian Calabrese","Tempo di lettura stimato":"7 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/","url":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/","name":"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family - Proud2beCloud Blog","isPartOf":{"@id":"https:\/\/blog.besharp.it\/it\/#website"},"datePublished":"2021-05-14T11:59:00+00:00","dateModified":"2021-05-14T15:07:49+00:00","author":{"@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/b426de7cb01c2be795d117ac34ed15f7"},"description":"AWS Transfer Family: un set completamente gestito di risorse per il trasferimento di file all'interno e all'esterno del Cloud di AWS.","breadcrumb":{"@id":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.besharp.it\/it\/file-transfer-da-e-verso-amazon-s3-via-sftp-con-aws-transfer-family\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.besharp.it\/it\/"},{"@type":"ListItem","position":2,"name":"File Transfer da e verso Amazon S3 via SFTP con AWS Transfer Family"}]},{"@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\/b426de7cb01c2be795d117ac34ed15f7","name":"Christian Calabrese","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blog.besharp.it\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/fd7c6025dc1878a6b0d719e7095fc761?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/fd7c6025dc1878a6b0d719e7095fc761?s=96&d=mm&r=g","caption":"Christian Calabrese"},"description":"DevOps Engineer and Cloud-native Applications Developer @ beSharp. HiFi enthusiast and hardened videogames player!","url":"https:\/\/blog.besharp.it\/it\/author\/christian-calabrese\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/3101"}],"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\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/comments?post=3101"}],"version-history":[{"count":0,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/posts\/3101\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media\/3115"}],"wp:attachment":[{"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/media?parent=3101"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/categories?post=3101"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.besharp.it\/it\/wp-json\/wp\/v2\/tags?post=3101"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}