Acesso s3 privado do script ec2 user-data

1

Estou tentando escrever um script de dados de usuário ec2 que extrairá um arquivo de um bucket s3 privado. As instâncias do ec2 estão localizadas em várias regiões, o que, acredito, elimina a possibilidade de usar uma política de buckets para restringir o acesso a um VPC (que estava funcionando bem no meu protótipo, mas quebrou na segunda região).

Com base em conselhos aqui e em outros lugares, a abordagem que parece funcionar deve dar à instância ec2 uma função do IAM com acesso a esse bucket s3. E, de fato, isso quase parece funcionar para mim. No entanto, apenas não no momento em que o script de dados do usuário está sendo executado.

Meu script de dados do usuário tem um loop while que verifica a existência do arquivo que estou tentando fazer o download de s3 e continuará tentando por 5 minutos. Se eu fizer login manualmente durante essa janela e executar o comando aws exatamente nessa janela de 5 minutos, o script de dados do usuário será bem-sucedido como esperado, mas nunca será bem-sucedido.

apt install -y python-minimal
apt install -y unzip
wget "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip"
unzip awscli-bundle.zip
./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws

mkdir -p /opt/myapp
cd /opt/myapp

n=0
while [ ! -f app.tar.gz ]; do
    aws s3 cp --region us-west-1 "s3://bucket_name/app.tar.gz" app.tar.gz
    n=$[$n+1]
    [ $n -ge 60 ] && break
    sleep 5
done

tar -zxf app.tar.gz
./bin/startapp

Essa é uma versão destilada do meu script de dados do usuário. Se eu conseguir efetuar login e executar manualmente o mesmo comando aws, acredito que a função do IAM esteja correta; mas eu não entendo o que mais pode estar errado. Quando o comando aws é executado a partir do script de dados do usuário, o erro é: erro fatal: 'Ocorreu um erro (403) ao chamar a operação HeadObject: Proibido'

    
por Chris 28.09.2018 / 18:41

1 resposta

2

Eu finalmente resolvi o problema, mas o problema era impossível de ver pelo que eu publiquei. Eu destilei o script de dados do usuário em algo que eu poderia postar aqui, mas na verdade é muito mais longo. A parte principal não postada é que o aplicativo iniciado por este processo precisa de acesso ao SES da Amazon. Quando postei essa pergunta, essas variáveis de ambiente estavam no topo do script, e a chamada S3 estava usando-as e não a função atribuída. Depois que movi as variáveis de ambiente para um pouco antes de o aplicativo ser iniciado (importante, depois do comando de download do S3), o script de dados do usuário funcionava como esperado.

A parte importante que vale a pena capturar é que, embora a função do IAM seja atribuída à instância, e a AWS cli usará essas credenciais automaticamente, as credenciais são usadas da mesma forma que as credenciais do usuário para chamadas do S3. A definição de outras credenciais com certeza substituirá as da função. Antes de me deparar com esse problema, fiquei com a impressão de que o serviço S3 poderia ter uma maneira de validar o chamador e a função do chamador quando a solicitação é interna à AWS.

    
por 29.09.2018 / 23:17