aws:executeScript
– Executa um script
Executa o script do Python ou PowerShell fornecido, usando o runtime e o handler especificados. Cada ação aws:executeScript
pode ser executada por uma duração máxima de dez minutos (600 segundos). Você pode limitar o tempo limite especificando o parâmetro timeoutSeconds
para uma etapa aws:executeScript
.
Use instruções de retorno em sua função para adicionar saídas à carga útil da saída. Para obter exemplos de definição de saídas para sua ação aws:executeScript
, consulte Exemplo 2: Runbook com script. Também é possível enviar o resultado das ações do aws:executeScript
nos runbooks para o grupo de logs do Amazon CloudWatch Logs especificado. Para obter mais informações, consulte Registro de saída de ações do Automation em log com o CloudWatch Logs.
Se quiser enviar a saída de ações aws:executeScript
ao CloudWatch Logs ou se os scripts que você especificar para ações aws:executeScript
chamarem opções de API da AWS, um perfil de serviço do AWS Identity and Access Management (IAM) (ou uma função de recepção) sempre será necessário para executar o runbook.
A ação aws:executeScript
contém os módulos pré-instalados do PowerShell Core a seguir.
-
Microsoft.PowerShell.Host
-
Microsoft.PowerShell.Management
-
Microsoft.PowerShell.Security
-
Microsoft.PowerShell.Utility
-
PackageManagement
-
PowerShellGet
Para usar módulos do PowerShell Core que não estão pré-instalados, o script deve instalar o módulo com o sinalizador -Force
, conforme mostrado no comando a seguir. Não há suporte ao módulo AWSPowerShell.NetCore
. Substitua ModuleName
pelo nome do módulo que deseja instalar.
Install-Module
ModuleName
-Force
Para usar cmdlets do PowerShell Core em seu script, recomendamos o uso dos módulos AWS.Tools
, conforme mostrado nos comandos a seguir. Substitua cada espaço reservado para recurso de exemplo
por suas próprias informações.
-
Cmdlets do Amazon S3.
Install-Module AWS.Tools.S3 -Force Get-S3Bucket -BucketName
amzn-s3-demo-bucket
-
cmdlets do Amazon EC2
Install-Module AWS.Tools.EC2 -Force Get-EC2InstanceStatus -InstanceId
instance-id
-
cmdlets do AWS Tools for Windows PowerShell comuns ou independentes de serviço.
Install-Module AWS.Tools.Common -Force Get-AWSRegion
Se o script inicializar novos objetos além de usar cmdlets do PowerShell Core, você também deverá importar o módulo conforme mostrado no comando a seguir.
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 obter exemplos de instalação e importação dos módulos AWS.Tools
e do uso de cmdlets do PowerShell Core em runbooks, consulte Experiência de design visual para runbooks de automação.
Entrada
Forneça as informações necessárias para executar o script. Substitua cada espaço reservado para recurso de exemplo
por suas próprias informações.
nota
O anexo de um script Python pode ser um arquivo .py ou um arquivo .zip contendo o script. É necessário armazenar os scripts do PowerShell em arquivos .zip.
- Runtime
-
A linguagem do runtime a ser usada para executar o script fornecido. O
aws:executeScript
oferece suporte a 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
) e PowerShell 7.0 (dotnetcore3.1
) e a scripts PowerShell 7.4 (dotnet8
).Valores compatíveis:
python3.7
|python3.8
|python3.9
|python3.10
|python3.11
|PowerShell Core 6.0
|PowerShell 7.0
|PowerShell 7.4
Tipo: string
Obrigatório: Sim
nota
Para runtimes Python, o ambiente fornece 512 MB de memória e 512 MB de espaço em disco. Para runtimes PowerShell, o ambiente fornece 1024 MB de memória e 512 MB de espaço em disco.
- Manipulador
-
Escolha o nome da função. É necessário garantir que a função definida no manipulador tenha dois parâmetros,
events
econtext
. O runtime do PowerShell não oferece suporte a este parâmetro.Tipo: String
Obrigatório: sim (Python) | sem suporte (PowerShell)
- InputPayload
-
Um objeto JSON ou YAML que será passado para o primeiro parâmetro do manipulador. Isso pode ser usado para passar dados de entrada para o script.
Tipo: String
Obrigatório: não
- Script
-
Um script incorporado que você precisa executar durante a execução da automação.
Tipo: String
Obrigatório: não (Python) | sim (PowerShell)
- Attachment
-
O nome de um arquivo de script autônomo ou arquivo .zip que pode ser invocado pela ação. Especifique o mesmo valor do
Name
do arquivo de anexo de documento especificado no parâmetro de solicitação deAttachments
. Para obter mais informações, consulte Anexos na Referência de API do AWS Systems Manager. Se você estiver fornecendo um script usando um anexo, você deverá definir uma seçãofiles
nos elementos de nível superior do seu runbook. Para obter mais informações, consulte Versão 0.3 do esquema.Para invocar um arquivo para Python, use o formato
filename.method_name
noHandler
.nota
O anexo de um script Python pode ser um arquivo .py ou um arquivo .zip contendo o script. É necessário armazenar os scripts do PowerShell em arquivos .zip.
Ao incluir bibliotecas Python em seu anexo, recomendamos adicionar um arquivo
__init__.py
em cada diretório do módulo. Isso permite que você importe os módulos da biblioteca em seu anexo dentro do conteúdo do script. Por exemplo:from library import module
Tipo: String
Obrigatório: Não
Saída
- Carga útil
-
A representação JSON do objeto retornado pela função. Até 100 KB é retornado. Se você gerar uma lista, haverá o retorno de no máximo de 100 itens.
Usar anexos com aws:executeScript
Os anexos fornecem uma maneira poderosa de empacotar e reutilizar scripts complexos, vários módulos e dependências externas com suas ações aws:executeScript
. Use anexos quando precisar:
-
Empacotar vários módulos Python ou scripts PowerShell juntos.
-
Reutilizar a mesma lógica de script em vários runbooks.
-
Incluir bibliotecas ou dependências externas em seus scripts.
-
Manter a definição do seu runbook limpa separando a lógica complexa do script.
-
Compartilhar pacotes de scripts entre equipes ou fluxos de trabalho de automação.
Estrutura e empacotamento de anexos
Você pode anexar arquivos únicos ou pacotes zip contendo vários arquivos. A estrutura depende do seu caso de uso:
Anexos de arquivo único
Para scripts simples, você pode anexar um único arquivo .py
(Python) ou um arquivo .zip
contendo um único script PowerShell.
Pacotes de vários módulos
Para automação complexa que requer vários módulos, crie um pacote zip com a seguinte estrutura 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 pacotes Python, você deve incluir um arquivo __init__.py
vazio em cada diretório que contém módulos Python. Isso permite importar módulos usando a sintaxe de importação padrão do Python, como from utils import helper_functions
.
Estrutura do pacote PowerShell
Os anexos PowerShell devem ser empacotados em arquivos zip com a seguinte estrutura:
my-powershell-package.zip ├── Main.ps1 # Entry point script ├── Modules/ │ ├── HelperFunctions.ps1 # Utility functions │ └── AWSOperations.ps1 # AWS-specific operations └── Config/ └── Settings.ps1 # Configuration settings
Criar runbooks com anexos
Siga estas etapas para criar runbooks que usam anexos:
-
Faça o upload do seu anexo para o Amazon S3
Carregue seu arquivo de script ou pacote zip em um bucket do S3 que possa ser acessado por seu perfil de automação. Anote o URI do S3 para uso na próxima etapa.
aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
-
Calcule a soma de verificação do anexo
Calcule a soma de verificação SHA-256 do arquivo de anexo para verificação de segurança:
# Linux/macOS shasum -a 256 my-automation-package.zip # Windows PowerShell Get-FileHash -Algorithm SHA256 my-automation-package.zip
-
Defina a seção de arquivos em seu runbook
Adicione uma seção
files
no nível superior do seu runbook para fazer referência ao seu anexo:files: my-automation-package.zip: sourceType: "S3" sourceInfo: path: "s3://my-automation-bucket/scripts/my-automation-package.zip" checksums: sha256: "your-calculated-checksum-here"
-
Faça referência ao anexo em sua etapa executeScript
Use o parâmetro
Attachment
para fazer referência ao seu arquivo enviado:- name: runMyScript action: aws:executeScript inputs: Runtime: python3.11 Handler: main.process_data Attachment: my-automation-package.zip InputPayload: inputData: "{{InputParameter}}"
Exemplos de anexos aws:executeScript
Os exemplos a seguir demonstram maneiras diferentes de usar anexos com a ação aws:executeScript
.
Exemplo 1: anexo de arquivo único
Este exemplo mostra como usar um único arquivo Python como anexo para processar dados da instância do EC2.
Arquivo do anexo: process_instance.py
Crie um arquivo Python com o seguinte conteúdo:
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
Aqui está o runbook completo que usa o anexo de arquivo ú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
Exemplo 2: pacote de vários módulos
Este exemplo demonstra o uso de um pacote zip contendo vários módulos Python para operações complexas de bucket do S3.
Estrutura do pacote
Crie um pacote zip com a seguinte estrutura:
s3-operations.zip ├── main.py ├── utils/ │ ├── __init__.py │ ├── s3_helper.py │ └── validation.py └── config/ ├── __init__.py └── settings.py
main.py (ponto de entrada)
O script principal que orquestra as operações:
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
Solução de problemas de anexos aws:executeScript
Use as diretrizes a seguir para resolver problemas comuns com anexos aws:executeScript
:
Erros de importação de módulos
Se você receber erros de importação ao usar pacotes com vários módulos:
-
Certifique-se de ter incluído um arquivo
__init__.py
vazio em cada diretório contendo módulos Python. -
Verifique se suas instruções de importação correspondem à estrutura real de arquivos e diretórios em seu pacote zip.
-
Use importações relativas (por exemplo,
from .utils import helper
) ou importações absolutas (por exemplo,from utils import helper
) de forma consistente.
Erros de anexo não encontrado
Se sua automação não conseguir encontrar o anexo:
-
Verifique se o valor do parâmetro
Attachment
corresponde exatamente à chave em sua seçãofiles
. -
Verifique se o caminho e o nome do arquivo do bucket do S3 estão corretos na seção
files
. -
Certifique-se de que seu perfil de automação tenha permissão
s3:GetObject
para a localização do anexo do S3. -
Verifique se a soma de verificação em seu runbook corresponde à soma de verificação real do arquivo.
Erros de função do manipulador
Se você receber erros relacionados ao manipulador:
-
Em Python: use o formato
filename.function_name
no parâmetroHandler
(por exemplo,main.process_data
). -
Certifique-se de que sua função de manipulador aceite exatamente dois parâmetros:
events
econtext
. -
Em PowerShell: não especifique um parâmetro
Handler
; o script é executado diretamente.
Falhas de execução de script
Se o script falhar durante a execução:
-
Verifique o histórico de execução da automação para mensagens de erro detalhadas e rastreamentos de pilha.
-
Use instruções
print()
(Python) ouWrite-Information
(PowerShell) para adicionar a saída de depuração. -
Verifique se todas as permissões AWS necessárias foram concedidas à sua função de automação.
-
Teste a lógica do seu script localmente antes de empacotá-lo como um anexo.
Tratamento de erros e códigos de saída
Para lidar adequadamente com erros e códigos de saída de retorno:
-
Em Python: use
raise Exception("error message")
para indicar falha no script. -
Em PowerShell: use
throw "error message"
ouWrite-Error
para indicar falha. -
Retorne dados estruturados de suas funções para fornecer informações detalhadas de êxito/falha.
-
Use blocos try-catch para lidar com exceções de forma elegante e fornecer mensagens de erro significativas.