aws:executeScript - Exécuter un script - AWS Systems Manager

aws:executeScript - Exécuter un script

Exécute le script python ou PowerShell fourni à l'aide du moteur d'exécution 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é. Vous pouvez envoyer la sortie depuis des actions aws:executeScript dans vos runbooks vers le groupe de journaux Amazon CloudWatch Logs que vous spécifiez. Pour de plus amples informations, consultez Journalisation de la sortie d'actions Automation avec CloudWatch Logs.

Si vous voulez envoyer la sortie d'action aws:executeScript vers CloudWatch Logs, ou si les scripts que vous spécifiez pour l'action aws:executeScript appellent des opérations d'API AWS, une fonction du service AWS Identity and Access Management (IAM) (ou un rôle de responsable) est toujours nécessaire 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 d’API AWS susceptibles d’être limités, vous devez implémenter votre propre logique de nouvelle tentative dans le code de votre script.

L'action aws:executeScript contient les modules PowerShell Core préinstallés suivants :

  • Microsoft.PowerShell.Host

  • Microsoft.PowerShell.Management

  • Microsoft.PowerShell.Security

  • Microsoft.PowerShell.Utility

  • PackageManagement

  • PowerShellGet

Pour utiliser des modules PowerShell Core qui ne sont pas préinstallés, votre script doit installer le module avec l'indicateur -Force, comme spécifié dans la commande suivante. Le module AWSPowerShell.NetCore n'est pas pris en charge. Remplacez ModuleName (Nom du module) 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 modules AWS.Tools, comme indiqué dans les commandes suivantes. Remplacez chaque example resource placeholder (espace réservé pour les ressources) avec 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 commande AWS Tools for Windows PowerShell communs ou indépendants du service.

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

Si votre script initialise de nouveaux objets en plus de l'utilisation des 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 obtenir des exemples d'installation et d'importation de modules AWS.Tools et d'utilisation des applets de commande PowerShell Core dans les runbooks, veuillez consulter Expérience de conception visuelle pour les runbooks d’Automatisation.

Entrée

Fournissez les informations requises pour exécuter votre script. Remplacez chaque example resource placeholder (espace réservé pour les ressources) avec vos propres informations.

Note

La pièce jointe d'un script Python peut être un fichier .py ou un fichier .zip contenant le script. Les scripts PowerShell 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

Le langage d’exécution à utiliser pour exécuter le script fourni. aws:executeScript prend en charge les scripts Python 3.7 (python3.7), Python 3.8 (python3.8), Python 3.9 (python3.9), Python 3.10 (python3.10), Python 3.11 (python3.11), PowerShell Core 6.0 (dotnetcore2.1), PowerShell 7.0 (dotnetcore3.1), et PowerShell 7.4 (dotnet8).

Valeurs prises en charge : python3.7 | python3.8 | python3.9 | python3.10 | python3.11 | PowerShell Core 6.0 | PowerShell 7.0 | PowerShell 7.4

Type : String

Obligatoire : oui

Note

Pour les environnements d’exécution Python, l’environnement fournit 512 Mo de mémoire et 512 Mo d’espace disque. Pour les environnements d’exécution PowerShell, 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 moteur d'exécution PowerShell ne prend pas en charge ce paramètre.

Type : String

Obligatoire : Oui (Python) | 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

Python
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
PowerShell
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.0 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 : String

Obligatoire : Non (Python) | 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 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, consultez Version de schéma 0.3.

Pour appeler un fichier pour Python, utilisez le format filename.method_name dans Handler.

Note

La pièce jointe d'un script Python peut être un fichier .py ou un fichier .zip contenant le script. Les scripts PowerShell 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 : non

Sortie
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

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 :

  • Empaqueter plusieurs modules Python ou scripts PowerShell 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

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 attacher un seul fichier .py (Python) ou un fichier .zip contenant un seul script PowerShell.

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.

Structure de package PowerShell

Les attachements PowerShell doivent être regroupés 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

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/
  2. 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
  3. 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: sourceType: "S3" sourceInfo: path: "s3://my-automation-bucket/scripts/my-automation-package.zip" checksums: sha256: "your-calculated-checksum-here"
  4. 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

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

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_instance.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: sourceType: "S3" sourceInfo: path: "s3://my-automation-bucket/scripts/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

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

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 paramètre Handler ; le script s’exécute directement.

Erreurs 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 des instructions print() (Python) ou Write-Information (PowerShell) pour ajouter une sortie de débogage.

  • Vérifiez que toutes les autorisations AWS 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.

  • Pour PowerShell : utilisez throw "error message" ou Write-Error pour indiquer l’échec.

  • Retournez des données structurées à partir de vos fonctions pour fournir des informations détaillées sur les réussites/échecs.

  • Utilisez des blocs try-catch pour gérer les exceptions avec élégance et fournir des messages d’erreur significatifs.