Credenciais em instâncias EC2 (IAM Role)
Com a enorme quantidade de recursos que AWS possui, mais o que vem por ai (eles não param :O), naturalmente nossas aplicações e servidores cada vez mais fazem chamadas aos serviços e API da AWS.
Para quem usa AWSCLI o caminho mais natural é rodar o comando:
aws configure
E colocar as credenciais.
Para quem programa as credenciais costumam ficar no código (hard coded) ou em algum arquivo de configuração.
Porém quando precisamos trocar essas credenciais o trabalho deixa de ser trivial. Pois tem credencial em ambiente de desenvolvimento, Q&A, produção e por ai vai.
Para facilitar nossa vida a AWS permite que a gente atribua a credencial a uma instância EC2. Assim não precisamos nos preocupar com credenciais armazenadas na máquina ou na aplicação. E a AWS se encarrega de rotacionar essas chaves diversas vezes por dia.
Vou fazer um passo a passo de como você pode começar a utilizar esse recurso.
Vamos criar uma policy IAM que pode fazer download de tudo no S3:
Temos três opções, copiar uma existente, gerar uma policy ou criar uma. Neste caso vamos criar uma, clique em Policy Generator.
Em AWS Service escolha Amazon S3 , em ações escolha SOMENTE GetObject em Amazon Resource Name coloque um *:
Sua tela ficará assim:
Clique em Add Statement:
Pronto, agora coloque um nome na sua policy e continue:
Agora vamos criar uma Role para a nossa instância EC2, escolha AWS Service:
Em seguinte EC2 e EC2 novamente:
Escolha a policy criada acima:
Dê um nome para a Role e salve:
Agora podemos criar uma instância nova e durante o processo de criação adicionar uma role:
Ou, a partir de fevereiro de 2017, podemos alterar a Role de uma instância já existente:
E Escolher a Role:
Pronto, a partir de agora sua instância tem a permissão de fazer download de qualquer objeto em qualquer Bucket S3 da sua conta. Isso tudo, sem você precisar fazer configuração de AWS CLI e/ou colocar credenciais no código.
IDÉIA: Caso você pretenda rodar isso em produção, recomendo que não deixe o ARN com *, coloque o ARN do Bucket S3 desejado e seu servidor terá somente a permissão de baixar objetos do Bucket escolhido. Que tal testar isso?
Espero ter ajudado a esclarecer o assunto. Caso tenha alguma dúvida, escreve aqui em baixo. Caso esteja testando, não esqueça de remover os recursos criados.