AWS re:Postを使用することにより、以下に同意したことになります 利用規約

LambdaからEC2 Run Commandを実行する方法(Windows)

0

EC2インスタンス(Windows)にあるbatファイルを、Lambdaから EC2 Run Command で、実行したいです。

下記記事を参考にコードソースを書きました。

【初心者向け】AWS LambdaからEC2 Run Commandを実行する方法 https://zenn.dev/yokota/articles/3875da641b4cc5

Lambdaのコードの下記パラメータを修正することで、Linux環境では、EC2インスタンス環境のbatを実行することが出来ています。

DocumentName: 'AWS-RunPowerShellScript',
InstanceIds: ['対象のインスタンスID'],
commands: ['test_win.bat'], 
workingDirectory:['C:\Users\administrator\temp'] 

今度はWindows環境のInstanceIdsに変更して、TestしてみるとStatusはSucceedeとなり、エラーも出ませんでしたが、batが実行できていませんでした。

前提として、記事で紹介されているroleの作成と、EC2インスタンスへのロール割当、Lamdaへのロール割当は行っています。

どうコードを修正していけば、状況が改善されますでしょうか。 ご協力をお願いします。

以下コード全文です。

'use strict';

const AWS = require('aws-sdk')
const ssm = new (require('aws-sdk/clients/ssm'))();

module.exports.handler = async event => {

	try {
		let params = {
			DocumentName: 'AWS-RunPowerShellScript',
			InstanceIds: ['対象のインスタンスID'],//Windowsインスタンス
			Parameters: {
				commands: ['test_win.bat'], // EC2コマンド
				workingDirectory:['C:\Users\administrator\temp'], // コマンド実行場所
			},
			// SSMの実行結果をCloudWatchにロギング
			CloudWatchOutputConfig: {
				CloudWatchLogGroupName: 'SSMLogs',
				CloudWatchOutputEnabled: true
			},
			// タイムアウト設定
			TimeoutSeconds: 3600 // 1 hour
    		}
		const sendCommandResult = await ssm.sendCommand(params).promise();  
			} catch(e){
    	console.log(e);
	}	

	};

質問済み 11日前181ビュー
1回答
2
承認された回答

コマンドが作成され Success となっているとのことですので、EC2 インスタンス上で Run Command の実行はされているものと考えております。 そのため、Run Command が実行されているものの、bat ファイルが実行できないため、bat ファイルの実行方法について確認したい、との内容として回答いたします。

AWS-RunPowerShellScript は PowerShell を実行するドキュメントです。 PowerShell にて bat ファイルを実行する場合には、以下のように bat ファイルのフルパスを指定する、あるいは Start-Process を利用する必要があります。

C:\Users\administrator\temp\test_win.bat
Start-Process test_win.bat

また、Lambda のコードでは、workingDirectory のパスに含まれる \ がエスケープされていないように見受けられました。 そのため、Lambda のコードとしてはパスに含まれる \ のエスケープも必要と考えられます。

上記の 2 点の対応を行う場合には、下記の 2 行の修正を行う必要があるものと考えられます。

commands: ['test_win.bat'], // EC2コマンド
workingDirectory:['C:\Users\administrator\temp'], // コマンド実行場所

前述の内容を踏まえて、以下のどちらかにて対応いただけるかと思いますのでお試しください。

commands: ['C:\\Users\\administrator\\temp\\test_win.bat'],
workingDirectory:['C:\\Users\\administrator\\temp'],
commands: ['Start-Process test_win.bat'],
workingDirectory:['C:\\Users\\administrator\\temp'],

なお、補足とはなりますが、上記の内容にて bat ファイルを実行する場合、bat ファイルの exit code は Run Command の exit code にはなりません。 bat ファイルの exit code を Run Command の exit code にしたい場合は、下記のように bat ファイルを実行した際の exit code を利用して明示的に exit を実行する形に修正ください。

C:\Users\administrator\temp\test_win.bat
exit $LastExitCode
$process = Start-Process test_win.bat -PassThru -Wait
exit $process.Exitcode
Ando_S
回答済み 8日前
  • ご回答いただいた修正で、無事batの実行が成功しました。 補足いただいた箇所についても修正したく思うのですが、どちらに記述が必要かお教えいただけませんでしょうか。

    ご都合のよいタイミング大丈夫です。 本日は適切なご回答、誠にありがとうございました。

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

質問に答えるためのガイドライン