# AWS CLI - Instalação e Configuração

%[https://youtu.be/Ar1N85Kn6DU] 

---

## Introdução

AWS CLI é uma abreviação para `AWS Command Line Interface` e é uma ferramenta poderosa que nos permite executar várias ações na AWS através de linhas de comandos diretamente do nosso terminal.

É uma ótima maneira de trabalhar rapidamente com APIs da AWS e com um único comando você pode fazer muitas coisas com facilidade. Neste tutorial vamos mostrar passo a passo de como fazer sua instalação e configuração.

---

## Instalação

1- Instale o `Unzip`

```bash
sudo apt install unzip
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663002943775/W5nuh4fge.png align="center")

2- Faça download e instale a versão mais recente do AWS CLI

```bash
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663002975864/d9dZdSQOq.png align="center")

3- Verifique a versão do AWS CLI

```bash
aws --version
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003010009/fh_Gq27RC.png align="center")

---

## Configuração

Agora que já temos o AWS CLI devidamente instalado, precisamos configurar ele para que, digamos assim, você conecte seu dispositivo com uma conta da AWS.

---

### Criando um usuário IAM na AWS

1- Acesse sua conta da `AWS` → `IAM`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003064009/knJ6_JPJw.png align="center")

2- Clique em `Users` → `Add Users`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003103009/H3ZtlP-IA.png align="center")

3- Defina o nome que você desejar, no nosso exemplo vou definir como `simplescloud_aws_cli` → marque a opção `Access key - Programmatic access` → `Next`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003166829/R9FYk9hVb.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Embora possa parecer intuitivo clicar em <code>Attach existing policies directly</code> e definir uma permissão como por exemplo <code>AdministratorAccess</code> como na imagem de exemplo abaixo:</div>
</div>

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003213502/mioSc38TW.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Não é uma boa prática definir permissões diretamente a um usuário, então em vez disso vamos posteriormente "assumir uma função" que possua as permissões adequadamente. Faremos isso nos próximos passos!</div>
</div>

4- Não defina nenhuma permissão, apenas clique em → `Next`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003264224/5oazoRHeU.png align="center")

5- Apenas clique em `Next` → `Next` → `Create User`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003357166/Z7qbca6kf.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text"><strong>Importante:</strong> Salve seu <code>Access Key ID</code> e <code>Secret Access Key</code> em um local seguro e nunca os forneça para outras pessoas ou locais públicos. Nós vamos precisar dessa informação mais para frente.</div>
</div>

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003408797/ATA90-WsB.png align="center")

---

### Criando um Profile no AWS CLI

6- Agora com seu `Access Key ID` e `Secret Access Key` em mãos, abra seu terminal e digite o comando:

```bash
aws configure --profile <account_name>
```

Por exemplo:

```bash
aws configure --profile simplescloud
```

Preencha os respectivos campos:

* `AWS Access Key ID`: insira a chave que geramos no passo anterior
    
* `AWS Secret Access Key`: insira a chave que geramos no passo anterior
    
* `Default region`: caso você deseje alterar a região padrão, você pode consultar a lista completa:
    
    * 👉 [aqui](https://docs.aws.amazon.com/pt_br/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)
        
* `Default output format`: `json`
    

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003655484/NOXccIZOO.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">Isso criará dois arquivos <code>credentials</code> e <code>config</code> no diretório <code>~/.aws</code></div>
</div>

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003707531/Siem0lq3c.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003717352/LZpfwDW_w.png align="center")

---

### Alterando Profiles para várias contas AWS

Você poderá repetir esses passos para criar profiles diferentes do seu AWS CLI, isso é muito útil no cenário em que você precisa acessar várias contas da AWS diferentes, por exemplo uma `conta sua`, outra de um `cliente X`, já outra de um `cliente Y` e por aí vai.

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003778811/-5oIM43_S.png align="center")

Depois que seu Profile estiver configurado, você opcionalmente poderá "passar" em cada comando o parâmetro `--profile <account_name>` e embora isso funcione, pode ser tedioso tornar todos os comandos mais verbosos e repetitivos.

Por isso há uma forma melhor de se fazer, defina um profile usando uma variável de ambiente `AWS_PROFILE` e isso evitará que passemos o parâmetro `--profile` em todos os comandos:

```bash
export AWS_PROFILE=nome_do_profile
```

Por exemplo:

```bash
export AWS_PROFILE=simplescloud
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003874890/ktFsirGBC.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">☑</div>
<div data-node-type="callout-text">E está feito! 🥳🎉</div>
</div>

