AWS CLI - Instalação e Configuração
Compartilho todas as configurações que realizei para instalar o AWS CLI aplicando as boas práticas com Assume Role

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
sudo apt install unzip

2- Faça download e instale a versão mais recente do AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

3- Verifique a versão do AWS CLI
aws --version

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

2- Clique em Users → Add Users

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

Attach existing policies directly e definir uma permissão como por exemplo AdministratorAccess como na imagem de exemplo abaixo:
4- Não defina nenhuma permissão, apenas clique em → Next

5- Apenas clique em Next → Next → Create User

Access Key ID e Secret Access Key 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.
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:
aws configure --profile <account_name>
Por exemplo:
aws configure --profile simplescloud
Preencha os respectivos campos:
AWS Access Key ID: insira a chave que geramos no passo anteriorAWS Secret Access Key: insira a chave que geramos no passo anteriorDefault region: caso você deseje alterar a região padrão, você pode consultar a lista completa:- 👉 aqui
Default output format:json

credentials e config no diretório ~/.aws

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.

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:
export AWS_PROFILE=nome_do_profile
Por exemplo:
export AWS_PROFILE=simplescloud

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

Também poderemos ver todos os detalhes de um profile através do comando:
aws configure list --profile <profile_name>

E por fim, você sempre poderá mudar o profile da conta que deseja usar com o comando:
export AWS_PROFILE=nome_do_profile
Testando o AWS CLI
1- Digite o comando:
aws sts get-caller-identity
E isso retornará as informações da sua conta!

Assume Role - Assumindo Permissões

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 deHulk. 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çãoRole (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

2- Clique em Roles → Create Role

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

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:

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:

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

7- Altere sua política:
De:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Service": "ec2.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
Para:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "<user_arn>"
},
"Action": "sts:AssumeRole"
}
]
}
"Service": "ec2.amazonaws.com" para "AWS": "<user_arn>".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:
{
"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:
export AWS_PROFILE=<profile_name>
aws sts assume-role \
--role-arn "arn:aws:iam::XXXXX:role/aws_poweruseraccess_role" \
--role-session-name "simplescloud_aws_cli" \
--duration-seconds "3600"

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

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 KeyeSecret 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 KeyeSecret Keysã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 Rolegerará 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:


E depois no comando passar os segundos corretamente no parâmetro --duration-seconds:
export AWS_PROFILE=<profile_name>
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
JQinstalado (sudo apt install jq) para extrair algumas informações importantes da resposta que o AWS CLI irá nos retornar em formatojson;
E como usar?
1- Crie uma pasta e acesse ela com o comando:
mkdir -p scripts && cd scripts

2- Crie um arquivo neste diretório:
touch aws-cli-assumerole.sh


3- Permita a execução do arquivo script:
cd && chmod +x ./scripts/aws-cli-assumerole.sh

4- Cole o conteúdo do script com o editor que preferir (nano, vscode, etc):
#!/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 "=================================================="

5- Execute o script:
cd && source ./scripts/aws-cli-assumerole.sh




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






