# 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:

![](/files/twAp63KmiuD9UdB1ASar)

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](/files/QCvmg83pzrEOMgAwZzOq)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://aws101.leandronsp.com/criar-instancia-virtual-no-ec2.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
