2016-09-22 1 views
2

Je souhaite déployer mon code sur une instance EC2, mais je ne souhaite pas faire de la cuisson dans AWS Key and Secret. AWS Fournit un service IAM pour me permettre d'attribuer un rôle à mes instances EC2, ce qui permettra à ces instances d'accéder à l'aide de clés temporaires.AWS STS Rôles avec EC2 AssumeRole

Comment puis-je faire fonctionner ceci? Je l'ai essayé d'utiliser le SDK et StsClient à assumeRole mais vomit une erreur

User: arn:aws:sts::XXXXXXXXXXXX:assumed-role/ROLE-NAME/INSTANCE No is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME 

autour de la lecture et il semble que la demande STS a besoin d'utiliser les informations d'identification lui-même pour effectuer l'attribution de rôle? mais je pensais que les clés d'instance EC2 seraient utilisées?

+0

correctes - pouvoirs temporaires (par exemple, comme il est prévu dans EC2 métadonnées) ne peut pas être utilisé pour créer d'autres informations d'identification temporaires. Vous devrez utiliser des informations d'identification "permanentes" associées à un utilisateur. –

+0

Incorrect, s'il vous plaît voir ma réponse ci-dessous. Vous utilisez les informations d'identification de l'instance temporaire pour vous authentifier auprès d'un rôle, qui vous attribue ensuite un jeu temporaire que vous pouvez utiliser pour accéder au service. – Graeme

+0

Désolé, vous avez raison! La documentation indique "Vous ne pouvez pas appeler AssumeRole en utilisant les informations d'identification du compte racine AWS, l'accès est refusé Vous devez utiliser les informations d'identification pour un utilisateur IAM ou ** un rôle IAM ** pour appeler AssumeRole." Merci de montrer la méthode intelligente! –

Répondre

3

Oui, l'appel STS pour assumer le rôle DOES ont besoin d'informations d'identification pour fonctionner, mais il utilise les informations d'identification fournies lors de sa construction, si elles sont omises, il ne revient pas aux informations d'identification d'instance.

Pour utiliser les informations d'identification à base d'instance pour faire l'appel, vous devez utiliser quelque chose comme:

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(); 

qui va chercher le nom du rôle associé, puis les informations d'identification d'instance de température. Si vous connaissez le nom du rôle que vous pouvez spécifier dans le constructeur

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(['profile' => 'role-name-here']); 

Vous aurez également besoin de mettre à jour la relation d'approbation sur le rôle pour permettre à l'instance d'assumer le rôle. Je suppose l'entrée de service serait faire changer mais cela pour faire référence au rôle IAM semble fonctionner

{ 
    "Effect": "Allow", 
    "Principal": { 
    "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/ROLE-NAME" 
    }, 
    "Action": "sts:AssumeRole" 
} 

(Ne pas oublier d'ajouter la virgule à la fin des sections précédentes de fermeture})

maintenant Transmettez ces informations d'identification dans le constructeur du client Sts et votre appel à AssumeRole doit retourner avec succès. Mon code de test pour cela est:

$credentials = \Aws\Credentials\CredentialProvider::instanceProfile(); 

$stsClient = new \Aws\Sts\StsClient(['region' => 'eu-west-1', 'version' => 'latest', 'credentials' => $credentials]); 

$ar = $stsClient->assumeRole(['RoleArn' => 'arn:aws:iam::XXXXXXXXXXXX:role/Ec2Role-queue', 'RoleSessionName' => 'test']); 

$creds = $stsClient->createCredentials($ar); 

var_dump($creds); 

qui délivre en sortie:

object(Aws\Credentials\Credentials)#96 (4) { 
    ["key":"Aws\Credentials\Credentials":private]=> 
    string(20) "XXXXIYH36RJ5NZCDXXXX" 
    ["secret":"Aws\Credentials\Credentials":private]=> 
    string(40) "eXXXX+azLUNi9LjwyX4MkNI4rnEpFrG9pNNXXXXX" 
    ["token":"Aws\Credentials\Credentials":private]=> 
    string(308)  "FQoDYXdzEH4aDIa3Rx/onWIa4ArZeyLHAX+muL7zKt9trAQhMa98pkzpGGmOGa0N5UhCjX2GXQ3Dc2APElwlpCfr9F+J2k5igAeonadgrwAOC/OvEDv34i1JdmkaUjEE14S2hVGz2dXXXXegYra7kvx0cdoOjCPIFmXSZJeD1PR27lFyacH2x5+F1XKFugveiYCD63axATp4t8fq0K+EPjXXXX/wYKm5tJt7hYkCV7+tThLYFDPZ6NkXXXXjsSKkOw9u52yGJY4yD50y+liSprHH+/ZJyQppDIJcZbbpyBoojoeRvwU=" 
    ["expires":"Aws\Credentials\Credentials":private]=> 
    int(1474580894) 
} 

Espérons qui aide quelqu'un d'autre à sauver quelques follicules pileux :)