

• Le AWS Systems Manager CloudWatch tableau de bord ne sera plus disponible après le 30 avril 2026. Les clients peuvent continuer à utiliser CloudWatch la console Amazon pour consulter, créer et gérer leurs CloudWatch tableaux de bord Amazon, comme ils le font aujourd'hui. Pour plus d'informations, consultez la [documentation Amazon CloudWatch Dashboard](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html). 

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# `aws:executeScript` - Exécuter un script
<a name="automation-action-executeScript"></a>

Exécute le Python ou le PowerShell script fourni à l'aide du runtime et du gestionnaire spécifiés. Chaque action `aws:executeScript` peut être exécutée jusqu'à une durée maximale de 600 secondes (10 minutes). Vous pouvez limiter le délai d'attente en spécifiant le paramètre `timeoutSeconds` pour une étape `aws:executeScript`.

Utilisez les instructions de retour dans votre fonction pour ajouter des sorties à votre charge utile de sortie. Pour des exemples de définition de sorties pour votre action `aws:executeScript`, consultez [Exemple 2 : runbook scripté](automation-authoring-runbooks-scripted-example.md). Vous pouvez également envoyer le résultat des `aws:executeScript` actions de vos runbooks vers le groupe de CloudWatch journaux Amazon Logs que vous spécifiez. Pour de plus amples informations, veuillez consulter [Résultat de l'action d'automatisation de la CloudWatch journalisation avec journaux](automation-action-logging.md).

Si vous souhaitez envoyer le résultat des `aws:executeScript` actions vers CloudWatch Logs, ou si les scripts que vous spécifiez pour les `aws:executeScript` actions appellent des opérations d' AWS API, un rôle de service Gestion des identités et des accès AWS (IAM) (ou un rôle assumé) est toujours requis pour exécuter le runbook.

**Note**  
L’action `aws:executeScript` ne prend pas en charge la limitation des nouvelles tentatives. Si votre script effectue des appels AWS d'API susceptibles d'être limités, vous devez implémenter votre propre logique de nouvelle tentative dans le code de votre script.

L'`aws:executeScript`action contient les modules PowerShell Core préinstallés suivants :
+ Microsoft. PowerShell.Hôte
+ Microsoft. PowerShell. Gestion
+ Microsoft. PowerShell.Sécurité
+ Microsoft. PowerShell.Utilitaire
+ PackageManagement
+ PowerShellGet

Pour utiliser des modules PowerShell Core qui ne sont pas préinstallés, votre script doit installer le module avec l'`-Force`indicateur, comme indiqué dans la commande suivante. Le module `AWSPowerShell.NetCore` n'est pas pris en charge. *ModuleName*Remplacez-le par le module que vous souhaitez installer.

```
Install-Module ModuleName -Force
```

Pour utiliser les applets de commande PowerShell Core dans votre script, nous vous recommandons d'utiliser les `AWS.Tools` modules, comme indiqué dans les commandes suivantes. Remplacez chaque *example resource placeholder* par vos propres informations.
+ cmdlets Amazon S3.

  ```
  Install-Module AWS.Tools.S3 -Force
  Get-S3Bucket -BucketName amzn-s3-demo-bucket
  ```
+ cmdlets Amazon EC2.

  ```
  Install-Module AWS.Tools.EC2 -Force
  Get-EC2InstanceStatus -InstanceId instance-id
  ```
+ Applets de AWS Tools for Windows PowerShell commande communs ou indépendants du service.

  ```
  Install-Module AWS.Tools.Common -Force
  Get-AWSRegion
  ```

Si votre script initialise de nouveaux objets en plus d'utiliser les applets de commande PowerShell Core, vous devez également importer le module comme indiqué dans la commande suivante.

```
Install-Module AWS.Tools.EC2 -Force
Import-Module AWS.Tools.EC2

$tag = New-Object Amazon.EC2.Model.Tag
$tag.Key = "Tag"
$tag.Value = "TagValue"

New-EC2Tag -Resource i-02573cafcfEXAMPLE -Tag $tag
```

