# Criar instância virtual no EC2

Uma vez que temos o key-pair e security group definidos, podemos criar nossa instância virtual:

```bash
aws --profile personal ec2 \
    run-instances \
    --image-id ami-0c4f7023847b90238 \
    --instance-type t2.micro \
    --key-name aws-ec2-key \
    --security-group-ids <sg-group-id> \
    --associate-public-ip-address \
    --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=myapp}]" \
    --count 1
```

Explicação do comando a seguir:

#### run-instances

A ação se chama `run-instances`, que cria uma ou mais instâncias virtuais a partir de uma imagem de sistema operacional pré-definida no AWS.

#### image-id

Identificador da imagem (AMI) na AWS. Exemplo da lista de AMI's quando se cria instância pela interface web:

![](https://3904680454-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FenpIiqyCfvPGPLez1sXc%2Fuploads%2F8syIDJxJArxPNh7GQhBR%2FScreenshot%202022-05-03%20at%2014.13.48.png?alt=media\&token=b3883a2b-ba47-4b15-a833-27a2d29e289b)

No nosso caso, utilizamos a AMI `ami-0c4f7023847b90238` que é referente ao Ubuntu Server 20.04 LTS.&#x20;

#### instance-type

Tipo da instância, neste caso sendo `t2.micro` que tem 1GB de memória e faz parte do período *free tier.*

#### key-name

Nome da chave `key-pair` criada previamente, que se chama `aws-ec2-key`. A AWS vai atribuir a chave pública do par nesta instância, assim poderemos posteriormente fazer SSH com a parte privada que já guardamos nos steps anteriores.

#### security-group-ids

Lista de ID's de security groups. Neste exemplo usamos aquele criado previamente, que por regra abre somente a porta 22 (SSH).

#### outras opções

* `--associate-public-ip-address`: associa um IP público à instância. Sem esta opção, a instância não irá ter IP público, apenas privado dentro da mesma rede interna da conta (VPC).
* `--count`: número de instâncias a serem criadas com estas especificações, no nosso caso apenas 1.
* `--tag-specifications`: dar uma tag "Name" à instância, para melhor visualização na interface web.

### Verificando que a instância foi criada

Nossa instância foi criada. Para verificar que foi criada, bem como sabe qual o IP público pra acesso SSH:

```bash
aws --profile personal ec2 \
    describe-instances \
    --filters "Name=tag:Name,Values=myapp" | \
    jq -r '.Reservations[0].Instances[0].PublicIpAddress'
```

#### Testando acesso SSH à instância virtual

Sabendo o IP público, que dá pra extrair tanto pelo CLI como vimos no último passo como também através da interface web, podemos fazer o SSH utilizando a chave privada.&#x20;

Mas antes, vamos marcar a chave como sendo apenas de leitura:

```bash
# definindo apenas permissão de leitura à chave, pois por segurança,
# o server rejeita uma chave pública que tenha permissões de escritas,
# evitando assim ataques de key-pair que possam forjar uma chave igual

chmod 400 ~/.ssh/aws-ssh-key.pem
```

Agora podemos, seguramente, fazer nosso primeiro acesso SSH ao server:

```bash
ssh ubuntu@<public-ip> -i ~/.ssh/aws-ssh-key.pem
```

![um print pra ser lembrado](https://3904680454-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FenpIiqyCfvPGPLez1sXc%2Fuploads%2FqlJARN9jdN0PJJhiZqNf%2FScreenshot%202022-05-03%20at%2014.29.07.png?alt=media\&token=53e9868e-d821-479e-b2dc-790554847205)
