AWS CLI를 통해 EC2 인스턴스에서 스크립트 또는 명령을 실행하는 방법은 무엇입니까?


13

에 따르면 새로운 EC2 실행 명령의 뉴스 기사, 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

어떤 하위 명령을 내가 찾아야 및하자 말을 실행할 수있는 구문 무엇 ipconfigPowerShell을 원격 EC2 인스턴스는?


1
참고로이 기사는 2015 년부터 작성되었으므로 "새"하위 명령이라고 부르지 않습니다. aws-cli 의 소스 코드 저장소 ( github.com/aws/aws-cli )를 확인했으며 문서, 예제, 릴리스 노트 또는 코드를 간략하게 살펴보면 언급 할 수 없었습니다. . 문제를 제출하고 ( github.com/aws/aws-cli/issues/3126 ) 피드백을 받으면 답변을 제출합니다.
PrestonM

답변:


11

AWS Systems Manager Run Command에서 ipconfig를 실행하려면

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

참고 : 오류가 발생하면 right를 지정하십시오 --region.

AWS 자격 증명과 CLI가 올바르게 구성되어 있다고 가정합니다. 자세한 내용 은 AWS 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

더 자세한 정보 : here


3

다음은 AWS SSM Send-Command로 수행하는 멋진 기능입니다!

Apache Airflow를 사용하여 원하는 EC2-Instance의 모든 구성 값이 포함 된 JSON 파일 인 Cloud Formation Template (또는 CFT)을 사용하여 새로운 EC2-Instance를 만듭니다. 또한이 CFT에는 S3 위치에서 새 EC2- 인스턴스로 Python 스크립트를 복사하여 나중에 SSM Send-Command를 사용하여 실행할 수있는 부트 스트랩 명령도 있습니다! Python3과 Boto3 라이브러리라는 Python3 용 AWS SDK를 사용하여이 작업을 수행합니다. 다음은 새로운 EC2 인스턴스를 생성하는 새로운 CFT 스택 생성 명령의 일부입니다.

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-idPython을 통해이 명령 을 실행하여 현재 Airflow Worker 서버의 EC2-Instance의 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에서 스크립트를 실행하고 스크립트를 완료 할 때 SSM Send-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.