Sobre
Nesse artigo vou te passar um script bem simples para você utilizar para executar o CLI da AWS em múltiplas contas sem precisar ter uma conta IAM nelas.
Se você usa mais de uma conta na AWS em algum momento você vai precisar usar o cli, como por exemplo criar uma conta IAM para o Terraform subir a sua infraestrutura, ou listar todos os buckets de todas as contas.
Nota: Existe outras formas de fazer esse acesso, como por exemplo usando o named profile, porém para acessos pontuais acredito que essa maneira que vou te apresentar é mais fácil de usar.
Requisitos
O único requisito é que as contas da AWS devem ter sido criadas através do AWS Organizations ou AWS Control Tower, pois vamos utilizar uma role que é adicionado nas contas de maneira automática após a criação por esses serviços.
Ah e uma conta IAM ou credencial temporária com essa permissão (não é recomendado, mas a permissão Administrador também funciona.) na conta Master da AWS(A conta que você usou para criar as contas da AWS).
Como funciona
O funcionamento é bem simples, vamos gerar uma credencial temporária em cada conta da AWS utilizando a role OrganizationAccountAccessRole e com essa credencial vamos executar o cli da AWS. Lembrando que essa role é adicionada de maneira automática pelo Organizations quando uma conta é criada.
Pegando ID das contas
Primeiro precisamos dos ID's das contas para gerar a credencial temporária, para conseguir essa informação execute o comando abaixo para adicionar os ids das contas no arquivo 'accounts.txt', esse arquivo pode ser usado no futuro caso precise executar novamente.
#Adicione suas credenciais da conta master nessas variaveis abaixo
AWS_ACCESS_KEY_ID="S" \
AWS_SECRET_ACCESS_KEY="" \
AWS_SESSION_TOKEN=""
#OBS: Se você estiver utilizando conta IAM você pode remover a variavel 'AWS_SESSION_TOKEN'
######
#Esse comando vai pegar o ID de todas as contas e adicionar no arquivo accounts.txt
aws organizations list-accounts --output text --query 'Accounts[].[JoinedTimestamp,Status,Id,Email,Name]' | grep -i active | sort | cut -f3 > accounts.txt
Remova o ID da conta Master do arquivo accounts.txt, pois a conta principal não possui a role que iremos utilizar e vai gerar um erro, normalmente o ID da master é o primeiro da lista, na dúvida execute o comando acima até a parte do grep -i active
para vê o nome das contas.
Mão na massa
Agora que temos os ID's das contas crie um arquivo chamado run.sh e coloque o conteúdo que está neste repositório: https://github.com/renanpessoa/aws-cli-multiaccount/blob/main/run.sh
Você vai colocar o comando que deseja executar na contas, na linha 14 do script, no exemplo está esse comando:
aws s3 ls
Em seguida você vai adicionar as credenciais da sua conta (a mesma que foi utilizada para pegar os IDs das contas) nas linhas 27,28,29 do script, basta alterar onde estiver 'ADD-YOUR-MASTER-CREDENCIAL'
.
ASSUME_ROLE=$(AWS_ACCESS_KEY_ID="ADD-YOUR-MASTER-CREDENCIAL" \
AWS_SECRET_ACCESS_KEY="ADD-YOUR-MASTER-CREDENCIAL" \
AWS_SESSION_TOKEN="ADD-YOUR-MASTER-CREDENCIAL" \
Em seguida de permissão de execução ao script e execute:
chmod +x run.sh ; ./run.sh
Pronto! será executado o comando em todas as contas.
Exemplo de output, nesse caso foi executado em duas contas o comando aws s3 ls.
Account: 123456789
{
"UserId": "ABACAXI:local_28-01-2021@20-40",
"Account": "123456789",
"Arn": "arn:aws:sts::123456789:assumed-role/AWSControlTowerExecution/local_28-01-2021@20-40"
}
2020-08-02 01:20:10 meu-bucket-de-teste
Account: 1011121314
{
"UserId": "LARANJA:local_28-01-2021@20-41",
"Account": "1011121314",
"Arn": "arn:aws:sts::1011121314:assumed-role/AWSControlTowerExecution/local_28-01-2021@20-41"
}
2020-08-02 01:25:10 meu-outro-bucket-de-teste
Top comments (0)