Aller au contenu principal

Développer avec AWS Boto3 en Python

· 3 minutes de lecture
Stéphane ROBERT
Consultant DevOps

Parfois les outils d’Infra As Code ne répondent à certaines manipulations ou certains besoins. Vous voulez apprendre à développer des lambda, à manipuler vos ressources AWS avec du code en Python ? Donc, vous devrez utiliser la librairie Boto3.

Boto est le nom du kit de développement logiciel (SDK) Python pour AWS. Il vous permet de créer, mettre à jour et supprimer directement des ressources AWS à partir de vos scripts Python. Ce SDK permet de simplifier l’accès aux ressources AWS via des classes plutôt qu’aux API d’AWS directement.

Ce SDK sont très documenté (trop où s’y perd au début)

Pour info: Savez-vous pourquoi on l’appelle “Boto”? Boto est un mot portugais donné à plusieurs races de dauphins des fleuves Amazone et Orinoco.

Installation de la libriaire boto3

La première chose à faire avant d’installer Boto3 est de mettre en place un environnement virtuel python. Personellement, j’utilise pyenv. Mais rien ne vous empêche de recourir à d’autres outils comme virtualenv. **Attention Boto3 requiert au minima une version 3 de python.

pyenv install 3.11.0
pyenv virtualenv 3.11.0 aws-boto3
pyenv local aws-boto3

Maintenant que notre environnement virtuel est disponible, nous pouvons installer la librairie boto3.

pip install boto3

Configuration de l’accès

En fait si vous avez déjà installé la CLI d’AWS le plus dur est fait. En effet, ce SDK utilise sa configuration pour accéder aux de connexion.

Mais pour respecter les bonnes pratiques, je vous recommande de créer un utilisateur dédié en limitant ces droits d’accès aux seules ressources manipulées. Par exemple, un compte S3user pour accéder aux ressources des buckets S3.

Vous pouvez le faire avec la console, mais faisons plutôt avec la CLI. Pour notre tutoriel, nous allons manipuler les données EC2 donc je vais créer un utilisateur ec2user et lui donner juste accès aux ressources EC2.

aws iam create-user --user-name EC2user

{
    "User": {
        "Path": "/",
        "UserName": "EC2user",
        "UserId": "AIDAUA4AJK646JNOXxxxx",
        "Arn": "arn:aws:iam::123456789012:user/EC2user",
        "CreateDate": "2023-01-10T05:53:30+00:00"
    }
}

À présent créons la stratégie IAM. Commençons par créer un fichier ec2-policy.json avec ce contenu :

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeImages",
        "ec2:DescribeKeyPairs",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeAvailabilityZones",
        "ec2:RunInstances",
        "ec2:TerminateInstances",
        "ec2:StopInstances",
        "ec2:StartInstances"
      ],
      "Resource": "*"
    }
  ]
}

Créons-la :

aws iam create-role --role-name ec2AccessRole --assume-role-policy-document file://ec2-policy.json
{
    "Role": {
        "Path": "/",
        "RoleName": "ec2AccessRole",
        "RoleId": "AROAUA4AJK646ZILUWNUV",
        "Arn": "arn:aws:iam::276757567417:role/ec2AccessRole",
        "CreateDate": "2023-01-11T19:39:07+00:00",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    },
                    "Action": [
                        "sts:AssumeRole"
                    ]
                }
            ]
        }
    }
}

Maintenant attachons la stratégie à notre utilisateur :

aws iam attach-role-policy --role-name ec2AccessRole --policy-arn arn:aws:iam::aws:policy/AmazonEC2FullAccess

aws iam create-instance-profile --instance-profile-name ec2AccessInstanceProfile
{
    "InstanceProfile": {
        "Path": "/",
        "InstanceProfileName": "ec2AccessInstanceProfile",
        "InstanceProfileId": "AIPAUA4AJK645RJT4DSZJ",
        "Arn": "arn:aws:iam::276757567417:instance-profile/ec2AccessInstanceProfile",
        "CreateDate": "2023-01-11T19:54:56+00:00",
        "Roles": []
    }
}
❯ aws iam add-role-to-instance-profile --role-name ec2AccessRole --instance-profile-name ec2AccessInstanceProfile
❯

!!!!! Clarifier assume role

Notre premier script

Notre premier script permettra juste de lister les instances ec2 :

import boto3


ec2 = boto3.resource('ec2')

for instance in ec2.instances.all():
    print(instance.id, instance.state)