aws:executeScript: esecuzione di uno script - AWS Systems Manager

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

aws:executeScript: esecuzione di uno script

Esegue il Python o PowerShell lo script fornito utilizzando il runtime e il gestore specificati. Ogni operazione aws:executeScript può durare al massimo 600 secondi (10 minuti). Puoi limitare il timeout specificando il parametro timeoutSeconds per una fase aws:executeScript.

Usa le istruzioni return nella funzione per aggiungere output al payload di output. Per esempi di definizione degli output per l'operazione aws:executeScript, consulta Esempio 2: Runbook con script. Puoi anche inviare l'output aws:executeScript delle azioni nei tuoi runbook al gruppo di log Amazon CloudWatch Logs da te specificato. Per ulteriori informazioni, consulta Registrazione dell'output dell'azione di automazione con CloudWatch Logs.

Se desideri inviare l'output aws:executeScript delle azioni ai CloudWatch log o se gli script che specifichi per aws:executeScript le azioni richiamano le operazioni AWS API, è sempre necessario un ruolo di servizio AWS Identity and Access Management (IAM) (o assumi un ruolo) per eseguire il runbook.

L'aws:executeScriptazione contiene i seguenti moduli Core PowerShell preinstallati:

  • Microsoft. PowerShell.Host

  • Microsoft. PowerShell.Gestione

  • Microsoft. PowerShell.Sicurezza

  • Microsoft. PowerShell.Utilità

  • PackageManagement

  • PowerShellGet

Per utilizzare i moduli PowerShell Core che non sono preinstallati, lo script deve installare il modulo con il -Force flag, come mostrato nel comando seguente. Il modulo AWSPowerShell.NetCore non è supportato. Sostituiscilo ModuleName con il modulo che desideri installare.

Install-Module ModuleName -Force

Per utilizzare i cmdlet PowerShell Core nello script, è consigliabile utilizzare i AWS.Tools moduli, come illustrato nei comandi seguenti. Sostituisci ogni example resource placeholder con le tue informazioni.

  • Cmdlet Amazon S3

    Install-Module AWS.Tools.S3 -Force Get-S3Bucket -BucketName amzn-s3-demo-bucket
  • EC2 Cmdlet Amazon.

    Install-Module AWS.Tools.EC2 -Force Get-EC2InstanceStatus -InstanceId instance-id
  • Cmdlet comuni o indipendenti dal AWS Tools for Windows PowerShell servizio.

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

Se lo script inizializza nuovi oggetti oltre a utilizzare i cmdlet PowerShell Core, è necessario importare anche il modulo come illustrato nel comando seguente.

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

Per esempi di installazione e importazione di AWS.Tools moduli e utilizzo dei cmdlet PowerShell Core nei runbook, vedere. Esperienza di progettazione visiva per i runbook Automation

Input

Fornisci le informazioni necessarie per eseguire lo script. Sostituisci ogni example resource placeholder con le tue informazioni.

Nota

L'allegato per uno script Python può essere un file.py o un file.zip che contiene lo script. PowerShell gli script devono essere archiviati in file.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" } }
Runtime

Il linguaggio di runtime da utilizzare per eseguire lo script fornito. aws:executeScriptsupporta gli script Python 3.7 ()python3.7, Python 3.8 (python3.8), Python 3.9 () Python 3.10 python3.10 (python3.9), Python python3.11 3.11 () Core dotnetcore2.1 6.0 (), 7.0 () e PowerShell 7.4 (). PowerShell dotnetcore3.1 PowerShell dotnet8

Valori python3.7 supportati: | | | | | | | python3.8 python3.9 python3.10 python3.11 PowerShell Core 6.0 PowerShell 7.0 PowerShell 7.4

Tipo: stringa

Campo obbligatorio: sì

Nota

