aws:executeScript
: ejecutar un script
Ejecuta el script Python o PowerShell proporcionado mediante el uso del tiempo de ejecución y el controlador especificados. Cada acción aws:executeScript
puede ejecutarse hasta un máximo de 600 segundos (10 minutos). Puede limitar el tiempo de espera mediante la especificación del parámetro timeoutSeconds
para un paso aws:executeScript
.
Utilice instrucciones de devolución en la función para agregar salidas a la carga útil de salida. Para ver ejemplos sobre cómo definir salidas para la acción aws:executeScript
, consulte Ejemplo 2: manual de procedimientos con scripts. También puede enviar la salida de acciones aws:executeScript
de los manuales de procedimientos al grupo de registros de Amazon CloudWatch Logs que especifique. Para obtener más información, consulte Registro de salida de acción de Automation con CloudWatch Logs.
Si desea enviar la salida desde acciones aws:executeScript
a los Registros de CloudWatch o si los scripts que especifica para la llamada de acciones aws:executeScript
las operaciones de la API de AWS, siempre se requiere un rol de servicio de AWS Identity and Access Management (IAM) (o asumir un rol) para ejecutar el manual de procedimientos.
La acción aws:executeScript
contiene los siguientes módulos de PowerShell Core preinstalados:
-
Microsoft.PowerShell.Host
-
Microsoft.PowerShell.Management
-
Microsoft.PowerShell.Security
-
Microsoft.PowerShell.Utility
-
PackageManagement
-
PowerShellGet
Para utilizar módulos de PowerShell Core que no estén preinstalados, el script debe instalar el módulo con la marca -Force
, como se muestra en el siguiente comando. No se admite el módulo AWSPowerShell.NetCore
. Reemplace ModuleName
con el módulo que desee instalar.
Install-Module
ModuleName
-Force
Para utilizar cmdlets de PowerShell Core en el script, se recomienda utilizar los módulos de AWS.Tools
, como se muestra en los siguientes comandos. Reemplace cada example resource placeholder
con su propia información.
-
Cmdlets de Amazon S3
Install-Module AWS.Tools.S3 -Force Get-S3Bucket -BucketName
amzn-s3-demo-bucket
-
Cmdlets de Amazon EC2
Install-Module AWS.Tools.EC2 -Force Get-EC2InstanceStatus -InstanceId
instance-id
-
Cmdlets de AWS Tools for Windows PowerShell comunes o independientes del servicio
Install-Module AWS.Tools.Common -Force Get-AWSRegion
Si el script inicializa nuevos objetos además de usar cmdlets de PowerShell Core, también debe importar el módulo como se muestra en el siguiente comando.
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
Para obtener ejemplos de instalación e importación de módulos de AWS.Tools
, y de uso de cmdlets de PowerShell Core en los manuales de procedimientos, consulte Experiencia de diseño visual para manuales de procedimientos de automatización.
Input
Proporcione la información necesaria para ejecutar el script. Reemplace cada example resource placeholder
con su propia información.
nota
El archivo adjunto de un script de Python puede ser un archivo .py o uno .zip que contenga el script. Los scripts de PowerShell deben almacenarse en archivos .zip.
- Tiempo de ejecución
-
El lenguaje del tiempo de ejecución que se utilizará para ejecutar el script proporcionado.
aws:executeScript
es compatible con scripts de 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
) y PowerShell 7.4 (dotnet8
).Valores admitidos:
python3.7
|python3.8
|python3.9
|python3.10
|python3.11
|PowerShell Core 6.0
|PowerShell 7.0
|PowerShell 7.4
Tipo: cadena
Obligatorio: sí
nota
Para los tiempos de ejecución de Python, el entorno proporciona 512 MB de memoria y 512 MB de espacio en disco. Para los tiempos de ejecución de PowerShell, el entorno proporciona 1024 MB de memoria y 512 MB de espacio en disco.
- Controlador
-
Nombre de la función. Debe asegurarse de que la función definida en el controlador tenga dos parámetros,
events
ycontext
. El tiempo de ejecución de PowerShell no admite este parámetro.Tipo: cadena
Requerido: Sí (Python) | No admitido (PowerShell)
- InputPayload
-
Un objeto JSON o YAML que se pasará al primer parámetro del controlador. Se puede usar para pasar los datos de entrada al script.
Tipo: cadena
Requerido: no
- Script
-
Un script insertado que desea ejecutar durante la automatización.
Tipo: cadena
Requerido: No (Python) | Sí (PowerShell)
- Archivo adjunto
-
Nombre de un archivo de script independiente o archivo .zip que puede invocarse mediante la acción. Especifique el mismo valor que el
Name
del archivo adjunto de documento que especifique en el parámetro de solicitudAttachments
. Para obtener más información, consulte Archivos adjuntos en la referencia de la API de AWS Systems Manager. Si proporciona un script mediante un archivo adjunto, también debe definir una secciónfiles
en los elementos de nivel superior del manual de procedimientos. Para obtener más información, consulte Versión de esquema 0.3.Si desea invocar un archivo para Python, use el formato
filename.method_name
enHandler
.nota
El archivo adjunto de un script de Python puede ser un archivo .py o uno .zip que contenga el script. Los scripts de PowerShell deben almacenarse en archivos .zip.
Al incluir bibliotecas de Python en su archivo adjunto, recomendamos que agregue un archivo
__init__.py
vacío en cada directorio del módulo. Esto le permite importar los módulos desde la biblioteca del archivo adjunto dentro del contenido de su script. Por ejemplo:from library import module
Tipo: cadena
Requerido: no
Output
- Carga
-
La representación JSON del objeto devuelta por su función. Se devuelven hasta 100 KB. Si genera una lista, incluirá un máximo de 100 elementos.
Uso de archivos adjuntos con aws:executeScript
Los archivos adjuntos proporcionan una forma eficaz de empaquetar y reutilizar scripts complejos, varios módulos y dependencias externas con sus acciones aws:executeScript
. Use archivos adjuntos cuando necesite hacer lo siguiente:
-
Empaquetar varios módulos de Python o scripts de PowerShell juntos.
-
Reutilizar la misma lógica de script en varios manuales de procedimientos.
-
Incluir bibliotecas o dependencias externas en sus scripts.
-
Mantener limpia la definición del manual de procedimientos separando la lógica de los scripts complejos.
-
Compartir paquetes de scripts entre equipos o flujos de trabajo de automatización.
Estructura y empaquetado de los archivos adjuntos
Puede adjuntar archivos individuales o paquetes zip que contengan varios archivos. La estructura depende de su caso de uso:
Archivos adjuntos de un único archivo
En el caso de scripts sencillos, puede adjuntar un único archivo .py
(Python) o un archivo .zip
que contenga un único script de PowerShell.
Paquetes de varios módulos
Para una automatización compleja que requiera varios módulos, cree un paquete zip con la siguiente estructura recomendada:
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
Para los paquetes de Python, debe incluir un archivo __init__.py
vacío en cada directorio que contenga los módulos de Python. Esto le permite importar módulos utilizando la sintaxis de importación estándar de Python, como from utils import helper_functions
.
Estructura de paquetes de PowerShell
Los archivos adjuntos de PowerShell deben empaquetarse en archivos zip con la siguiente estructura:
my-powershell-package.zip ├── Main.ps1 # Entry point script ├── Modules/ │ ├── HelperFunctions.ps1 # Utility functions │ └── AWSOperations.ps1 # AWS-specific operations └── Config/ └── Settings.ps1 # Configuration settings
Crear manuales de procedimientos con archivos adjuntos
Siga estos pasos para crear manuales de procedimientos que utilicen archivos adjuntos:
-
Cargar el archivo adjunto a Amazon S3
Cargue el archivo de script o el paquete zip en un bucket de S3 al que pueda acceder su rol de automatización. Observe el URI de S3 que se usará en el siguiente paso.
aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
-
Calcular la suma de verificación del archivo adjunto
Calcule la suma de verificación SHA-256 de su archivo adjunto para la verificación de seguridad:
# Linux/macOS shasum -a 256 my-automation-package.zip # Windows PowerShell Get-FileHash -Algorithm SHA256 my-automation-package.zip
-
Definir la sección de archivos en su manual de procedimientos
Agregue una sección
files
en el nivel superior de su manual de procedimientos para hacer referencia a su archivo adjunto:files: my-automation-package.zip: sourceType: "S3" sourceInfo: path: "s3://my-automation-bucket/scripts/my-automation-package.zip" checksums: sha256: "your-calculated-checksum-here"
-
Hacer referencia al archivo adjunto en su paso de executeScript
Utilice el parámetro
Attachment
para hacer referencia al archivo cargado:- name: runMyScript action: aws:executeScript inputs: Runtime: python3.11 Handler: main.process_data Attachment: my-automation-package.zip InputPayload: inputData: "{{InputParameter}}"
Ejemplos de archivos adjuntos aws:executeScript
Los siguientes ejemplos muestran diferentes maneras de usar los archivos adjuntos con la acción aws:executeScript
.
Ejemplo 1: Archivo adjunto único
En este ejemplo, se muestra cómo utilizar un único archivo Python como adjunto para procesar los datos de la instancia EC2.
Archivo adjunto: process_instance.py
Cree un archivo Python con el siguiente contenido:
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
Manual de procedimientos completo
Este es el manual de procedimientos completo que usa el archivo adjunto único:
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
Ejemplo 2: Paquete de varios módulos
En este ejemplo, se muestra el uso de un paquete zip que contiene varios módulos de Python para operaciones complejas de bucket de S3.
Estructura del paquete
Cree un paquete zip con la siguiente estructura:
s3-operations.zip ├── main.py ├── utils/ │ ├── __init__.py │ ├── s3_helper.py │ └── validation.py └── config/ ├── __init__.py └── settings.py
main.py (punto de entrada)
El script principal que orquesta las operaciones:
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
Solución de problemas de aws:executeScript
Utilice la siguiente guía para resolver los problemas habituales relacionados con los archivos adjuntos aws:executeScript
:
Errores de importación del módulo
Si recibe errores de importación al utilizar paquetes de varios módulos haga lo siguiente:
-
Asegúrese de haber incluido un archivo vacío
__init__.py
en cada directorio que contenga los módulos de Python. -
Compruebe que las instrucciones de importación coincidan con la estructura real de archivos y directorios del paquete zip.
-
Utilice las importaciones relativas (por ejemplo,
from .utils import helper
) o las importaciones absolutas (por ejemplo,from utils import helper
) de forma coherente.
Errores de archivo adjunto no encontrado
Si la automatización no encuentra el archivo adjunto, haga lo siguiente:
-
Compruebe que el valor del parámetro
Attachment
coincida exactamente con la clave de su secciónfiles
. -
Compruebe que la ruta del bucket de S3 y el nombre del archivo sean correctos en la sección
files
. -
Asegúrese de que su función de automatización tenga el permiso
s3:GetObject
para la ubicación de S3 del archivo adjunto. -
Compruebe que la suma de verificación en su manual de procedimientos coincida con la suma de verificación real del archivo.
Errores de función del controlador
Si recibe errores relacionados con el controlador, haga lo siguiente:
-
Para Python: utilice el formato
filename.function_name
en el parámetroHandler
(por ejemplo,main.process_data
). -
Asegúrese de que su función controladora acepte exactamente dos parámetros:
events
ycontext
. -
Para PowerShell: no especifique ningún parámetro
Handler
; el script se ejecuta directamente.
Errores de ejecución de scripts
Si el script falla durante la ejecución, haga lo siguiente:
-
Consulte el historial de ejecución de la automatización para ver los mensajes de error detallados y los seguimientos de la pila.
-
Use instrucciones
print()
(Python) oWrite-Information
(PowerShell) para agregar resultados de depuración. -
Compruebe que se concedan todos los permisos de AWS necesarios a su función de automatización.
-
Pruebe la lógica del script localmente antes de empaquetarlo como un archivo adjunto.
Gestión de errores y códigos de salida
Para gestionar correctamente los errores y devolver los códigos de salida, haga lo siguiente:
-
En Python: use
raise Exception("error message")
para indicar un error en el script. -
En PowerShell: utilice
throw "error message"
oWrite-Error
para indicar un error. -
Devuelva datos estructurados de sus funciones para proporcionar información detallada sobre el éxito o el error.
-
Utilice bloques try-catch para gestionar las excepciones de manera elegante y proporcionar mensajes de error significativos.