---

Se quisermos, então poderemos listar todos os nomes de profiles que temos através do comando:

```bash
aws configure list-profiles
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003948814/x4cHqY5LS.png align="center")

Também poderemos ver todos os detalhes de um profile através do comando:

```bash
aws configure list --profile <profile_name>
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663003984327/YI1XdE4IS.png align="center")

E por fim, você sempre poderá mudar o profile da conta que deseja usar com o comando:

```bash
export AWS_PROFILE=nome_do_profile
```

---

## Testando o AWS CLI

1- Digite o comando:

```bash
aws sts get-caller-identity
```

E isso retornará as informações da sua conta!

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004063914/VtgKeyYGx.png align="center")

---

## Assume Role - Assumindo Permissões

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004099182/e1LAYgf-C.png align="center")

Bom legal até aqui, já temos tudo configurado, mas se observarmos bem no início deste tutorial informei que a boa prática não era atribuir permissão diretamente a um usuário, mas em vez disso assumirmos uma função que possui as devidas permissões, vamos fazer a seguinte analogia:

> Fulano trabalha como animador de festa infantil, em um determinado dia ele se fantasia de `Spiderman`, mas em outro dia ele se fantasia de `Hulk`. Onde eu quero chegar aqui com esse exemplo é que a mesma pessoa "vestiu", ou seja, "assumiu" papéis diferentes.

O mesmo acontece com o AWS CLI, a boa prática é "assumirmos" diferentes permissões, por exemplo, podemos ter:

* `Role (função)` → produção que permite acesso em recursos usados em produção
    
* `Role (função)` → desenvolvimento que permite acesso em recursos usados em desenvolvimento, mas não os de produção, isso é muito útil para deploys de aplicação onde são definidas exatamente o nível de permissão e então "assumirmos" este papel temporariamente para o ambiente em que estamos trabalhando.
    

Temporariamente, porque é exatamente isso que o "Assume Role" da AWS faz, será gerado uma credencial temporária (padrão de 1 hora), então observe que as coisas vão ficando mais organizadas e seguras.

Com isso entendido, vamos ver o passo a passo de como fazer isso:

1- Acesse sua conta da `AWS` → `IAM`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004191463/8av8b3S3N.png align="center")

2- Clique em `Roles` → `Create Role`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004220823/6TPuWvrCk.png align="center")

3- Permaneça com a opção AWS Service selecionada → Selecione `EC2` → clique em `Next`

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004250366/k5rgk5571.png align="center")

4- Nesse momento podemos ir adicionando todas as permissões que essa `role` (função) exige, podemos inclusive criar políticas personalizadas e aplica-las, mas para efeitos de tutorial, vamos criar com o nível de permissão `PowerUserAccess`, isso nos permitirá usar qualquer recurso da AWS, exceto editar permissões do IAM como o `AdminstratorAccess` faria. Então filtre por `PowerUserAccess` → clique em `Next`:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004309988/rWMhmu30_.png align="center")

5- Defina um nome e descrição que preferir, por exemplo `aws_poweruseraccess_role` → não altere nenhuma das opções → clique em `Create Role`:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004343483/EAALEM6Fr.png align="center")

6- Agora abra a role (função) recém criada → altere para a aba `Trust relationships` → clique em `Edit trust policy`:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004376358/PFkm52v5k.png align="center")

7- Altere sua política:

`De`:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

`Para`:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "<user_arn>"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

<div data-node-type="callout">
<div data-node-type="callout-emoji">ℹ</div>
<div data-node-type="callout-text">A única coisa que mudamos foi a linha <code>"Service": "ec2.amazonaws.com"</code> para <code>"AWS": "&lt;user_arn&gt;"</code>.</div>
</div>

Obviamente, altere `<user_arn>` pela `arn` do seu usuário que criamos lá no início deste tutorial. Também é importante informar aqui que grupos não são permitidos, então você terá que adicionar todos os usuários e não um grupo. Exemplo:

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::XXXXXX:user/simplescloud_aws_cli"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```

Pronto, agora que tudo está configurado podemos testar, digite o comando:

<div data-node-type="callout">
<div data-node-type="callout-emoji">⚠</div>
<div data-node-type="callout-text">Altere para as suas informações, abaixo é só um exemplo</div>
</div>

```bash
export AWS_PROFILE=<profile_name>
```

