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 ファイルに保存する必要があります。
- ランタイム
-
提供されたスクリプトの実行に使用するランタイム言語。
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
-
関数の名前。ハンドラで定義された関数に、
events
とcontext
の 2 つのパラメータがあることを確認する必要があります。PowerShell ランタイムはこのパラメータをサポートしていません。タイプ: 文字列
必須: はい (Python) | サポートされていません (PowerShell)
- InputPayload
-
ハンドラの最初のパラメータに渡される JSON または YAML オブジェクト。これは、スクリプトに入力データを渡すために使用できます。
型: 文字列
必須: いいえ
- Script
-
オートメーションで実行する埋め込みスクリプト。
タイプ: 文字列
必須: いいえ (Python) | はい (PowerShell)
- Attachment
-
アクションによって呼び出すことができるスタンドアロンスクリプトファイルまたは .zip ファイルの名前。
Attachments
のリクエストパラメータで指定したドキュメント添付ファイルのName
と同じ値を指定します。詳細については、「AWS Systems Manager API リファレンス」の「Attachments」(アタッチメント) を参照してください。アタッチメントを使用してスクリプトを提供する場合は、ランブックのトップレベル要素にあるfiles
セクションも定義する必要があります。詳しくは、「スキーマバージョン 0.3」を参照してください。Python 用のファイルを呼び出すには、
filename.method_name
のHandler
形式を使用します。注記
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
アタッチメントを含むランブックを作成する
アタッチメントを使用するランブックを作成するには、次の手順に従います。
-
Amazon S3 にアタッチメントをアップロードします
自動化ロールがアクセスできる S3 バケットにスクリプトファイルまたは zip パッケージをアップロードします。後のステップで使用するために S3 の URI を記録します。
aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
-
アタッチメントチェックサムを計算します
セキュリティ検証のためにアタッチメントファイルの SHA-256 チェックサムを計算します。
# Linux/macOS shasum -a 256 my-automation-package.zip # Windows PowerShell Get-FileHash -Algorithm SHA256 my-automation-package.zip
-
ランブックのファイルセクションを定義します
ランブックの最上位に
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"
-
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
など)。 -
ハンドラー関数が
events
とcontext
の 2 つのパラメータのみを受け入れることを確認します。 -
PowerShell の場合:
Handler
パラメータを指定しないでください。スクリプトは直接実行します。
スクリプト実行の失敗
実行中にスクリプトが失敗した場合:
-
詳細なエラーメッセージとスタックトレースのオートメーション実行履歴を確認します。
-
print()
ステートメント (Python) またはWrite-Information
(PowerShell) を使用してデバッグ出力を追加します。 -
必要なすべての AWS アクセス許可が自動化ロールに付与されていることを確認します。
-
アタッチメントとしてパッケージ化する前にスクリプトロジックをローカルでテストします。
終了コードとエラー処理
エラーを適切に処理して終了コードを返すには:
-
Python の場合:
raise Exception("error message")
を使用してスクリプトの失敗を示します。 -
PowerShell の場合:
throw "error message"
またはWrite-Error
を使用して失敗を示します。 -
関数から構造化データを返し、詳細な成功/失敗情報を提供します。
-
try-catch ブロックを使用して例外を適切に処理し、意味のあるエラーメッセージを提供します。