AWS CLIを介してEC2インスタンスでスクリプトまたはコマンドを実行するにはどうすればよいですか?


12

新しいEC2 Run Commandニュース記事によると、AWS CLIはリモートEC2インスタンスでスクリプトを実行するための新しいサブコマンドをサポートする必要があります。

しかしaws ec2 help、チェックインしましたが、関連するコマンドが見つかりません。

私はaws経由でインストールしましたapt-get

$ aws --version
aws-cli/1.14.32 Python/3.5.4 Linux/4.12.7-64 botocore/1.8.36

どのサブコマンドを検索する必要がありますか、実行する構文は何ですか、リモートEC2インスタンスのPowerShellで言っipconfigてみましょう。


1
参考までに、その記事は2015年のものなので、「新しい」サブコマンドとは呼びません。私はaws-cli のソースコードリポジトリ(github.com/aws/aws-cli)をチェックアウトしましたが、ドキュメント、例、リリースノート、またはコードをざっと見ただけでは、その言及を見つけることができませんでした。 。私は問題を提出し(github.com/aws/aws-cli/issues/3126)、フィードバックを受け取ったら回答を送信します。
PrestonM 2018

回答:


10

AWS Systems Manager実行コマンドからipconfigを実行するには:

$ aws ssm send-command --document-name "AWS-RunPowerShellScript" --instance-ids "<your instance id>" --parameters commands=ipconfig

注:エラーが発生した場合は、正しいを指定することを検討してください--region

これは、AWS認証情報とCLIが適切に設定されていることを前提としています。詳細については、AW​​S CLI使用したSystems Manager Run Commandウォークスルーを参照してください。


コマンド出力を送信および取得する実際のシェルコマンドの例を次に示します。

cmdid=$(aws ssm send-command --instance-ids "i-ch3ng3th1s" --document-name "AWS-RunPowerShellScript" --parameters commands=ipconfig --query "Command.CommandId" --output text)
aws ssm list-command-invocations --command-id "$cmdid" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

3

aws ssm send-commandコマンドの実行に使用するヘルパーBashスクリプトは次のとおりです。

#/usr/bin/env bash -x
# Script to run PowerShell script on the Windows instance.
instanceId="$1"
cmdId=$(aws ssm send-command --instance-ids "$instanceId" --document-name "AWS-RunPowerShellScript" --query "Command.CommandId" --output text --parameters commands="'${@:2}'")
[ $? -ne 0 ] && { echo "Usage: $0 instance_id command"; exit 1; }
while [ "$(aws ssm list-command-invocations --command-id "$cmdId" --query "CommandInvocations[].Status" --output text)" == "InProgress" ]; do sleep 1; done
aws ssm list-command-invocations --command-id "$cmdId" --details --query "CommandInvocations[*].CommandPlugins[*].Output[]" --output text

使用法:

 ./run_ec2_ps_cmd.sh instance-id command

例:

$ ./run_ec2_ps_cmd.sh i-xyz hostname
ip-xyz

より大きな出力を実行するには、「AWS SSMコマンドの実行時に出力が切り捨てられないようにする方法」を参照してください


ここで実際に最良の例。もっと投票してください。
Sanctus

3

はい、AWS Systems Managerでこれを行うことができます。AWS Systems ManagerのRun Commandを使用すると、EC2とオンプレミスサーバーでコマンドのセットをリモートで安全に実行できます。以下は、これを達成するための大まかな手順です。

インスタンスIAMロールのアタッチ:ec2インスタンスには、ポリシーAmazonSSMFullAccessのIAMロールが必要です。この役割により、インスタンスはSystems Manager APIと通信できます。

SSMエージェントのインストール:EC2インスタンスにはSSMエージェントがインストールされている必要があります。SSMエージェントは、コマンドの実行要求を処理し、コマンドごとにインスタンスを構成します。

コマンドの実行:AWS CLIによる使用例:

次のコマンドを実行して、インスタンスで実行されているサービスを取得します。Instance-IDをec2インスタンスIDに置き換えます。

aws ssm send-command --document-name "AWS-RunShellScript" --comment "listing services" --instance-ids "Instance-ID" --parameters commands="service --status-all" --region us-west-2 --output text

より詳しい情報:こちら


3

AWS SSMのSend-Commandを使用して、非常にクールなことを行います。

Apache Airflowを使用して、必要なEC2-Instanceのすべての構成値を含むJSONファイルである、クラウド形成テンプレート(または略してCFT)を使用して、新しいEC2-Instanceを作成します。また、このCFTには、SSM Send-Commandを使用して後で実行できるように、PythonスクリプトをS3の場所から新しいEC2-Instanceにコピーするブートストラップコマンドもあることに注意してください。これは、Python3およびBoto3ライブラリと呼ばれるAWS SDK for Python3を使用して行います。次に、新しいCFTスタックを作成するコマンドの一部を示します。これにより、新しいEC2-Instanceが作成されます。

import boto3

cft = boto3.client("cloudformation", "us-east-1")

response = cft.create_stack(
    StackName='foobarStackName',
    TemplateBody=json.dumps(json_data))

次に、次のようなものを使用して、新しいEC2-Instance(SSM Send-Commandを使用するために必要)のInstance-IDを取得できます。

response = cft.describe_stacks(
    StackName='foobarStackName',
)

次にwget -q -O - http://169.254.169.254/latest/meta-data/instance-id、Pythonで次のコマンドを実行して、現在のAirflowワーカーのサーバーのEC2-InstanceのインスタンスIDを取得できます。

output = subprocess.Popen(['wget', '-q', '-O', '-', 'http://169.254.169.254/latest/meta-data/instance-id'],
                          stdout=subprocess.PIPE)

# Do some weird stuff to get the value (I'm a Java developer so excuse my bad Python skilz)
instanceId = output.communicate()    
instanceId = str(instanceId).split("'")[1]

今!!!!!! グランドフィナーレのために

次に、作成した新しいEC2-Instanceでスクリプトを実行し、必要なパラメーター/引数をスクリプトに送信します。SSMSend-Commandを送信したサーバーのInstance-IDを含めて、スクリプトが完了したときに新しいEC2-Instanceで実行されている場合、別のSSM Send-CommandをAirflowサーバーに送信して、スクリプトが終了したことを通知できます。これは詳細なしで非常に高いレベルにありますが、それは単にアイデアを示すためです:)

subprocess.run(shlex.split('sudo aws ssm send-command --document-name "AWS-RunShellScript" --parameters commands=["sudo python3 /home/ec2-user/ec2_file_sensor.py ' + filepath + ' ' + batchIdValue + ' ' + source + ' ' + fileType + ' ' + airflowWorkerInstanceId + '"] --instance-ids ' + ec2ResourceInstanceId + ' --region us-east-1'))

これが誰かの助けになったかどうかはわかりませんが、AWS SSMのSend-Commandで何かをするクールで楽しい例です!とはいえ、おそらくコードの臭いxD

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.