```bash
aws sts assume-role \
--role-arn "arn:aws:iam::XXXXX:role/aws_poweruseraccess_role" \
--role-session-name "simplescloud_aws_cli" \
--duration-seconds "3600"
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004597042/0PcrffnST.png align="center")

E então vamos obter nossas credenciais temporárias:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004623875/_aSkYNfqx.png align="center")

E mesmo que nosso usuário não tenha permissão diretamente, podemos executar qualquer comando, pois assumimos a permissão da `role` (função) corretamente.

Se você está se perguntando:

* "Por que tudo isso?"
    
* "Precisa de tudo isso?"
    
* "Por que eu não posso colocar as permissões direto no meu usuário e usar só o `Access Key` e `Secret Key`?"
    
* "Por que eu preciso gerar essas credenciais temporárias?"
    

Todas essas perguntas são válidas e compreensivas, a resposta curta para elas é "você pode", mas o motivo para você não querer usar permissões diretas com `Access Key` e `Secret Key` são:

* `Access Key` e `Secret Key` são credenciais estáticas, então se ela for comprometida você terá que lembrar de inativar ela explicitamente, além disso se ela for comprometida tudo que ela tiver permissão de fazer, poderá, ocasionando um grave problema dependendo da situação. É possível ativar MFA (dois fatores), isso ajudaria, mas não é o foco deste artigo.
    
* `Assume Role` gerará credenciais temporárias, então mesmo que sua credencial seja comprometida, ela terá uma rotatividade.
    

---

### Dica

Se 1 hora for pouco para você, é possível alterar o tempo aqui:

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004780884/Iie2NrhcB.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663004794312/3X02iBB4T.png align="center")

E depois no comando passar os segundos corretamente no parâmetro `--duration-seconds`:

```bash
export AWS_PROFILE=<profile_name>
```

```bash
aws sts assume-role \
--role-arn "arn:aws:iam::XXXXX:role/aws_poweruseraccess_role" \
--role-session-name "simplescloud_aws_cli" \
--duration-seconds "3600"
```

Onde por exemplo:

* 1 hora = 3600 segundos
    
* 12 horas = 43200 segundos
    

---

## Bônus - Script

Passamos por muitas configurações até aqui, espero que eu tenha conseguido ajudar de alguma forma, porém passar por todas essas etapas toda vez que abrimos nosso terminal pode ser chato, frustrante e uma perda de tempo. Para isso criei um `script bash` básico, não irei detalhar ou explicar o script para não sairmos do foco aqui, mas basicamente o script fará as seguintes ações:

* Desabilitar algumas variáveis de ambiente da AWS
    
* Perguntar o nome do Profile que desejamos usar
    
* Perguntar o nome da Role que desejamos assumir as permissões
    
* Opcionalmente perguntar o nome e o tempo da sessão
    
* Exportar automaticamente as credenciais temporárias como variáveis de ambiente para que possamos usar
    

Para que funcione, o script só precisa de 2 requisitos:

* Ter um profile do AWS CLI previamente configurado para que possamos inserir no momento que ele perguntar (já aprendemos como criar um profile no início deste tutorial);
    
* Ter o `JQ` instalado (`sudo apt install jq`) para extrair algumas informações importantes da resposta que o AWS CLI irá nos retornar em formato `json`;
    

---

### E como usar?

1- Crie uma pasta e acesse ela com o comando:

```bash
mkdir -p scripts && cd scripts
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005015789/IY6WtsEjF.png align="center")

2- Crie um arquivo neste diretório:

```bash
touch aws-cli-assumerole.sh
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005065214/u7NOmZK3C.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005077681/hpr-ZZM0t.png align="center")

3- Permita a execução do arquivo script:

```bash
cd && chmod +x ./scripts/aws-cli-assumerole.sh
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005123578/nX8JcXScD.png align="center")

4- Cole o conteúdo do script com o editor que preferir (nano, vscode, etc):

