aws:executeScript – スクリプトを実行する - AWS Systems Manager

aws:executeScript – スクリプトを実行する

指定されたランタイムとハンドラを使用して、提供された Python または PowerShell スクリプトを実行します。各 aws:executeScript アクションは、最大 600 秒 (10 分) 実行できます。timeoutSeconds ステップで aws:executeScript パラメータを指定して、タイムアウトを制限または延長することができます。

関数でリターンステートメントを使用して、出力ペイロードに出力を追加します。aws:executeScript アクションの出力の定義例については、「例 2: スクリプト化されたランブック」を参照してください。ランブック内にある aws:executeScript アクションからの出力は、指定した Amazon CloudWatch Logs ロググループに送信することもできます。詳しくは、「CloudWatch Logs を使用した自動アクション出力のログ記録」を参照してください。

aws:executeScript アクションからの出力を CloudWatch Logs に送信する場合、または aws:executeScript アクションに指定するスクリプトが AWS API オペレーションを呼び出す場合、ランブックを実行するには AWS Identity and Access Management (IAM) サービスロール (または引き受けロール) が常に必要です。

aws:executeScript アクションには、次のプレインストールされた PowerShell Core モジュールが含まれています。

  • Microsoft.PowerShell.Host

  • Microsoft.PowerShell.Management

  • Microsoft.PowerShell.Security

  • Microsoft.PowerShell.Utility

  • PackageManagement

  • PowerShellGet

プレインストールされていない PowerShell Core モジュールを使用するには、次のコマンドに示すように、スクリプトで -Force フラグを使用してモジュールをインストールする必要があります。AWSPowerShell.NetCore モジュールはサポートされていません。インストールするモジュールの ModuleName を置き換えます。

Install-Module ModuleName -Force

スクリプトで PowerShell Core コマンドレットを使用するには、次のコマンドに示すように、AWS.Tools モジュールを使用することをお勧めします。各リソースプレースホルダーの例をユーザー自身の情報に置き換えます。

  • Amazon S3 コマンドレット。

    Install-Module AWS.Tools.S3 -Force Get-S3Bucket -BucketName amzn-s3-demo-bucket
  • Amazon EC2 コマンドレット。

    Install-Module AWS.Tools.EC2 -Force Get-EC2InstanceStatus -InstanceId instance-id
  • 共通またはサービスに依存しない AWS Tools for Windows PowerShell コマンドレット。

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

スクリプトで PowerShell Core コマンドレットを使用するだけでなく、新しいオブジェクトを初期化する場合は、次のコマンドに示すように、モジュールもインポートする必要があります。

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

AWS.Tools モジュールのインストールとインポートの例、およびランブックにある PowerShell Core コマンドレットの使用例については、「オートメーションランブックのビジュアルデザインエクスペリエンス」を参照してください 。

Input

スクリプトを実行するために必要な情報を入力します。各リソースプレースホルダーの例をユーザー自身の情報に置き換えます。

注記

Python スクリプトの添付ファイルは、.py ファイルでも、スクリプトを含む .zip ファイルでもかまいません。PowerShell スクリプトは .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" } }
ランタイム

提供されたスクリプトの実行に使用するランタイム言語。aws:executeScript は、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) スクリプト、PowerShell 7.4 (dotnet8) スクリプトをサポートしています。

サポートされる値: python3.7 | python3.8 | python3.9 | python3.10 | python3.11 | PowerShell Core 6.0 | PowerShell 7.0 | PowerShell 7.4

タイプ: 文字列

必須: はい

注記

Python ランタイムの場合、環境は 512MB のメモリと 512MB のディスク容量を提供します。PowerShell ランタイムの場合、環境は 1,024 MB のメモリと 512 MB のディスク容量を提供します。

Handler

関数の名前。ハンドラで定義された関数に、eventscontext の 2 つのパラメータがあることを確認する必要があります。PowerShell ランタイムはこのパラメータをサポートしていません。

タイプ: 文字列

必須: はい (Python) | サポートされていません (PowerShell)

InputPayload

ハンドラの最初のパラメータに渡される JSON または YAML オブジェクト。これは、スクリプトに入力データを渡すために使用できます。

型: 文字列

必須: いいえ

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

オートメーションで実行する埋め込みスクリプト。

タイプ: 文字列

必須: いいえ (Python) | はい (PowerShell)

Attachment

アクションによって呼び出すことができるスタンドアロンスクリプトファイルまたは .zip ファイルの名前。Attachments のリクエストパラメータで指定したドキュメント添付ファイルの Name と同じ値を指定します。詳細については、「AWS Systems Manager API リファレンス」の「Attachments」(アタッチメント) を参照してください。アタッチメントを使用してスクリプトを提供する場合は、ランブックのトップレベル要素にある files セクションも定義する必要があります。詳しくは、「スキーマバージョン 0.3」を参照してください。

Python 用のファイルを呼び出すには、filename.method_nameHandler 形式を使用します。

注記

Python スクリプトの添付ファイルは、.py ファイルでも、スクリプトを含む .zip ファイルでもかまいません。PowerShell スクリプトは .zip ファイルに保存する必要があります。

添付ファイルに Python ライブラリを含める場合は、各モジュールディレクトリに空の __init__.py ファイルを追加することをお勧めします。これにより、スクリプトコンテンツ内の添付ファイルのライブラリからモジュールをインポートできます。例: from library import module

型: 文字列

必須: いいえ

Output
ペイロード

関数によって返されるオブジェクトの JSON 形式です。最大 100KB が返されます。リストを出力する場合、最大 100 個の項目が返されます。

aws:executeScript でアタッチメントを使用する

