Skip to main content

Command Palette

Search for a command to run...

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

Updated
10 min read
AWS CLI - Instalação e Configuração


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

image.png

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

image.png

3- Verifique a versão do AWS CLI

aws --version

image.png


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 AWSIAM

image.png

2- Clique em UsersAdd Users

image.png

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

image.png

Embora possa parecer intuitivo clicar em Attach existing policies directly e definir uma permissão como por exemplo AdministratorAccess como na imagem de exemplo abaixo:

image.png

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!

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

image.png

5- Apenas clique em NextNextCreate User

image.png

Importante: Salve seu 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.

image.png


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

  • Default output format: json

image.png

Isso criará dois arquivos credentials e config no diretório ~/.aws

image.png

image.png


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

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

image.png

E está feito! 🥳🎉

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

aws configure list-profiles

image.png

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

aws configure list --profile <profile_name>

image.png

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!

image.png


Assume Role - Assumindo Permissões

image.png

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 AWSIAM

image.png

2- Clique em RolesCreate Role

image.png

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

image.png

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

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

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

image.png

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"
        }
    ]
}
A única coisa que mudamos foi a linha "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:

Altere para as suas informações, abaixo é só um exemplo
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"

image.png

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

image.png

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

image.png

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

mkdir -p scripts && cd scripts

image.png

2- Crie um arquivo neste diretório:

touch aws-cli-assumerole.sh

image.png

image.png

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

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

image.png

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 "=================================================="

image.png

5- Execute o script:

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

image.png

image.png

image.png

image.png

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

Espero que todas as informações aqui tenham sido úteis para você!

More from this blog

SimplesCloud

27 posts

Um blog de Cloud DevOps • SRE para compartilhar meus estudos, o que aprendi e experiências através de artigos, tutoriais, cursos gratuitos, cases e dicas. Confira!