```bash
#!/bin/bash

# Dependencies:
# - JQ (sudo apt install jq)
# - IAM user with Access Key and Secret Key with 
# profile already configured through the aws configure command
#
# Setup:
# chmod +x ./scripts/aws-cli-assumerole.sh
#
# Execute:
# source ./scripts/aws-cli-assumerole.sh
#
# Description:
# Makes assuming an AWS IAM role (+ exporting new temp keys) easier

# Set color script
COLOR_OFF='\033[0m'
GREEN='\033[0;32m'

echo "==================================================="
echo "Unset Previous ${GREEN}AWS Variables${COLOR_OFF}..."
echo "==================================================="
unset AWS_PROFILE
unset AWS_ACCESS_KEY_ID
unset AWS_SECRET_ACCESS_KEY
unset AWS_SESSION_TOKEN

echo "====================================================================="
echo "Please ${GREEN}enter the name of the AWS profile that you have       " 
echo "already configured using the aws configure${COLOR_OFF} command and   "
echo "that you would like to use now:                                      "
echo "====================================================================="
read AWS_PROFILE_NAME
export AWS_PROFILE=${AWS_PROFILE_NAME}

echo "====================================="
echo "Please ${GREEN}the name of the role  " 
echo "${COLOR_OFF}you would like to assume:"
echo "====================================="
read ROLE_NAME

echo "==============================================================="
echo "Please ${GREEN}enter the name of the session${COLOR_OFF}       "
echo "you want to use. Default value is ${GREEN}[aws_cli]${COLOR_OFF}"
echo "==============================================================="
read ROLE_SESSION_NAME
ROLE_SESSION_FULL_NAME="${AWS_PROFILE_NAME}_${ROLE_SESSION_NAME:-aws_cli}"
echo "Your session name has been configured as: ${GREEN}${ROLE_SESSION_FULL_NAME}${COLOR_OFF}"

echo "==============================================================="
echo "Please ${GREEN}enter your session expiration time in seconds.  "
echo "${COLOR_OFF}Default value is ${GREEN}[3600] seconds equivalent "
echo "to 1 hour.${COLOR_OFF}                                         "
echo "==============================================================="
read ROLE_SESSION_DURATION
ROLE_SESSION_DURATION=${ROLE_SESSION_DURATION:-3600} # in seconds - default is 1 hour
echo "Your session duration time has been configured as: ${GREEN}${ROLE_SESSION_DURATION}${COLOR_OFF}"

echo "=========================================="
echo "Get ${GREEN}AWS Account ID...${COLOR_OFF} "
echo "=========================================="
AWS_ACCOUNT=$(aws sts get-caller-identity | jq -r '.Account')

echo "======================================="
echo "${GREEN}AWS Assume Role...${COLOR_OFF} "
echo "======================================="
TEMP_ROLE=$(aws sts assume-role \
--role-arn "arn:aws:iam::${AWS_ACCOUNT}:role/${ROLE_NAME}" \
--role-session-name "${ROLE_SESSION_FULL_NAME}" \
--duration-seconds "${ROLE_SESSION_DURATION}")

echo "================================================"
echo "Get ${GREEN}temp AWS Credentials...${COLOR_OFF} "
echo "================================================"
export AWS_ACCESS_KEY_ID=$(echo ${TEMP_ROLE} | jq -r .Credentials.AccessKeyId)
export AWS_SECRET_ACCESS_KEY=$(echo ${TEMP_ROLE} | jq -r .Credentials.SecretAccessKey)
export AWS_SESSION_TOKEN=$(echo ${TEMP_ROLE} | jq -r .Credentials.SessionToken)
export AWS_SESSION_EXPIRATION=$(echo ${TEMP_ROLE} | jq -r .Credentials.Expiration)

echo "=========================================================="
echo "${GREEN}Your temporary AWS credentials                    "
echo "already exported as environment variables are:${COLOR_OFF}"
echo "=========================================================="
env | grep -i AWS_

echo "===================================================="
echo "Your ${GREEN}AWS Get Caller Identity...${COLOR_OFF} "
echo "===================================================="
AWS_IDENTITY=$(aws sts get-caller-identity | jq '.')
echo "${GREEN}"
echo ${AWS_IDENTITY}
echo "${COLOR_OFF}"

echo "=================================================="
echo "${GREEN}DONE!${COLOR_OFF}                         "
echo "IAM role assumed ${GREEN}successfully.${COLOR_OFF}"
echo "=================================================="
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005187618/z8fgaRfaO.png align="center")

5- Execute o script:

```bash
cd && source ./scripts/aws-cli-assumerole.sh
```

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005257236/jbpWGpTKM.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005276933/WbF6cYGVq.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005293557/mRbW8naEv.png align="center")

![image.png](https://cdn.hashnode.com/res/hashnode/image/upload/v1663005314946/nEf8oN36B.png align="center")

Agora nós já conseguimos obter nossas credenciais temporárias sem a necessidade de inserir todos os comandos.

<div data-node-type="callout">
<div data-node-type="callout-emoji">✅</div>
<div data-node-type="callout-text">Espero que todas as informações aqui tenham sido úteis para você!</div>
</div>
