SSMでEC2を動かしたい
プログラミングエンジニア初心者です。2週間前にAWSを始めました。AWSを使って、Webアプリケーションからのリクエストに応答して、EC2上で処理をした結果を返すということを行いたいと考えています。
Webからの応答をトリガにしたLambda上でSSMを使ってEC2を動かそうとしています。LambdaはJavascriptで、AWS SDK for JavaScript v2を用いています。
発生している問題・エラーメッセージ
テストとして以下のプログラムをEC2上で動かそうとしています。
#!/bin/bash echo test >> test.txt echo test
SSMのsendCommandがエラーもリスポンスもなくコンソール出力されずに正常終了してしまいます。CloudWatchにログを送るようにしていますが、それも出力されていません。実行させるにはどうしたらいいのでしょうか?(IAMポリシーはすべての関係するロールでAdministratorAccessを付与しています。)
AWS System Managerのコンソール上では同様の設定でRun Commandをすると、きちんと実行されてtest.txtにtestが書き込まれてCloudWatchにもtestが出力されています。
LambdaにはCognitoで登録したユーザのアイデンティティプールの認証情報が渡されていて、EC2はrootユーザーで作成したもので、AWS Amplify(AWS Cli)はIAMユーザーで動かしていると思います。Credentialエラーは起こっていないのですが、もしかしたらポリシーの問題なのでしょうか…?
該当のソースコード
javascript
1const AWS = require("aws-sdk"); 2 3const SSM = new AWS.SSM({ region: process.env.REGION }); 4const REMOTE_WORKING_DIR = '/home/ec2-user/environment/test'; 5 6exports.handler = async (event) => { 7 try{ 8 let command = 'sh test.sh'; 9 10 let params = { 11 DocumentName: 'AWS-RunShellScript', 12 InstanceIds: ["**********"], 13 Parameters: { 14 commands: [command], 15 workingDirectory: [REMOTE_WORKING_DIR] 16 }, 17 18 CloudWatchOutputConfig: { 19 CloudWatchOutputEnabled: true 20 }, 21 22 TimeoutSeconds: 3600 23 }; 24 25 console.log(params); 26 27 await SSM.sendCommand(params, function(err, data){ 28 if(err){ 29 console.log("error", err); 30 }else{ 31 console.log("success", data); 32 } 33 }); 34 }catch(e){ 35 console.log("ERROR"); 36 console.log(e); 37 } 38 39 return; 40};
試したこと
直接sendCommandを見たところ、dataもerrorもnullになってしまっていました。
javascript
1const ssmsendcommand = SSM.sendCommand(params); 2console.log(ssmsendcommand);
Request { domain: null, service: Service { config: Config { credentials: [EnvironmentCredentials], credentialProvider: [CredentialProviderChain], region: 'ap-northeast-1', logger: null, ・・・ operation: 'sendCommand', params: { DocumentName: 'AWS-RunShellScript', InstanceIds: [ '**********' ], Parameters: { commands: [Array], workingDirectory: [Array] }, CloudWatchOutputConfig: { CloudWatchOutputEnabled: true }, TimeoutSeconds: 3600 }, ・・・ response: Response { request: [Circular], data: null, error: null, retryCount: 0, redirectCount: 0, httpResponse: HttpResponse { statusCode: undefined, headers: {}, body: undefined, streaming: false, stream: null }, maxRetries: 3, maxRedirects: 10 },
AWS Systen Managerのコンソール上での実行したものになります。
このCli用のコマンドをコピーして手元で実行してみても、やはりtest.txtにはtestが記入されませんでした。
このCli用のコマンドをコピーしてCliで実行しても正しく動きました。
補足情報(FW/ツールのバージョンなど)
Javascriptで、AWS SDK for JavaScript v2を用いています。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー