{"id":2085,"date":"2021-01-08T12:21:25","date_gmt":"2021-01-08T11:21:25","guid":{"rendered":"https:\/\/blog.besharp.it\/?p=2085"},"modified":"2023-03-29T15:49:59","modified_gmt":"2023-03-29T13:49:59","slug":"nuove-istanze-aws-ec2-mac-ci-cd-come-banco-di-prova","status":"publish","type":"post","link":"https:\/\/blog.besharp.it\/it\/nuove-istanze-aws-ec2-mac-ci-cd-come-banco-di-prova\/","title":{"rendered":"Nuove istanze AWS EC2 Mac: CI\/CD come banco di prova"},"content":{"rendered":"\n
Durante l’ultimo AWS re:Invent, AWS ha fatto uno degli annunci pi\u00f9 discussi, e questo \u2014 almeno sulla carta \u2014 lascia spazio a nuovi possibili scenari di sviluppo: le istanze AWS EC2 Mac! A questo punto \u2014 assumendo che non abbiate conoscenza delle specifiche hardware delle istanze Amazon EC2 Mac \u2014 potreste chiedervi quali siano i tagli supportati. Beh, per quanto riguarda l’immediato, scordatevi di poter scegliere: AWS per ora rende disponibile solo un taglio di istanza Mac. Le specifiche hardware ci dicono che le istanze mac1.metal sono alimentate da un processore Intel Coffee Lake a 3.2 GHz \u2014 potenziabile sino a 4.6 GHz \u2014 e 32 GiB di memoria. Come spiegato da Jeff Barr nel blog di AWS, le istanze girano in VPC, includono Elastic Network Adapter, e sono ottimizzate per la comunicazione con volumi EBS, infine supportano operazioni intensive di I\/O.<\/p>\n\n\n\n Durante la mia routine giornaliera, il mio partner di lavoro \u00e8 un laptop macOS che ho prontamente aggiornato al nuovo sistema operativo Apple: Big Sur. Di fatto ad oggi non ho notato particolari miglioramenti, tuttavia mantenere il sistema aggiornato rimane una best practice, almeno per quanto riguarda il computer di lavoro. In questo senso le Istanze AWS EC2 Mac ci sono fornite con una limitazione: supporto solo per OS Mojave e Catalina. Le AMI di questi sistemi ci vengono fornite con gi\u00e0 preinstallati AWS CLI, tool da riga di comando per XCode, Homebrew e agent di SSM. AWS sta lavorando attivamente al supporto di Big Sur e anche ai Chip Apple M1.<\/p>\n\n\n\n Ora, diamo uno sguardo a ci\u00f2 che ci interessa di pi\u00f9: un caso d’uso pratico!<\/p>\n\n\n\n Ho cominciato la mia carriera lavorativa come sviluppatore, e immagino che diversi sviluppatori abbiano pensato, a loro volta, ad un’associazione tra questo annuncio e la possibilit\u00e0 di sviluppare, testare e firmare applicazioni macOS e iOS in cloud.<\/p>\n\n\n\n Durante l’ultimo anno, il mio team sta sviluppando un’applicazione Desktop Open-Source che gestisce credenziali in locale per permettere l’accesso ad Ambienti complessi in Cloud. Il nostro progetto \u00e8 scritto in Typescript, interpretato da Node.js. Utilizziamo Angular come framework di sviluppo, che viene fatto girare on-top ad Electron per garantirci compatibilit\u00e0 multi-piattaforma<\/p>\n\n\n\n Electron viene fornito di un sistema di compilazione nativo, chiamato Electron-Builder, che permette di aggiungere script personalizzati di build al file package.json, file che contiene inoltre, come di consueto, le dipendenze di progetto. Abbiamo creato diversi script personalizzati per generare i binari Linux, Windows e macOS.<\/p>\n\n\n\n Per sviluppare il binario macOS, lo script deve avere accesso ad un Certificato di Firma e alla Password di Autenticazione (Notarisation) Apple. Questi permettono, rispettivamente, di firmare e autenticare il binario. Abitualmente siamo soliti salvare dati sensibili come i segreti nel nostro Keychain di macOS, lanciare gli script di build in locale e caricare manualmente gli artefatti sul nostro repository di GitHub, infine creare una nuova Release. Questo processo \u00e8, per sommi capi, una pratica comune adottata da molti sviluppatori per creare applicativi macOs e iOS<\/p>\n\n\n\n Questo processo \u00e8 per\u00f2 lento, complicato e prono ad errori umani. Ma Hey! Sembra che una nuova opportunit\u00e0 si stagli davanti a noi! Quale caso d’uso migliore delle nuove istanze AWS EC2 Mac per creare un binario macOS?<\/p>\n\n\n\n E’ tempo di focalizzarci su come preparare il nostro banco di prova. Nelle prossime pagine andremo ad analizzare i seguenti passaggi:<\/p>\n\n\n\n La prima cosa che dobbiamo fare per configurare la nostra pipeline consiste nel creare l’istanza EC2 MAC su cui andremo a installare e configurare Jenkins.<\/p>\n\n\n\n Buttiamoci sulla console AWS per cominciare!<\/p>\n\n\n\n Come per ogni altra istanza EC2, il wizard di lancio di mac1.metal parte dalla console di EC2, alla voce “Istanze”. Come molti di voi sicuramente sanno, qui \u00e8 possibile trovare una lista di istanze EC2 disponibili e \u2014 tra le altre cose \u2014 il men\u00f9 necessario a lanciare questa nuova istanza.<\/p>\n\n\n\n Dal 30 Novembre 2020, la lista di AMI disponibili si \u00e8 arricchita infatti, ci mostra sia Mojave che Catalina, per i nostri scopi, scegliamo Catalina.<\/p>\n\n\n\n Per permettere l’installazione di un peso massimo come XCode \u2014 necessario per alcuni importantissimi strumenti di build \u2014 bisogna attaccare all’istanza un volume EBS di root con una dimensione appropriata; nel mio caso, ho scelto di agganciare un volume da 100GiB.<\/p>\n\n\n\n Prima di dedicarci ai tipi di accesso delle istanze Mac, ricordiamoci di configurare i Security Group attivando le regole che permettono l’accesso alla macchina via SSH e VNC. Inoltre ho configurato una regola per l’accesso alla macchina via browser tramite porta 8080, per intenderci, quella legata al servizio di Jenkins. Siccome ho deciso di lanciare l’istanza in una subnet pubblica, ho ristretto l’accesso soltanto al mio IP corrente.<\/p>\n\n\n\n NOTA: funziona, ma per favore tenete conto che il setup da me proposto \u2014 in termini di rete e sicurezza \u2014 non pu\u00f2 essere considerato production-ready! Per rendere il tutto pi\u00f9 sicuro, \u00e8 sufficiente spostare l’istanza Mac in una subnet privata, collegata ad un server openVPN in una subnet pubblica; in questo modo, l’istanza mac1.metal non \u00e8 pi\u00f9 esposta direttamente su internet, accedibile invece tramite il server OpenVPN.<\/p>\n\n\n\n Nell’ultimo passaggio del wizard di creazione dell’istanza, dobbiamo decidere se utilizzare una chiave .pem esistente o selezionarne una nuova per accedere alla macchina via SSH. Questo \u00e8 il primo tipo di accesso disponibile e, non \u00e8 per niente differente da un accesso SSH standard ad una istanza Linux; infatti, il nome utente per le macchine Mac \u00e8 proprio ec2-user.<\/p>\n\n\n\n
Non preoccupatevi, entreremo nel dettaglio di uno di questi scenari a breve nell’articolo, ma per ora, permettetemi di introdurvi questo nuovo tipo di Istanza.
Le istanze Amazon EC2 Mac hanno un nome che richiama gli anni 80, un fatto questo, che le rende sicuramente “attraenti” per quelli di voi un p\u00f2 pi\u00f9 anziani di me ?.
Il loro nome \u00e8 istanze mac1.metal<\/strong>.
Parlando invece di hardware, le Istanze Amazon EC2 Mac sono supportate da host di tipo Mac mini, dipendenti da controller AWS Nitro per connettersi ai servizi e all’infrastruttura di rete di AWS. Il punto interessante \u00e8 che le istanze Mac sono interfacciate al sistema Nitro mediante tecnologia Thunderbolt 3. Ho volutamente utilizzato il termine “host” per sottolineare come non stiamo avendo a che fare con Macchine Virtuali, ma con veri e propri Host Dedicati; ogniqualvolta decido di avviare una Istanza Amazon EC2 Mac, AWS mi mette a disposizione concretamente un Host Mac mini dedicato ai miei scopi.<\/p>\n\n\n\nmac1.metal \u2014 uno sguardo alle specifiche<\/h2>\n\n\n\n
Nel pratico, un caso d’uso<\/h3>\n\n\n\n
\n
Lanciamo una istanza mac1.metal<\/h3>\n\n\n\n
Nel momento in ci ci si trova a dover scegliere il tipo di istanza, solo una \u00e8 disponibile al momento, chiamata mac1-metal. Come gi\u00e0 sappiamo \u00e8 caratterizzata da 12 vCPU a 3.2GHz e 32GiB di memoria. Se la vediamo come se fosse la nostra macchina di lavoro, non suona cos\u00ec strano alla fine!<\/p>\n\n\n\n
Nel resto del wizard, possiamo trattare la nostra istanza Mac come ogni altra istanza; l’unica cosa su cui dovremmo soffermarci \u00e8 la voce “tenancy”. Dobbiamo lanciare l’istanza su una Macchina Dedicata che possiamo richiedere \u2014 in una tab separata \u2014 durante il processo di creazione dell’istanza. Anche per la Macchina Dedicata, dovremo specificare mac1.metal come tipo di istanza da poterci lanciare sopra.<\/p>\n\n\n\n
Per questa proof-of-concept, ho deciso di lanciare l’istanza in una subnet pubblica e abilitare l’auto assegnazione dell’IP.<\/p>\n\n\n\nE per quanto riguarda i tipi di accesso?<\/h3>\n\n\n\n