Hybrid Cloud con Amazon ECS Anywhere e Hetzner
Tags: aws, devops, ecs
Published: 2023-10-21 13:24:42

La continua battaglia per abbattere i costi di AWS ci porta a cercare soluzioni "low price" spesso rinunciando a servizi e features come per esempio l'utilizzo di Orchestrator come Amazon ECS ( che personalmente adoro )..

E finalmente eccolo la .. **Amazon ECS Anywhere**! 

Da poco tempo è possibile continuare ad utilizzare ECS sfruttando la parte "computazionale" di un altro cloud e non solo!

Ecco allora una guida su come configurare e utilizzare Amazon ECS Anywhere e il minimo di infrastruttura su Hetnzer Cloud.

## Iniziamo ...

In questo tutorial affronteremo:

**Hetzner**

1. **Creazione Istanza su Hetzner Cloud**

**Amazon AWS**

1. **Configurazione Cluster ECS**
2. **Registrazione Istanza External**
3. **Configurazione Service ECS**

---

## Creazione Istanza su Hetzner Cloud

Come prima cosa ovviamente creiamo un account su Hetzner Cloud e logghiamoci all'interno della console.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zxl3vfw0g7s8ho2nzkfy.png)

Creiamo un progetto per ospitare le nostre "Istanze Esterne" che poi andremo a configurare e connettere al cluster di ECS più tardi.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8fhoojkiedixm8u3whb7.png)

Una volta all'interno del progetto, premiamo su **Add Server** per creare la nostra istanza che ospiterà i vari container deployati sul cluster di ECS di Amazon ECS Anywhere.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5h65qij7r4b4nslv03jk.png)

Scegliamo il tipo di istanza desiderata, selezionando la distribuzione di **Docker CE** sotto App facendo attenzione al **taglio** .. mi spiego meglio.

Amazon ECS Anywhere fatturerà circa **7 euro mese** per ogni **Istanza Esterna** configurata.. questo significa che "più container riusciremo a mettere su un'unica istanza esterna, più grande sarà il risparmio ottenuto rispetto ad ospitare gli stessi servizi direttamente su ECS/Fargate. Per questo tutorial configureremo un macchina piccola.. ma credo personalmente che convenga prendere poche istanze più grandi ( 8/16 core ) ed ospitare 7/12 container da 1 core. ( Attenzione anche al quantitativo di RAM )

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7852mlhmq5begn8cvit0.png)

Ricordiamoci di impostare una chiave SSH sul nostro account di Hetzner e di applicarla all'istanza, in modo da poterci connettere in SSH una volta creata l'istanza.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s3mmleqho9yoak3v93mp.png)

Terminato il processo di creazione spostiamoci su AWS per iniziare la creazione dell'infrastruttura di ECS; torneremo in seguito su Hetnzer per installare l'agent necessario alla registrazione dell'istanza sul cluster di ECS Anywhere.

---

## Configurazione Cluster ECS

Accediamo al nostro account di AWS e selezioniamo il servizio di ECS

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yktglin2o3vnj87dy69m.png)

Selezionare la gestione dei Cluster e premere **Create Cluster** per creare uno nuovo

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zcr7hqcmfhprb1pjn56s.png)

Iniziamo a creare il nostro cluster; Imputiamo un nome, selezioniamo **External instances using ECS Anywhere** e premiamo su **Create** lasciando tutto il resto così com'è.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qlb4cmhxhwbosq1il8u2.png)

---

## Registrazione Istanza External

Adesso è il momento di registrare l'istanza esterna per connettere la macchina di Hetzner.

Selezioniamo il cluster appena creato ed editiamolo:

Selezioniamo **Infrastructure**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jh5x8431ccc7t76021xa.png)

Clicchiamo su **Register external instances**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kvaod9iclloyj158va5k.png)

Si aprirà la modale di registrazione dell'istanza esterna; cliccando su **Generate registration command** verranno generati i comandi necessari all'installazione dell'Agent di ECS sia per Linux che per Windows .. 

Copiamoci quello per **Linux**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ru5srr9ljyk66t6qvjkr.png)

E' ora di connettersi in SSH al server di Hetzner creato in precedenza e di lanciare il comando (**Attenzione! non copiate direttamente questo sotto.. i codici di attivazione sono esemplificativi**):

`root@Production-Application02:~# curl --proto "https" -o "/tmp/ecs-anywhere-install.sh" "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" && bash /tmp/ecs-anywhere-install.sh --region "eu-west-1" --cluster "Hetzner" --activation-id "526ffc51-2baa-4534-9bd8-xxxxxxxxxx" --activation-code "xxxxxxxxxxxxx"`

Una volta che sarà terminata l'installazione dell'agent l'istanza risulterà attiva su ECS

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zfyxm9q05pr4vv4umppx.png)

---

## Configurazione Service ECS

Torniamo ora sulla tab **Services** e clicchiamo su **Create** in modo da lanciare il wizard di creazione del Service di ECS.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wavfo7z7j8jx0mne1eab.png)

Selezioniamo **Launch Type** e successivamente come Launch Type scegliere **External**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bxzfb7jfy1tnqotmccq.png)


A questo punto è necessario creare una **Task Definition** da assegnare al service che stiamo creando .. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/owoxwrnr0ruhfuhdp59j.png)

Apriamo la gestione e creiamone una a partire da un JSON ( è solo un esempio, ovviamente va affinata a seconda del tipo di service o servizio che intendiamo deployare )

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4dg5kbqzu37k1rxb850c.png)


Sarà necessario creare un **Role su Iam** per eseguire il task;
Andiamo quindi sulla gestione di **IAM** e creiamo un ruolo su cui applichiamo la policy di base: **AmazonECSTaskExecutionRolePolicy**


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3k4hjz5gpmi3x2n25you.png)


Adesso possiamo creare la Task Definition...
Copiamo e incolliamo.. **Attenzione a sostituire il placeholder per executionRoleArn con l'arn del ruolo appena creato**

```
{
    "requiresCompatibilities": [
        "EXTERNAL"
    ],
    "family": "who-am-i",
    "containerDefinitions": [
        {
            "name": "WhoAmI",
            "image": "traefik/whoami:latest",
            "essential": true
        }
    ],
    "volumes": [],
    "networkMode": "bridge",
    "memory": "1024",
    "cpu": "512",
    "executionRoleArn": "{arn del Ruolo creato}"
}
```

Premiamo su create e concludiamo la creazione.

Sarà ora possibile tornare sul nostro service di ECS, selezionare la Task Definition appena creata, dargli un nome e premere **Create**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hrlha1xcq30ti89no0u2.png)

Dal momento che durante la creazione del service abbiamo specificato di voler attivi almeno **1 Task**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rk662chopik1tgkdyao0.png)

Amazon ECS inizierà un processo di Deployment e tenterà di avviare il task all'interno del nostro Service.

Questo avvierà un container sulla nostra istanza esterna.

E' possibile accertarsi di questo, eseguendo un:

`docker container ls`

sulla macchina di Hetzner.

**Se tutto è andato come dovrebbe, troverete il vostro container avviato e pronto all'uso.**