Utilisation de AWS CLI (et AWS SDK)
Le AWS CLI est un outil open source construit à l’aide du SDK AWS pour Python (Boto3) qui fournit des commandes pour interagir avec les services AWS. Avec une configuration minimale, vous pouvez utiliser toutes les fonctionnalités fournies par la console de gestion AWS à partir de votre terminal favori.
Les SDKs AWS fournissent une API pour différents langages de programmation (Python, Java, JavaScript, C++, .NET, GO, PHP, Ruby,…) afin de construire programmatiquement et utiliser les services AWS.
Dans cet article, nous allons voir quelques astuces afin d’utiliser au mieux ces 2 outils.
- Installation du AWS CLI
- AWS CLI Profiles
- Session temporaire
- Priorités des Credentials
- Signing HTTP Request
- Debugging
- AWS EC2 Instance Metadata
- AWS SDKs
- AWS Limits and Backoff
Installation du AWS CLI
AWS CLI est disponible en 2 versions :
- Version 2 : la plus récente et qui supporte les dernières fonctionnalités
- Version 1 : la version originelle, elle ne devrait plus être utilisée
Afin d’installer AWS CLI Version 2 sur Docker, Linux, macOS ou Windows, reportez-vous à la documentation AWS https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html
Après une installation réussie, vous devriez pouvoir lancer les commandes suivantes :
AWS CLI Profiles
Il est possible d’enregistrer plusieurs comptes utilisateur dans AWS CLI. C’est ce qu’on appelle des Profiles.
Pour cela, une fois votre compte par défaut configuré, vous pouvez en ajouter un nouveau en exécutant la commande :
A présent, il est possible de lancer une commande AWS CLI sous ce nouveau Profile en ajoutant le paramètre :
Session temporaire
Lorsqu’un compte AWS est protégé par un code MFA, il est possible de créer une session temporaire à l’aide de AWS Security Token Service (AWS STS) pour demander des identifiants temporaires aux privilèges limités.
Pour cela, lancez la commande suivante :
Vous obtenez de nouveaux Credentials, valides, le temps de la session.
Priorités des Credentials
Il est possible de définir des Credentials à plusieurs endroits. Il existe donc un ordre de priorité qu’il faut connaitre pour bien comprendre les effets indésirables que cela peut engendrer.
Pour AWS CLI
- Passés dans la ligne de commande (–region, –output, –profile)
- Passés dans des VARIABLES d’environnement (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)
- Enregistrés dans le fichier
~/.aws/credentials
généré par la commandeaws configure
- Enregistrés dans le fichier
~/.aws/config
généré par la commandeaws configure
- Enregistrés dans les Credentials du Container (pour les ECS Tasks)
- Enregistrés dans le Profiles d’Instances EC2
Pour AWS SDK
- Passés dans le System Properties du langage
- Passés dans des VARIABLES d’environnement (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SESSION_TOKEN)
- Enregistrés dans le fichier par défaut
~/.aws/credentials
présents dans de nombreux SDKs - Enregistrés dans les Credentials du Container (pour les ECS Tasks)
- Enregistrés dans le Profiles d’Instances EC2
Bonnes Pratiques
Pour éviter tout écueil avec les Credentials, voici quelques règles à respecter :
- NE JAMAIS enregistrer des Credentials dans le code !!
- Mais plutôt définir les Credentials au meilleur endroit dans la chaîne de priorité :
- Si vos appels interviennent dans AWS, utilisez les Roles IAM (EC2 Instance Roles, ECS Roles, Lambda Roles)
- Si vous êtes en dehors du réseau AWS, utilisez les variables d’environnement ou bien les Profiles
Signing HTTP Request
Lorsqu’on utilise AWS CLI ou AWS SDK, les appels HTTP vers AWS sont signés automatiquement. Le protocole utilisé s’appelle Signature Version 4 (SigV4) et provient de AWS.
Il se présente sous deux formes possibles :
- Des entĂŞtes HTTP (Authorization header)
- Des paramètres d’URL (Query string)
Debugging
Voici quelques outils qui, en cas de problèmes, permettront de déboguer et comprendre ce qui se passe :
Policy Simulator
Il peut être intéressant de vérifier les droits d’accès à une ressource AWS en fonction d’un User, Group ou Role. Il existe un outil dans AWS qui permet d’exécuter ces tests, le Policy Simulator : https://policysim.aws.amazon.com/
Dry Run
Il peut être aussi utile de tester une commande AWS CLI en simulant son exécution. Les commandes AWS CLI ont une option pour cela : --dry-run
- Exemple de création simulée d’une instance EC2 :
Parce que la commande est lancée en mode dry-run, en cas de succès, elle renvoie DryRunOperation. En cas d’échec, elle renverrait UnauthorizedOperation.
Message
Certaines commandes du AWS CLI renvoient un encoded authorization message décrivant le problème rencontré. Ce message doit être décodé pour être compréhensible.
Pour cela, vous pouvez utiliser la commande :
AWS EC2 Instance Metadata
Les Instances Metadata sont des données portant sur une instance EC2 : elles sont accessibles depuis l’instance et permettent de ne pas avoir à utiliser de Role IAM puisque ces données ont déjà été chargées dans l’instance pour sa configuration ou son fonctionnement.
Elles sont accessibles à l’adresse : http://169.254.169.254/latest/meta-data/
Notez que ceci est une adresse locale et donc accessible uniquement depuis l’instance EC2.
Exemples d’utilisation
Types de données
Il existe 3 types de données accessibles à partir d’une instance EC2 comme nous pouvons le voir dans le retour de cette commande.
Services
Vous pouvez accéder aux métadonnées d’instance à partir d’une instance en cours d’exécution en utilisant l’une des méthodes suivantes :
- Instance Metadata Service Version 1 (IMDSv1) – méthode de demande/réponse
- Instance Metadata Service Version 2 (IMDSv2) – méthode orientée session
Lorsque vous utilisez des demandes orientées session (IMDSv2), vous créez un jeton de session qui définit la durée de la session, qui doit être d’une seconde au minimum et de six heures au maximum. Durant la période spécifiée, vous pouvez utiliser le même jeton de session pour les demandes suivantes.
Voici comment récupérer un jeton de session :
Vous pouvez ensuite l’utiliser dans les commandes suivantes, le temps de la session :
Quelques metadonnées d’instance
Voici la description de quelques métadonnées d’instances qui peuvent être utiles :
Path de la Metadata | Description |
---|---|
ami-id | L'ID d'AMI utilisé pour lancer l'instance. |
ami-launch-index | Si vous avez démarré plus d'une instance en même temps, cette valeur indique l'ordre dans lequel l'instance a été lancée. La valeur 0 indique la première instance lancée. |
block-device-mapping/ami | Le périphérique virtuel qui contient le système de fichiers racine/démarrage. |
block-device-mapping/ebs N | Les périphériques virtuels associés à tout volume Amazon EBS. Les volumes Amazon EBS ne sont disponibles dans les métadonnées que s'ils étaient présents au moment du lancement ou lorsque l'instance a été démarrée pour la dernière fois. Le N indique l'index du volume Amazon EBS (tel que ebs1 ou ebs2 ). |
events/recommendations/rebalance | Heure approximative, UTC, à laquelle la notification de recommandation de rééquilibrage d'instance EC2 est émise pour l'instance. Voici un exemple de métadonnées pour cette catégorie : {"noticeTime": "2020-11-05T08:22:00Z"} . Cette catégorie n'est disponible qu'après l'émission de la notification. |
hostname | Le nom d'hôte DNS IPv4 privé de l'instance. Dans le cas où plusieurs interfaces réseau sont présentes, cela fait référence au périphérique eth0 (le périphérique dont le numéro de périphérique est 0). |
iam/info | Si un rôle IAM est associé à l'instance, il contient des informations concernant la dernière mise à jour du profil d'instance, parmi lesquelles la date de dernière mise à jour (LastUpdated), l'InstanceProfileArn et l'InstanceProfileId de l'instance. Sinon, absent. |
iam/security-credentials/ | Si un rôle IAM est associé à l'instance, nom-rôle est le nom du rôle et nom-rôle contient les informations d'identification de sécurité temporaires associées au rôle. Sinon, absent. |
instance-id | L'ID de cette instance. |
instance-type | Le type d'instance. |
kernel-id | L'ID du noyau lancé avec l'instance, le cas échéant. |
local-hostname | Le nom d'hôte DNS IPv4 privé de l'instance. Dans le cas où plusieurs interfaces réseau sont présentes, cela fait référence au périphérique eth0 (le périphérique dont le numéro de périphérique est 0). |
local-ipv4 | L'adresse IPv4 privée de l'instance. Dans le cas où plusieurs interfaces réseau sont présentes, cela fait référence au périphérique eth0 (le périphérique dont le numéro de périphérique est 0). |
network/interfaces/macs/ | Les adresses IPv4 privées qui sont associées à chaque adresse IP publique et assignées à cette interface. |
network/interfaces/macs/ | Le nom d'hĂ´te local de l'interface. |
network/interfaces/macs/ | Les adresses IPv4 privées associées à l'interface. |
network/interfaces/macs/ | Le DNS public de l'interface (IPv4). Cette catégorie n'est retournée que si l'attribut enableDnsHostnames est défini comme true . |
placement/availability-zone | La zone de disponibilité dans laquelle l'instance a été lancée. |
placement/region | Région AWS dans laquelle l'instance est lancée. |
public-hostname | Le DNS public de l'instance. Cette catégorie n'est retournée que si l'attribut enableDnsHostnames est défini comme true . |
public-ipv4 | L'adresse IPv4 publique. Si une adresse IP Elastic est associée à l'instance, la valeur retournée est l'adresse IP Elastic. |
security-groups | Les noms des groupes de sécurité appliqués à l'instance. Après le lancement, vous pouvez modifier les groupes de sécurité des instances. De tels changements apparaissent ici et dans réseau/interfaces/macs/ |
AWS SDKs
Un AWS SDK (Software Development Kit) sert à interagir avec AWS au sein même d’une application. Il existe donc de nombreux AWS SDKs en fonction des différents langages de programmation (Python, Java, C++, JavaScript, Ruby, PHP,…):
- Le AWS CLI est lui même codé à partir du AWS SDK Python (appelé aussi Boto3).
- Certains services AWS ne sont accessibles que par un AWS SDK : DynamoDB, Lambda Function,…
A noter que si vous n’avez pas configurer de Region par défaut, les AWS SDKs interagissent avec la Region us-east-1
par défaut.
AWS Limits and Backoff
Limits / Quotas
Il existe des Limits ou Quotas dans AWS dont il faut avoir connaissance :
- API Rate Limits : suivant les APIs AWS, on ne peut faire plus d’un certain nombre d’appels par seconde à une API
- Service Quotas (ou Service Limits) : selon les Services AWS, on ne peut pas consommer plus d’un certain nombre de Services AWS (ex. 1152 vCPU par compte AWS)
Exponential Backoff
Lorsque vous obtenez des erreurs du type ThrottlingException lors de vos appels à des Services AWS, vous devez utiliser l’Exponential Backoff.
C’est un mécanisme de relance avec une durée entre chaque tentative qui augmente exponentiellement. Il est décrit plus précisément dans cet article https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/
- Les AWS SDKs l’implémentent déjà , donc, il n’y a rien à faire
- Mais si vous faites des appels aux APIs AWS par un autre moyen, vous DEVEZ mettre en place un tel mécanisme :
- En cas de ThrottlingException ou d’erreurs 5xx
- Pas en cas d’erreurs 4xx