Pour des exemples d'installation et d'importation de `AWS.Tools` modules, ainsi que d'utilisation d'applets de commande PowerShell Core dans des runbooks, consultez. [Expérience de conception visuelle pour les runbooks d’Automatisation](automation-visual-designer.md)

**Input**  
Fournissez les informations requises pour exécuter votre script. Remplacez chaque *example resource placeholder* par vos propres informations.

**Note**  
La pièce jointe d'un script Python peut être un fichier .py ou .zip contenant le script. PowerShell les scripts doivent être stockés dans des fichiers .zip.

------
#### [ YAML ]

```
action: "aws:executeScript"
inputs: 
 Runtime: runtime
 Handler: "functionName"
 InputPayload: 
  scriptInput: '{{parameterValue}}'
 Script: |-
   def functionName(events, context):
   ...
 Attachment: "scriptAttachment.zip"
```

------
#### [ JSON ]

```
{
    "action": "aws:executeScript",
    "inputs": {
        "Runtime": "runtime",
        "Handler": "functionName",
        "InputPayload": {
            "scriptInput": "{{parameterValue}}"
        },
        "Attachment": "scriptAttachment.zip"
    }
}
```

------

Environnement d’exécution  
Langage d'exécution à utiliser pour exécuter le script fourni. `aws:executeScript`prend en charge les environnements d'exécution décrits dans le tableau suivant.      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/fr_fr/systems-manager/latest/userguide/automation-action-executeScript.html)
Type : Chaîne  
Obligatoire : oui  
Pour les environnements d’exécution Python, l’environnement fournit 512 Mo de mémoire et 512 Mo d’espace disque. Pour les environnements PowerShell d'exécution, l'environnement fournit 1024 Mo de mémoire et 512 Mo d'espace disque.

Handler (Gestionnaire)  
Le nom de votre fonction. Vous devez vous assurer que la fonction définie dans le gestionnaire possède deux paramètres, `events` et `context`. Le PowerShell moteur d'exécution ne prend pas en charge ce paramètre.  
Type : Chaîne  
Obligatoire : Oui (Python) \$1 Non pris en charge (PowerShell)

InputPayload  
Objet JSON ou YAML qui sera transmis au premier paramètre du gestionnaire. Il peut être utilisé pour transmettre des données d'entrée au script.  
Type : chaîne  
Obligatoire : non  

```
description: Tag an instance
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
    AutomationAssumeRole:
        type: String
        description: '(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
    InstanceId:
        type: String
        description: (Required) The ID of the EC2 instance you want to tag.
mainSteps:
  - name: tagInstance
    action: 'aws:executeScript'
    inputs:
        Runtime: "python3.11"
        Handler: tagInstance
        InputPayload:
            instanceId: '{{InstanceId}}'
        Script: |-
          def tagInstance(events,context):
            import boto3

            #Initialize client
            ec2 = boto3.client('ec2')
            instanceId = events['instanceId']
            tag = {
                "Key": "Env",
                "Value": "ExamplePython"
            }
            print(f"Adding tag {tag} to instance id {instanceId}")
            ec2.create_tags(
                Resources=[instanceId],
                Tags=[tag]
            )
            return tag
    outputs:
      - Type: String
        Name: TagKey
        Selector: $.Payload.Key
outputs:
  - tagInstance.TagKey
```

```
description: Tag an instance
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
  AutomationAssumeRole:
    type: String
    description: (Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.
  InstanceId:
    type: String
    description: (Required) The ID of the EC2 instance you want to tag.
mainSteps:
  - name: tagInstance
    action: aws:executeScript
    isEnd: true
    inputs:
      Runtime: PowerShell 7.4
      InputPayload:
        instanceId: '{{InstanceId}}'
      Script: |-
        Install-Module AWS.Tools.EC2 -Force
        Import-Module AWS.Tools.EC2

        $input = $env:InputPayload | ConvertFrom-Json

        $tag = New-Object Amazon.EC2.Model.Tag
        $tag.Key = "Env"
        $tag.Value = "ExamplePowerShell"

        Write-Information "Adding tag key: $($tag.Key) and value: $($tag.Value) to instance id $($input.instanceId)"
        New-EC2Tag -Resource $input.instanceId -Tag $tag

        return $tag
    outputs:
      - Type: String
        Name: TagKey
        Selector: $.Payload.Key
outputs:
  - tagInstance.TagKey
```

Script  
Script incorporé que vous souhaitez exécuter pendant l'automatisation.  
Type : Chaîne  
Obligatoire : Non (Python) \$1 Oui (PowerShell)

Réseau de transit par passerelle  
Nom d'un fichier de script autonome ou .zip pouvant être appelé par l'action. Indiquez la même valeur que le `Name` du fichier de pièce jointe du document que vous indiquez dans le paramètre de requête `Attachments`. Pour plus d'informations, consultez [Pièces jointes](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreateDocument.html#systemsmanager-CreateDocument-request-Attachments) dans *AWS Systems Manager la référence API *. Le fournissement d'un script à l'aide d'une pièce jointe nécessite également la définition d'une section `files` dans les éléments de niveau supérieur de votre runbook. Pour de plus amples informations, veuillez consulter [Version de schéma 0.3](documents-schemas-features.md#automation-doc-syntax-examples).  
Pour appeler un fichier pour Python, utilisez le format `filename.method_name` dans `Handler`.   
La pièce jointe d'un script Python peut être un fichier .py ou .zip contenant le script. PowerShell les scripts doivent être stockés dans des fichiers .zip.
Lorsque vous incluez des bibliothèques Python dans votre pièce jointe, nous vous recommandons d'ajouter un fichier `__init__.py` vide dans chaque répertoire de module. Cela vous permet d'importer les modules de la bibliothèque de votre pièce jointe dans le contenu de votre script. Par exemple : `from library import module`  
Type : chaîne  
Obligatoire : nonOutput

Charge utile  
Représentation JSON de l'objet renvoyé par votre fonction. Jusqu'à 100 Ko sont renvoyés. La génération d'une liste permet le renvoi d'un maximum de 100 éléments.

## Utiliser des attachements avec aws:executeScript
<a name="automation-action-executeScript-attachments"></a>

Les attachements constituent un moyen puissant d’empaqueter et de réutiliser des scripts complexes, des modules multiples et des dépendances externes dans le cadre de vos actions `aws:executeScript`. Utilisez des attachements lorsque vous devez :
+ Package de plusieurs modules ou PowerShell scripts Python ensemble.
+ Réutiliser la même logique de script sur plusieurs dossiers d’exploitation.
+ Inclure des bibliothèques ou des dépendances externes dans vos scripts.
+ Garder la définition de votre dossier d’exploitation propre en séparant les logiques de script complexes.
+ Partager des packages de scripts entre des équipes ou des flux de travail d’automatisation.

### Structure d’empaquetage des attachements
<a name="automation-action-executeScript-attachment-structure"></a>

Vous pouvez attacher des fichiers uniques ou des packages zip contenant plusieurs fichiers. La structure dépend de votre cas d’utilisation :

**Attachement d’un seul fichier**  
Pour les scripts simples, vous pouvez joindre un seul `.py` fichier (Python) ou un `.zip` fichier contenant un seul PowerShell script.

**Packages multimodules**  
Pour une automatisation complexe nécessitant plusieurs modules, créez un package zip avec la structure recommandée suivante :

```
my-automation-package.zip
├── main.py                    # Entry point script
├── utils/
│   ├── __init__.py           # Required for Python module imports
│   ├── helper_functions.py   # Utility functions
│   └── aws_operations.py     # AWS-specific operations
├── config/
│   ├── __init__.py
│   └── settings.py           # Configuration settings
└── requirements.txt          # Optional: document dependencies
```

**Important**  
Pour les packages Python, vous devez inclure un fichier `__init__.py` vide dans chaque répertoire contenant des modules Python. Cela vous permet d’importer des modules en utilisant la syntaxe d’importation standard de Python, comme `from utils import helper_functions`.

**PowerShell structure du package**  
PowerShell les pièces jointes doivent être regroupées dans des fichiers zip dont la structure est la suivante :

```
my-powershell-package.zip
├── Main.ps1                  # Entry point script
├── Modules/
│   ├── HelperFunctions.ps1   # Utility functions
│   └── AWSOperations.ps1     # AWS-specific operations
└── Config/
    └── Settings.ps1          # Configuration settings
```