Per i runtime Python, l'ambiente fornisce 512 MB di memoria e 512 MB di spazio su disco. Per i PowerShell runtime, l'ambiente fornisce 1024 MB di memoria e 512 MB di spazio su disco.

Gestore

Il nome della funzione. È necessario assicurarsi che la funzione definita nel gestore abbia due parametri, events e context. Il PowerShell runtime non supporta questo parametro.

Tipo: stringa

Richiesto: Sì (Python) | Non supportato () PowerShell

InputPayload

Un oggetto JSON o YAML che verrà passato al primo parametro del gestore. Questo può essere usato per passare i dati di input allo script.

Tipo: string

Campo obbligatorio: no

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

Uno script incorporato che si desidera eseguire durante l'automazione.

Tipo: stringa

Obbligatorio: No (Python) | Sì () PowerShell

Allegato

Il nome di un file di script standalone o di un file .zip che può essere richiamato dall'operazione. Specifica lo stesso valore del Name del file allegato del documento che specifichi nel parametro della richiesta Attachments. Per ulteriori informazioni, consulta la sezione Allegati nella Documentazione di riferimento API di AWS Systems Manager . Se stai fornendo uno script utilizzando un allegato, devi anche definire una sezione files negli elementi di primo livello del runbook. Per ulteriori informazioni, consulta Versione dello schema 0.3.

Per richiamare un file per python, utilizzare il formato filename.method_name in Handler.

Nota

L'allegato per uno script Python può essere un file.py o un file.zip che contiene lo script. PowerShell gli script devono essere archiviati in file.zip.

Quando si includono librerie Python nell'allegato, si consiglia di aggiungere un file __init__.py vuoto in ogni directory del modulo. Ciò consente di importare i moduli dalla libreria nell'allegato all'interno del contenuto dello script. Ad esempio: from library import module

Tipo: string

Campo obbligatorio: no

Output
Payload

Rappresentazione JSON dell'oggetto restituito dalla funzione. Vengono restituiti fino a 100 KB. Se si genera un elenco, viene restituito un massimo di 100 elementi.

Utilizzo degli allegati con AWS:ExecuteScript

Gli allegati forniscono un modo efficace per impacchettare e riutilizzare script complessi, moduli multipli e dipendenze esterne nelle tue azioni. aws:executeScript Usa gli allegati quando devi:

  • Package di più moduli o PowerShell script Python.

  • Riutilizza la stessa logica di script su più runbook.

  • Includi librerie o dipendenze esterne nei tuoi script.

  • Mantieni pulita la definizione del runbook separando la logica degli script complessi.

  • Condividi pacchetti di script tra team o flussi di lavoro di automazione.

Struttura e imballaggio degli allegati

È possibile allegare file singoli o pacchetti zip contenenti più file. La struttura dipende dal caso d'uso:

Allegati a file singolo

Per script semplici, puoi allegare un singolo .py file (Python) o .zip un file contenente un PowerShell singolo script.

Pacchetti multimodulo

Per un'automazione complessa che richiede più moduli, create un pacchetto zip con la seguente struttura consigliata:

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
Importante

Per i pacchetti Python, è necessario includere un __init__.py file vuoto in ogni directory che contiene i moduli Python. Ciò consente di importare moduli utilizzando la sintassi di importazione Python standard come. from utils import helper_functions

PowerShell struttura del pacchetto

PowerShell gli allegati devono essere impacchettati in file zip con la seguente struttura:

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

Creazione di runbook con allegati

Segui questi passaggi per creare runbook che utilizzano allegati:

  1. Carica il tuo allegato su Amazon S3

    Carica il file di script o il pacchetto zip in un bucket S3 a cui può accedere il tuo ruolo di automazione. Nota l'URI S3 da utilizzare nel passaggio successivo.

    aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
  2. Calcola il checksum degli allegati

    Calcola il checksum SHA-256 del file allegato per la verifica di sicurezza:

    # Linux/macOS shasum -a 256 my-automation-package.zip # Windows PowerShell Get-FileHash -Algorithm SHA256 my-automation-package.zip
  3. Definisci la sezione dei file nel tuo runbook

    Aggiungi una files sezione al livello superiore del runbook per fare riferimento all'allegato:

    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. Fai riferimento all'allegato nel passaggio ExecuteScript

    Usa il Attachment parametro per fare riferimento al file caricato:

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

