Executando AWS cli em múltiplas contas de maneira fácil
Tags: aws, awscli, devops, sre
Published: 2021-01-29 21:00:56

[Postado originalmente aqui.](https://www.linkedin.com/pulse/executando-aws-cli-em-m%25C3%25BAltiplas-contas-de-maneira-f%25C3%25A1cil-renan-pessoa/?trackingId=RNWux74FT7uV9TR5%2FcMV4Q%3D%3D)

## 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](https://aws.amazon.com/pt/blogs/security/how-to-use-a-single-iam-user-to-easily-access-all-your-accounts-by-using-the-aws-cli/), 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](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html) (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](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html) 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.

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

```sh
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'`.

```sh
	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: 
```sh
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.

```sh
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
```

## Referências

* https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_access.html
* https://aws.amazon.com/pt/organizations/
* https://alestic.com/2017/09/aws-organizations-cli/
* https://docs.aws.amazon.com/controltower/latest/userguide/how-control-tower-works.html