### Créer des dossiers d’exploitation avec des attachements
<a name="automation-action-executeScript-attachment-workflow"></a>

Pour créer des dossiers d’exploitation utilisant des attachements, procédez comme suit :

1. **Charger votre attachement sur Amazon S3**

   Chargez votre fichier de script ou votre package zip dans un compartiment S3 auquel votre rôle d’automatisation peut accéder. Notez l’URI S3 pour l’utiliser lors de l’étape suivante.

   ```
   aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
   ```

1. **Calculer la somme de contrôle de l’attachement**

   Calculez la somme de contrôle SHA-256 de votre fichier d’attachement à des fins de vérification de sécurité :

   ```
   # Linux/macOS
   shasum -a 256 my-automation-package.zip
   
   # Windows PowerShell
   Get-FileHash -Algorithm SHA256 my-automation-package.zip
   ```

1. **Définir la section des fichiers dans votre dossier d’exploitation**

   Ajoutez une section `files` au niveau supérieur de votre dossier d’exploitation pour référencer votre attachement :

   ```
   files:
     my-automation-package.zip:
       checksums:
         sha256: "your-calculated-checksum-here"
   ```

1. **Référencer l’attachement dans votre étape executeScript**

   Utilisez le paramètre `Attachment` pour référencer le fichier que vous avez chargé :

   ```
   - name: runMyScript
     action: aws:executeScript
     inputs:
       Runtime: python3.11
       Handler: main.process_data
       Attachment: my-automation-package.zip
       InputPayload:
         inputData: "{{InputParameter}}"
   ```

## Exemples d’attachement aws:executeScript
<a name="automation-action-executeScript-examples"></a>

Les exemples suivants illustrent les différentes manières d’utiliser les attachements avec l’action `aws:executeScript`.

### Exemple 1 : attachement d’un seul fichier
<a name="automation-action-executeScript-single-file-example"></a>

Cet exemple montre comment utiliser un seul fichier Python en tant qu’attachement pour traiter les données d’une instance EC2.

**Fichier d’attachement : process\$1instance.py**  
Créez un fichier Python avec le contenu suivant :

```
import boto3
import json

def process_instance_data(events, context):
    """Process EC2 instance data and return formatted results."""
    try:
        instance_id = events.get('instanceId')
        if not instance_id:
            raise ValueError("instanceId is required")
        
        ec2 = boto3.client('ec2')
        
        # Get instance details
        response = ec2.describe_instances(InstanceIds=[instance_id])
        instance = response['Reservations'][0]['Instances'][0]
        
        # Format the response
        result = {
            'instanceId': instance_id,
            'instanceType': instance['InstanceType'],
            'state': instance['State']['Name'],
            'availabilityZone': instance['Placement']['AvailabilityZone'],
            'tags': {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
        }
        
        print(f"Successfully processed instance {instance_id}")
        return result
        
    except Exception as e:
        print(f"Error processing instance: {str(e)}")
        raise
```

**Dossier d’exploitation complet**  
Voici le dossier d’exploitation complet qui utilise l’attachement unique :

```
description: Process EC2 instance data using single file attachment
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
  AutomationAssumeRole:
    type: String
    description: (Required) IAM role for automation execution
  InstanceId:
    type: String
    description: (Required) EC2 instance ID to process

files:
  process_instance.py:
    checksums:
      sha256: "abc123def456..."

mainSteps:
  - name: processInstance
    action: aws:executeScript
    inputs:
      Runtime: python3.11
      Handler: process_instance.process_instance_data
      Attachment: process_instance.py
      InputPayload:
        instanceId: '{{InstanceId}}'
    outputs:
      - Type: StringMap
        Name: InstanceData
        Selector: $.Payload

outputs:
  - processInstance.InstanceData
```

### Exemple 2 : package multimodule
<a name="automation-action-executeScript-multi-module-example"></a>

Cet exemple illustre l’utilisation d’un package zip contenant plusieurs modules Python pour des opérations de compartiment S3 complexes.

**Structure du package**  
Créez un package zip avec la structure suivante :

