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

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

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é. 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.

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 AWS Identity and Access Management (IAM) (ou un rôle assumé) est toujours requis pour exécuter le runbook.

L'aws:executeScriptaction 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'-Forceindicateur, comme indiqué dans la commande suivante. Le module AWSPowerShell.NetCore n'est pas pris en charge. ModuleNameRemplacez-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
  • EC2 Applets de commande Amazon.

    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

Entrée

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:executeScriptprend en charge les scripts Python 3.7 (python3.7python3.8), Python 3.8 (python3.9), Python 3.9 (python3.10) Python 3.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 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 : 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, veuillez consulter 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 .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 : 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.

Utilisation de pièces jointes avec AWS:ExecuteScript

Les pièces jointes 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 aws:executeScript actions. Utilisez des pièces jointes lorsque vous devez :

  • Package de plusieurs modules ou PowerShell scripts Python ensemble.

  • Réutilisez la même logique de script sur plusieurs runbooks.

  • Incluez des bibliothèques ou des dépendances externes dans vos scripts.

  • Gardez la définition de votre runbook propre en séparant les logiques de script complexes.

  • Partagez des packages de scripts entre équipes ou des flux de travail d'automatisation.

Structure de fixation et emballage

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

Pièces jointes à 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 __init__.py fichier 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, telle quefrom 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éation de runbooks avec pièces jointes

Pour créer des runbooks utilisant des pièces jointes, procédez comme suit :

  1. Téléchargez votre pièce jointe sur Amazon S3

    Télé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 à utiliser à l'étape suivante.

    aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
  2. Calculer la somme de contrôle de la pièce jointe

    Calculez la somme de contrôle SHA-256 de votre fichier joint pour la 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éfinissez la section des fichiers dans votre runbook

    Ajoutez une files section au niveau supérieur de votre runbook pour référencer votre pièce jointe :

    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érencez la pièce jointe dans votre étape ExecuteScript

    Utilisez le Attachment paramètre 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}}"

AWS:Exemples de pièces jointes ExecuteScript

Les exemples suivants illustrent les différentes manières d'utiliser les pièces jointes avec l'aws:executeScriptaction.

Exemple 1 : pièce jointe à un seul fichier

Cet exemple montre comment utiliser un seul fichier Python comme pièce jointe pour traiter les données d'une EC2 instance.

Fichier joint : 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
Runbook complet

Voici le runbook complet qui utilise la pièce jointe 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 problèmes liés à AWS : ExecuteScript

Suivez les instructions suivantes pour résoudre les problèmes courants liés aux aws:executeScript pièces jointes :

Erreurs d'importation du module

Si vous recevez des erreurs d'importation lors de l'utilisation de packages multimodules :

  • Assurez-vous d'avoir inclus un __init__.py fichier vide dans chaque répertoire contenant des modules Python.

  • Vérifiez que vos instructions d'importation correspondent à la structure réelle du fichier et du répertoire de votre package zip.

  • Utilisez les importations relatives (par exemplefrom .utils import helper) ou les importations absolues (par exemple,from utils import helper) de manière cohérente.

Erreurs relatives à la pièce jointe non trouvée

Si votre système automatique ne trouve pas la pièce jointe :

  • Vérifiez que la valeur du Attachment paramètre correspond exactement à la clé de votre files section.

  • Vérifiez que le chemin de votre compartiment S3 et le nom de fichier sont corrects dans la files section.

  • Assurez-vous que votre rôle d'automatisation est s3:GetObject autorisé à accéder à l'emplacement S3 de la pièce jointe.

  • Vérifiez que le checksum de votre runbook correspond au checksum réel du fichier.

Erreurs de fonction du gestionnaire

Si vous recevez des erreurs liées au gestionnaire :

  • Pour Python : utilisez le format filename.function_name dans le Handler paramètre (par exemple,main.process_data).

  • Assurez-vous que votre fonction de gestionnaire accepte exactement deux paramètres : events etcontext.

  • Pour PowerShell : ne spécifiez aucun Handler paramètre ; le script s'exécute directement.

Échec de l'exécution du 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 de pièce jointe.

Codes de sortie et gestion des erreurs

Pour gérer correctement les erreurs et renvoyer les codes de sortie :

  • En Python : raise Exception("error message") à utiliser 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 les blocs try-catch pour gérer les exceptions avec élégance et fournir des messages d'erreur significatifs.