As credenciais da AWS não estão funcionando - ~ / .aws / credentials

3

Estou com problemas com minhas credenciais da AWS. Eu usei o arquivo de credenciais que criei em ~ / .aws / credentials exatamente como está escrito no documento da AWS. No entanto, o apache simplesmente não consegue lê-lo.

Primeiro, recebi este erro:

Erro ao recuperar credenciais do servidor de metadados do perfil da instância. Quando você não estiver executando dentro do Amazon EC2, deverá fornecer seu ID de chave de acesso e chave de acesso secreto da AWS nas opções "chave" e "segredo" ao criar um cliente ou fornecer um Aws \ Common \ Credentials instanciado Objeto CredentialsInterface.

Então eu tentei algumas soluções que encontrei na internet. Por exemplo, tentei verificar minha variável HOME. Foi / home / ubuntu. Eu também tentei mover meu arquivo de credenciais para o diretório / var / www, mesmo que não seja o diretório do meu servidor web. Nada funcionou. Eu ainda estava recebendo o mesmo erro.

Como segunda solução, vi que poderíamos chamar diretamente o CredentialsProvider e indicar o diretório no cliente.

link

O erro mudou, mas não consegui dar certo:

Não é possível ler as credenciais de /.aws/credentials

Vi também que poderíamos usar o provedor padrão do CredentialsProvider em vez de indicar um caminho.

link

Eu tentei e continuei recebendo o mesmo erro:

Não é possível ler as credenciais de /.aws/credentials

Caso você precise dessa informação, eu estou usando o aws / aws-sdk-php (3.2.5). O serviço que estou tentando usar é o AWS Elastic Transcoder. Minha instância do EC2 é um Ubuntu 14.04. Ele executa um aplicativo Symfony implementado usando o Capifony.

Antes de experimentar este servidor de produção, eu tentei em um servidor de desenvolvimento, onde ele funciona perfeitamente apenas com o arquivo ~ / .aws / credentials. Este servidor de desenvolvimento é exatamente uma cópia do servidor de produção. No entanto, ele não usa o Capifony para a implantação. É apenas um clone git normal do projeto. E tem apenas um volume do EBS, enquanto o servidor de produção tem um para o sistema operacional e outro para o aplicativo.

Ah! E também verifiquei se as permissões / proprietários do arquivo de credenciais eram os mesmos em ambos os servidores e eles são os mesmos. Eu tentei um 777 para ver se ele poderia mudar alguma coisa, mas nada.

Alguém tem uma ideia?

    
por Ana 07.08.2015 / 18:40

3 respostas

3

Se você estiver executando uma instância do EC2, uma prática recomendada é usar as funções do IAM, em vez de armazenar suas credenciais. Ir para IAM > funções > crie funções, crie sua função e anexe a política com as permissões necessárias a essa função (posso ajudar nisso, se necessário). Em seguida, crie uma máquina EC2 e, quando você estiver na "Etapa 3: configurar detalhes da instância", anexe essa função à sua máquina. A partir de agora, você não precisará armazenar nenhuma credencial em sua máquina, todas as chamadas para a API aws serão assinadas "automaticamente".

Se você deseja anexar uma função a uma máquina existente, é necessário criar uma AMI a partir da máquina e criar uma nova VM a partir dessa AMI, com a função anexada.

O que faço é sempre anexar pelo menos uma função vazia às minhas VMs, para que, se necessário, eu possa anexar mais tarde uma política a essa função e permitir que minha máquina chame as APIs.

    
por 08.08.2015 / 09:47
3

Também recebi o erro ' Cannot read credentials from /.aws/credentials '. A solução é dada na mensagem de erro.

/.aws/credentials é um arquivo e diretório diretamente do diretório raiz / e é aí que o SDK está procurando. O usuário no qual o Apache é executado (usuário apache on centos7) não possui sua própria casa e, portanto, não há ~ / home.

Alguns avisos sobre isso devem estar na documentação do aws!

Crie seu arquivo de credenciais exatamente como /.aws/credentials e não ~/user/.aws/credentials

Funciona perfeitamente.

Se você configurou o selinux como imposição, precisará alterar o contexto de segurança de ./aws recursivamente para corresponder ao do httpd. Caso contrário, o apache não poderá ler o arquivo de credenciais.

sudo chcon -Rv --type = httpd_sys_content_t /.aws

$ ls -Z /.aws/credentials -rwxr-xr-x. raiz raiz unconfined_u: object_r: httpd_sys_content_t: s0 /.aws/credentials

    
por 07.10.2016 / 22:29
0

f isso pode ajudar alguém, eu consegui fazer o meu arquivo .ini funcionar, dessa forma:

$profile = 'default';
$path = '/mnt/app/www/.aws/credentials/default.ini';
$provider = CredentialProvider::ini($profile, $path);
$provider = CredentialProvider::memoize($provider);
$client = ElasticTranscoderClient::factory(array(
    'region'  => 'eu-west-1',
    'version' => '2012-09-25',
    'credentials' => $provider
));

O CredentialProvider é explicado neste documento:

link

Eu ainda não entendi porque meu aplicativo não pode ler o arquivo no diretório pessoal (~ / .aws / credentials / default.ini) em um servidor, mas no outro.

Se alguém souber algo sobre isso, por favor me avise.

    
por 14.08.2015 / 15:23