AWS: esempi di allegati ExecuteScript

Gli esempi seguenti mostrano diversi modi di utilizzare gli allegati con l'azione. aws:executeScript

Esempio 1: file allegato singolo

Questo esempio mostra come utilizzare un singolo file Python come allegato per elaborare i dati dell' EC2 istanza.

File allegato: process_instance.py

Crea un file Python con il seguente contenuto:

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 completo

Ecco il runbook completo che utilizza il singolo file allegato:

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

Esempio 2: pacchetto multimodulo

Questo esempio dimostra l'utilizzo di un pacchetto zip contenente più moduli Python per operazioni complesse con bucket S3.

Struttura del pacchetto

Crea un pacchetto zip con la seguente struttura:

s3-operations.zip ├── main.py ├── utils/ │ ├── __init__.py │ ├── s3_helper.py │ └── validation.py └── config/ ├── __init__.py └── settings.py
main.py (punto di ingresso)

Lo script principale che orchestra le operazioni:

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

Risoluzione dei problemi relativi agli allegati di AWS: ExecuteScript

Utilizza le seguenti linee guida per risolvere i problemi più comuni relativi agli allegati: aws:executeScript

Errori di importazione del modulo

Se ricevi errori di importazione quando usi pacchetti multimodulo:

  • Assicurati di aver incluso un __init__.py file vuoto in ogni directory contenente i moduli Python.

  • Verifica che le istruzioni di importazione corrispondano all'effettiva struttura di file e directory nel pacchetto zip.

  • Usa le importazioni relative (ad esempiofrom .utils import helper) o le importazioni assolute (ad esempiofrom utils import helper) in modo coerente.

Allegato non trovato (errori)

Se l'automazione non riesce a trovare l'allegato:

  • Verifica che il valore del Attachment parametro corrisponda esattamente alla chiave nella tua files sezione.

  • Verifica che il percorso del bucket S3 e il nome del file siano corretti nella files sezione.

  • Assicurati che il tuo ruolo di automazione disponga s3:GetObject dell'autorizzazione per la posizione dell'allegato S3.

  • Verifica che il checksum nel runbook corrisponda al checksum effettivo del file.

Errori della funzione Handler

Se ricevi errori relativi al gestore:

  • Per Python: usa il formato filename.function_name nel Handler parametro (ad esempio,main.process_data).

  • Assicurati che la tua funzione di gestione accetti esattamente due parametri: events e. context

  • Per PowerShell: non specificare un Handler parametro; lo script viene eseguito direttamente.

Errori di esecuzione dello script

Se lo script fallisce durante l'esecuzione:

  • Controlla la cronologia di esecuzione dell'automazione per messaggi di errore dettagliati e tracce dello stack.

  • Usa print() le istruzioni (Python) o Write-Information (PowerShell) per aggiungere l'output di debug.

  • Verifica che tutte le AWS autorizzazioni richieste siano concesse al tuo ruolo di automazione.

  • Verifica la logica dello script localmente prima di impacchettarlo come allegato.

Codici di uscita e gestione degli errori

Per gestire correttamente gli errori e restituire i codici di uscita:

  • In Python: da usare raise Exception("error message") per indicare l'errore dello script.

  • In PowerShell: usa throw "error message" o Write-Error per indicare un errore.

  • Restituisci dati strutturati dalle tue funzioni per fornire success/failure informazioni dettagliate.

  • Usa i blocchi try-catch per gestire le eccezioni con garbo e fornire messaggi di errore significativi.