アタッチメントは、複雑なスクリプト、複数のモジュール、外部の依存関係を aws:executeScript アクションでパッケージ化して再利用する強力な方法を提供します。次を行う必要がある場合は、アタッチメントを使用します。

  • 複数の Python モジュールまたは PowerShell スクリプトを一緒にパッケージ化する。

  • 複数のランブックで同じスクリプトロジックを再利用する。

  • スクリプトに外部ライブラリまたは依存関係を含める。

  • 複雑なスクリプトロジックを分離してランブック定義をクリーンに保つ。

  • 複数のチームまたは自動化ワークフロー間でスクリプトパッケージを共有する。

アタッチメントの構造とパッケージ化

単一のファイルまたは複数のファイルを含む zip パッケージをアタッチできます。構造はユースケースに応じて異なります。

単一ファイルのアタッチメント

シンプルなスクリプトの場合、単一の .py ファイル (Python) または単一の PowerShell スクリプトを含む .zip ファイルをアタッチできます。

マルチモジュールパッケージ

複数のモジュールを必要とする複雑な自動化の場合は、次の推奨構造で zip パッケージを作成します。

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
重要

Python パッケージの場合、Python モジュールを含む各ディレクトリに空の __init__.py ファイルを含める必要があります。これにより、from utils import helper_functions のような標準の Python インポート構文を使用してモジュールをインポートできます。

PowerShell パッケージの構造

PowerShell アタッチメントは、次の構造で zip ファイルにパッケージ化する必要があります。

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

アタッチメントを含むランブックを作成する

アタッチメントを使用するランブックを作成するには、次の手順に従います。

  1. Amazon S3 にアタッチメントをアップロードします

    自動化ロールがアクセスできる S3 バケットにスクリプトファイルまたは zip パッケージをアップロードします。後のステップで使用するために S3 の URI を記録します。

    aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
  2. アタッチメントチェックサムを計算します

    セキュリティ検証のためにアタッチメントファイルの SHA-256 チェックサムを計算します。

    # Linux/macOS shasum -a 256 my-automation-package.zip # Windows PowerShell Get-FileHash -Algorithm SHA256 my-automation-package.zip
  3. ランブックのファイルセクションを定義します

    ランブックの最上位に files セクションを追加してアタッチメントを参照します。

    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. executeScript ステップでアタッチメントを参照します

    Attachment パラメータを使用して、アップロードしたファイルを参照します。

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

aws:executeScript アタッチメントの例

次の例は、aws:executeScript アクションでアタッチメントを使用するさまざまな方法を示します。

例 1: 単一ファイルのアタッチメント

この例では、単一の Python ファイルをアタッチメントとして使用して EC2 インスタンスデータを処理する方法を示します。

アタッチメントファイル: process_instance.py

以下のコンテンツを含む Python ファイルを作成します。

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
完全なランブック

単一のファイルアタッチメントを使用する完全なランブックを次に示します。

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

例 2: マルチモジュールパッケージ

この例では、複雑な S3 バケットオペレーションで複数の Python モジュールを含む zip パッケージを使用する方法を示します。

パッケージ構造

次の構造で zip パッケージを作成します。

s3-operations.zip ├── main.py ├── utils/ │ ├── __init__.py │ ├── s3_helper.py │ └── validation.py └── config/ ├── __init__.py └── settings.py
main.py (エントリポイント)

オペレーションをオーケストレーションするメインスクリプト:

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

aws:executeScript アタッチメントのトラブルシューティング

aws:executeScript アタッチメントに関する一般的な問題を解決するには、次のガイダンスを使用してください。

モジュールのインポートエラー

マルチモジュールパッケージの使用時にインポートエラーが発生した場合:

  • Python モジュールを含む各ディレクトリに空の __init__.py ファイルが含まれていることを確認します。

  • インポートステートメントが zip パッケージの実際のファイルとディレクトリ構造と一致していることを確認します。

  • 相対インポート (from .utils import helper など) または絶対インポート (from utils import helper など) を一貫して使用します。

アタッチメントが見つからないエラー

オートメーションでアタッチメントが見つからない場合:

  • Attachment パラメータ値が files セクションのキーに正確に一致することを確認します。

  • files セクションの S3 バケットパスとファイル名が正しいことを確認します。

  • 自動化ロールにアタッチメント S3 の場所に対する s3:GetObject アクセス許可があることを確認します。

  • ランブックのチェックサムが実際のファイルチェックサムと一致することを確認します。

ハンドラー関数のエラー

ハンドラー関連のエラーが発生した場合:

  • Python の場合: Handler パラメータで filename.function_name の形式を使用します (main.process_data など)。

  • ハンドラー関数が eventscontext の 2 つのパラメータのみを受け入れることを確認します。

  • PowerShell の場合: Handler パラメータを指定しないでください。スクリプトは直接実行します。

スクリプト実行の失敗

実行中にスクリプトが失敗した場合:

  • 詳細なエラーメッセージとスタックトレースのオートメーション実行履歴を確認します。

  • print() ステートメント (Python) または Write-Information (PowerShell) を使用してデバッグ出力を追加します。

  • 必要なすべての AWS アクセス許可が自動化ロールに付与されていることを確認します。

  • アタッチメントとしてパッケージ化する前にスクリプトロジックをローカルでテストします。

終了コードとエラー処理

エラーを適切に処理して終了コードを返すには:

  • Python の場合: raise Exception("error message") を使用してスクリプトの失敗を示します。

  • PowerShell の場合: throw "error message" または Write-Error を使用して失敗を示します。

  • 関数から構造化データを返し、詳細な成功/失敗情報を提供します。

  • try-catch ブロックを使用して例外を適切に処理し、意味のあるエラーメッセージを提供します。