```
s3-operations.zip
├── main.py
├── utils/
│   ├── __init__.py
│   ├── s3_helper.py
│   └── validation.py
└── config/
    ├── __init__.py
    └── settings.py
```

**main.py (point d’entrée)**  
Le script principal qui orchestre les opérations :

```
from utils.s3_helper import S3Operations
from utils.validation import validate_bucket_name
from config.settings import get_default_settings

def cleanup_s3_bucket(events, context):
    """Clean up S3 bucket based on specified criteria."""
    try:
        bucket_name = events.get('bucketName')
        max_age_days = events.get('maxAgeDays', 30)
        
        # Validate inputs
        if not validate_bucket_name(bucket_name):
            raise ValueError(f"Invalid bucket name: {bucket_name}")
        
        # Initialize S3 operations
        s3_ops = S3Operations()
        settings = get_default_settings()
        
        # Perform cleanup
        deleted_objects = s3_ops.delete_old_objects(
            bucket_name, 
            max_age_days,
            settings['dry_run']
        )
        
        result = {
            'bucketName': bucket_name,
            'deletedCount': len(deleted_objects),
            'deletedObjects': deleted_objects[:10],  # Return first 10 for brevity
            'dryRun': settings['dry_run']
        }
        
        print(f"Cleanup completed for bucket {bucket_name}")
        return result
        
    except Exception as e:
        print(f"Error during S3 cleanup: {str(e)}")
        raise
```

## Résolution des attachements aws:executeScript
<a name="automation-action-executeScript-troubleshooting"></a>

Suivez ces instructions pour résoudre les problèmes courants liés aux attachements `aws:executeScript` :

**Erreurs d’importation de module**  
Si vous recevez des erreurs d’importation lors de l’utilisation de packages multimodules :
+ Assurez-vous d’avoir inclus un fichier `__init__.py` vide dans chaque répertoire contenant des modules Python.
+ Vérifiez que vos instructions d’importation correspondent à la structure réelle de fichiers et de répertoires de votre package zip.
+ Utilisez les importations relatives (par exemple `from .utils import helper`) ou absolues (par exemple `from utils import helper`) de manière cohérente.

**Erreurs d’attachement introuvable**  
Si votre automatisation ne trouve pas l’attachement :
+ Vérifiez que la valeur du paramètre `Attachment` correspond exactement à la clé de votre section `files`.
+ Vérifiez que le chemin de votre compartiment S3 et le nom de fichier sont corrects dans la section `files`.
+ Assurez-vous que votre rôle d’automatisation a l’autorisation `s3:GetObject` pour l’emplacement S3 de l’attachement.
+ Vérifiez que le checksum de votre dossier d’exploitation correspond au checksum réel du fichier.

**Erreurs de fonction de gestionnaire**  
Si vous recevez des erreurs liées au gestionnaire :
+ Pour Python : utilisez le format `filename.function_name` dans le paramètre `Handler` (par exemple `main.process_data`).
+ Assurez-vous que votre fonction de gestionnaire accepte exactement deux paramètres : `events` et `context`.
+ Pour PowerShell : ne spécifiez aucun `Handler` paramètre ; le script s'exécute directement.

**Échecs d’exécution de script**  
Si votre script échoue lors de son exécution :
+ Consultez l’historique d’exécution de l’automatisation pour obtenir des messages d’erreur détaillés et des traces de pile.
+ Utilisez `print()` les instructions (Python) ou `Write-Information` (PowerShell) pour ajouter une sortie de débogage.
+ Vérifiez que toutes les AWS autorisations requises sont accordées à votre rôle d'automatisation.
+ Testez la logique de votre script localement avant de l’empaqueter sous forme d’attachement.

**Codes de sortie et gestion des erreurs**  
Pour gérer correctement les erreurs et renvoyer les codes de sortie :
+ Pour Python : utilisez `raise Exception("error message")` pour indiquer l’échec du script.
+ Dans PowerShell : utilisez `throw "error message"` ou `Write-Error` pour indiquer une défaillance.
+ Retournez des données structurées à partir de vos fonctions pour fournir des success/failure informations détaillées.
+ Utilisez des blocs try-catch pour gérer les exceptions avec élégance et fournir des messages d’erreur significatifs.