

• AWS Systems Manager CloudWatch 대시보드는 2026년 4월 30일 이후에는 더 이상 사용할 수 없습니다. 고객은 Amazon CloudWatch 콘솔을 계속 사용하여 현재와 마찬가지로 Amazon CloudWatch 대시보드를 보고, 생성하고, 관리할 수 있습니다. 자세한 내용은 [Amazon CloudWatch 대시보드 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)를 참조하세요.

# AWS Systems Manager Run Command
<a name="run-command"></a>

AWS Systems Manager의 도구인 Run Command를 사용하여 관리형 노드의 구성을 원격으로 안전하게 관리할 수 있습니다. **관리형 노드는 Systems Manager용으로 구성된 [하이브리드 및 멀티클라우드](operating-systems-and-machine-types.md#supported-machine-types) 환경의 모든 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 또는 비 EC2 시스템입니다. Run Command를 사용하면 일반적인 관리 작업을 자동화하고 대규모로 일회성 구성 변경을 수행할 수 있습니다. AWS Management Console, AWS Command Line Interface(AWS CLI), AWS Tools for Windows PowerShell 또는 AWS SDK에서 Run Command를 사용할 수 있습니다. Run Command는 무료로 제공됩니다. Run Command를 시작하려면 [Systems Manager 콘솔](https://console.aws.amazon.com//systems-manager/run-command)을 엽니다. 탐색 창에서 **Run Command**를 선택합니다.

관리자는 Run Command를 사용하여 부트스트랩 애플리케이션 설치, 배포 파이프라인 구축, Auto Scaling 그룹에서 인스턴스가 제거될 때 로그 파일 캡처, 인스턴스를 Windows 도메인에 조인합니다.

API를 지원하는 시스템의 분산 특성으로 인해 Run Command API는 결과적 일관성 모델을 따릅니다. 이것은 리소스에 영향을 미치는 API 명령을 실행한 결과가 모든 후속 명령에 즉시 표시되지 않을 수 있음을 의미합니다. 이전 API 명령 바로 다음에 API 명령을 실행할 때는 이 점을 염두에 두어야 합니다.

**시작하기**  
아래 표에는 Run Command를 처음 사용하는 데 도움이 되는 정보가 나와 있습니다.


****  

| 주제 | 세부 정보 | 
| --- | --- | 
|  [AWS Systems Manager에 대한 관리형 노드 설정](systems-manager-setting-up-nodes.md)  |  [하이브리드 및 멀티클라우드](operating-systems-and-machine-types.md#supported-machine-types) 환경의 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스 및 비 EC2 시스템에 대한 설정 요구 사항을 완료했는지 확인합니다.  | 
|  [Systems Manager로 하이브리드 및 멀티클라우드 환경에서 노드 관리](systems-manager-hybrid-multicloud.md)  |  (옵션) Run Command를 사용하여 관리할 수 있도록 온프레미스 서버와 VM을 AWS에 등록합니다.  | 
|  [Systems Manager를 통한 엣지 디바이스 관리](systems-manager-setting-up-edge-devices.md)  |  (선택 사항) Run Command를 사용하여 관리할 수 있도록 엣지 디바이스를 구성합니다.  | 
|  [관리형 노드에서 명령 실행](running-commands.md)  |  AWS Management Console을 사용하여 하나 이상의 관리되는 노드를 대상으로 하는 명령을 실행하는 방법에 대해 알아봅니다.  | 
|  [Run Command 연습](run-command-walkthroughs.md)  |  Tools for Windows PowerShell 또는 AWS CLI를 사용하여 명령을 실행하는 방법에 대해 알아봅니다.  | 

**EventBridge 지원**  
이 Systems Manager 도구는 Amazon EventBridge 규칙에서 *이벤트* 유형과 *대상* 유형으로 모두 지원됩니다. 자세한 내용은 [Amazon EventBridge로 Systems Manager 이벤트 모니터링](monitoring-eventbridge-events.md) 및 [참조: Systems Manager용 Amazon EventBridge 이벤트 패턴 및 유형](reference-eventbridge-events.md) 섹션을 참조하세요.

**추가 정보**  
+ [EC2 인스턴스에서 원격으로 Run Command 실행(10분 자습서)](https://aws.amazon.com/getting-started/hands-on/remotely-run-commands-ec2-instance-systems-manager/)
+ **Amazon Web Services 일반 참조의 [Systems Manager 서비스 할당량](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)
+ [AWS Systems Manager API 레퍼런스](https://docs.aws.amazon.com/systems-manager/latest/APIReference/) 

**Topics**
+ [Run Command 설정](run-command-setting-up.md)
+ [관리형 노드에서 명령 실행](running-commands.md)
+ [명령에 종료 코드 사용](run-command-handle-exit-status.md)
+ [명령 상태 이해](monitor-commands.md)
+ [Run Command 연습](run-command-walkthroughs.md)
+ [Systems Manager Run Command 문제 해결](troubleshooting-remote-commands.md)

# Run Command 설정
<a name="run-command-setting-up"></a>

AWS Systems Manager의 도구인 Run Command를 사용하여 노드를 관리하려면 먼저 명령을 실행할 사용자에 대해 AWS Identity and Access Management(IAM) 정책을 구성합니다. IAM 정책에서 `SendCommand` 작업에 글로벌 조건 키를 사용하는 경우 `aws:ViaAWSService` 조건 키를 포함하고 부울 값을 `true`로 설정해야 합니다. 다음은 예입니다.

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand"
            ],
            "Resource": [
                "arn:aws:ssm:us-east-1:111122223333:document/YourDocument"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:SourceVpce": [
                        "vpce-1234567890abcdef0"
                    ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:SendCommand"
            ],
            "Resource": [
                "arn:aws:ssm:us-east-1:111122223333:document/YourDocument"
            ],
            "Condition": {
                "Bool": {
                    "aws:ViaAWSService": "true"
                }
            }
        }
    ]
}
```

------

Systems Manager에 대한 노드를 구성해야 합니다. 자세한 내용은 [AWS Systems Manager에 대한 관리형 노드 설정](systems-manager-setting-up-nodes.md) 섹션을 참조하세요.

또한 다음과 같은 선택적 설정 작업을 완료하여 관리형 노드의 보안 상태 및 일상적인 관리를 최소화하는 것이 좋습니다.

Amazon EventBridge를 사용하여 명령 실행 모니터링  
EventBridge를 사용하여 명령 실행 상태 변경 사항을 기록할 수 있습니다. 상태가 달라질 때마다 또는 관심이 있는 상태로 변경될 때 실행되는 규칙을 만들면 됩니다. EventBridge 이벤트가 발생할 때 Run Command를 대상 작업으로 지정할 수도 있습니다. 자세한 내용은 [Systems Manager 이벤트에 대해 EventBridge 구성](monitoring-systems-manager-events.md) 섹션을 참조하세요.

Amazon CloudWatch Logs를 사용하여 명령 실행 모니터링  
모든 명령 출력 및 오류 로그를 정기적으로 Amazon CloudWatch 로그 그룹에 보내도록 Run Command를 구성할 수 있습니다. 거의 실시간으로 이러한 출력 로그를 모니터링하고, 특정 구문, 값 또는 패턴을 검색하며, 검색을 기반으로 경보를 생성할 수 있습니다. 자세한 내용은 [Run Command에 대한 Amazon CloudWatch Logs 구성](sysman-rc-setting-up-cwlogs.md) 섹션을 참조하세요.

특정 관리형 노드 Run Command 액세스 제한  
AWS Identity and Access Management(IAM)을 사용하여 관리되는 노드에서 명령을 실행하는 사용자의 기능을 제한할 수 있습니다. 특히 사용자가 특정 태그에 지정된 관리형 노드에서만 명령을 실행할 수 있도록 하는 조건이 포함된 IAM 정책을 생성할 수 있습니다. 자세한 내용은 [태그를 기반으로 Run Command 액세스 제한](#tag-based-access) 섹션을 참조하세요.

## 태그를 기반으로 Run Command 액세스 제한
<a name="tag-based-access"></a>

이 섹션에서는 IAM 정책에서 태그 조건을 지정하여 관리형 노드에서 명령을 실행하는 사용자의 기능을 제한하는 방법에 대해 설명합니다. 관리형 노드에는 Systems Manager용으로 구성된 [하이브리드 및 멀티클라우드](operating-systems-and-machine-types.md#supported-machine-types) 환경의 Amazon EC2 인스턴스 및 비 EC2 노드가 포함됩니다. 정보가 명시적으로 표시되지 않지만 관리형 AWS IoT Greengrass 코어 디바이스에 대한 액세스를 제한할 수도 있습니다. 시작하려면 AWS IoT Greengrass 디바이스에 태그를 지정해야 합니다. 자세한 내용은 *AWS IoT Greengrass Version 2 개발자 안내서*에서 [AWS IoT Greengrass Version 2 리소스 태그하기](https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html) 섹션을 참조하세요.

사용자가 특정 태그에 지정된 관리형 노드에 대해서만 명령을 실행할 수 있도록 하는 조건이 포함된 IAM 정책을 생성하여 명령 실행을 특정 노드로 제한할 수 있습니다. 다음 예에서 사용자는 노드가 Finance WebServer(`ssm:resourceTag/Finance: WebServer`)인 상태에서 노드(`Resource: arn:aws:ec2:*:*:instance/*`)의 SSM 문서(`Resource: arn:aws:ssm:*:*:document/*`)를 통해 Run Command(`Effect: Allow, Action: ssm:SendCommand`)를 사용할 수 있습니다. 사용자가 태그 지정되지 않았거나 `Finance: WebServer` 이외의 태그가 있는 노드에 명령을 보내는 경우 실행 결과는 `AccessDenied`로 표시됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":[
            "arn:aws:ssm:*:*:document/*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":[
            "arn:aws:ec2:*:*:instance/*"
         ],
         "Condition":{
            "StringLike":{
               "ssm:resourceTag/Finance":[
                  "WebServers"
               ]
            }
         }
      }
   ]
}
```

------

사용자가 여러 태그로 지정된 관리형 노드에 대해 명령을 실행하도록 허용하는 IAM 정책을 생성할 수 있습니다. 다음 정책은 두 태그를 포함하는 관리형 노드에서 사용자가 명령을 실행하도록 허용합니다. 사용자가 두 태그 모두에 지정되지 않은 노드에 명령을 전송할 경우 실행 결과가 `AccessDenied`로 표시됩니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":"*",
         "Condition":{
            "StringLike":{
               "ssm:resourceTag/tag_key1":[
                  "tag_value1"
               ],
               "ssm:resourceTag/tag_key2":[
                  "tag_value2"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":[
            "arn:aws:ssm:us-west-1::document/AWS-*",
            "arn:aws:ssm:us-east-2::document/AWS-*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:UpdateInstanceInformation",
            "ssm:ListCommands",
            "ssm:ListCommandInvocations",
            "ssm:GetDocument"
         ],
         "Resource":"*"
      }
   ]
}
```

------

사용자가 여러 태그로 지정된 관리형 노드 그룹에 대해 명령을 실행하도록 허용하는 IAM 정책을 생성할 수도 있습니다. 다음 정책 예시는 태그 지정된 노드 그룹 중 하나 또는 두 그룹 모두에 대해 명령을 실행하도록 허용합니다.

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":"*",
         "Condition":{
            "StringLike":{
               "ssm:resourceTag/tag_key1":[
                  "tag_value1"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":"*",
         "Condition":{
            "StringLike":{
               "ssm:resourceTag/tag_key2":[
                  "tag_value2"
               ]
            }
         }
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:SendCommand"
         ],
         "Resource":[
            "arn:aws:ssm:us-west-1::document/AWS-*",
            "arn:aws:ssm:us-east-2::document/AWS-*"
         ]
      },
      {
         "Effect":"Allow",
         "Action":[
            "ssm:UpdateInstanceInformation",
            "ssm:ListCommands",
            "ssm:ListCommandInvocations",
            "ssm:GetDocument"
         ],
         "Resource":"*"
      }
   ]
}
```

------

IAM 정책 생성에 대한 자세한 내용은 **IAM 사용 설명서의 [관리형 정책과 인라인 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html)을 참조하세요. 관리형 노드 태그 지정에 대한 자세한 내용은 *AWS Resource Groups 사용 설명서의 *[태그 에디터](https://docs.aws.amazon.com/ARG/latest/userguide/tag-editor.html)를 참조하세요.

# 관리형 노드에서 명령 실행
<a name="running-commands"></a>

이 섹션에는 AWS Systems Manager 콘솔에서 관리형 노드로 명령을 전송하는 방법에 대한 정보가 포함되어 있습니다. 이 단원에는 명령을 취소하는 방법에 대한 정보도 나와 있습니다.

노드가 var 디렉터리에 대한 `noexec` 탑재 옵션으로 구성된 경우 Run Command는 명령을 성공적으로 실행할 수 없습니다.

**중요**  
Run Command를 사용해 명령을 보낼 때 암호, 구성 데이터 또는 기타 보안 암호와 같이 민감한 정보는 일반 텍스트 형식으로 포함하지 않습니다. 계정의 모든 Systems Manager API 활동은 AWS CloudTrail 로그를 위해 S3 버킷에 기록됩니다. 즉, 해당 S3 버킷에 대한 액세스 권한이 있는 사용자는 그러한 보안 암호의 일반 텍스트 값을 볼 수 있습니다. 따라서 `SecureString` 파라미터를 생성하고 사용하여 Systems Manager 작업에 사용하는 민감한 데이터를 암호화하는 것이 좋습니다.  
자세한 내용은 [IAM 정책을 사용하여 Parameter Store 파라미터에 대한 액세스 제한](sysman-paramstore-access.md) 섹션을 참조하세요.

**실행 이력 유지**  
각 명령의 기록은 최대 30일 동안 사용할 수 있습니다. 또한 모든 로그 파일의 사본을 Amazon Simple Storage Service에 저장하거나 모든 API 직접 호출의 감사 추적을 AWS CloudTrail에서 보유할 수 있습니다.

**관련 정보**  
다른 도구를 사용하여 명령을 전송하는 방법에 대한 자세한 내용은 아래 주제를 참조하세요.
+ [연습: Run Command에서 AWS Tools for Windows PowerShell 사용](walkthrough-powershell.md) 또는 [AWS Tools for PowerShell Cmdlet Reference의 AWS Systems Manager 섹션](https://docs.aws.amazon.com/powershell/latest/reference/items/AWS_Systems_Manager_cmdlets.html)에 있는 예제
+ [연습: Run Command에서 AWS CLI 사용](walkthrough-cli.md) 또는 [SSM CLI Reference](https://docs.aws.amazon.com/cli/latest/reference/ssm/)의 예제

**Topics**
+ [콘솔에서 명령 실행](running-commands-console.md)
+ [특정 문서 버전을 사용하여 명령 실행](run-command-version.md)
+ [대규모로 명령 실행](send-commands-multiple.md)
+ [명령 취소](cancel-run-command.md)

# 콘솔에서 명령 실행
<a name="running-commands-console"></a>

AWS Management Console에서 AWS Systems Manager의 도구인 Run Command를 사용하여 로그인하지 않고도 관리형 노드를 구성할 수 있습니다. 이 주제에는 Run Command를 사용하여 관리형 노드에서 [SSM Agent를 업데이트](run-command-tutorial-update-software.md#rc-console-agentexample)하는 방법을 보여주는 예가 포함되어 있습니다.

**시작하기 전 준비 사항**  
Run Command를 사용하여 명령을 보내기 전에 관리형 노드에서 모든 Systems Manager [설정 요구 사항](systems-manager-setting-up-nodes.md)을 충족하는지 확인합니다.

**Run Command를 사용하여 명령을 전송하려면**

1. AWS Systems Manager 콘솔([https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/))을 엽니다.

1. 탐색 창에서 **Run Command**를 선택합니다.

1. **Run command**(Run 명령)를 선택합니다.

1. **Command 문서(Command document)** 목록에서 Systems Manager 문서를 선택합니다.

1. **명령 파라미터** 섹션에서 필요한 파라미터의 값을 지정합니다.

1. **Targets**(대상) 섹션에서, 태그를 지정하거나, 수동으로 인스턴스나 엣지 디바이스를 선택하거나, 리소스 그룹을 지정하여 이 작업을 실행할 관리형 노드를 식별합니다.
**작은 정보**  
예상한 관리형 노드가 목록에 없으면 [관리형 노드 가용성 문제 해결](fleet-manager-troubleshooting-managed-nodes.md)에서 문제 해결 팁을 참조하세요.

1. **Other parameters**(다른 파라미터):
   + **Comment**(설명)에 명령에 대한 정보를 입력합니다.
   + **제한 시간(초)**에서 전체 명령 실행이 실패할 때까지 시스템이 기다리는 시간을 초 단위로 지정합니다.

1. **Rate control**(속도 제어)에서
   + **Concurrency**(동시성)에서 명령을 동시에 실행할 관리형 노드의 백분율 또는 개수를 지정합니다.
**참고**  
관리형 노드에 적용할 태그를 지정하거나, AWS 리소스 그룹을 지정하여 대상을 선택하였지만 대상으로 지정할 관리형 노드 수를 잘 모를 경우에는 백분율을 지정하여 동시에 문서를 실행할 수 있는 대상 수를 제한합니다.
   + **Error threshold**(오류 임계값)에서, 명령이 노드의 개수 또는 백분율에서 실패한 후 다른 관리형 노드에서 해당 명령의 실행을 중지할 시간을 지정합니다. 예를 들어 세 오류를 지정하면 네 번째 오류를 받았을 때 Systems Manager가 명령 전송을 중지합니다. 여전히 명령을 처리 중인 관리형 노드도 오류를 전송할 수 있습니다.

1. (선택 사항) 모니터링을 위해 명령에 적용할 CloudWatch 경보를 선택합니다. CloudWatch 경보를 명령에 연결하려면 명령을 실행하는 IAM 보안 주체에 `iam:createServiceLinkedRole` 작업에 대한 권한이 있어야 합니다. CloudWatch 경보에 대한 자세한 내용은 [Amazon CloudWatch 경보 사용](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)을 참조하세요. 경보가 활성화되면 보류 중인 명령 호출이 실행되지 않습니다.

1. (선택 사항) **Output options**(출력 옵션)에서 명령 출력을 파일에 저장하려면 **Write command output to an S3 bucket**(S3 버킷에 명령 출력 쓰기) 상자를 선택합니다. 상자에 버킷 및 접두사(폴더) 이름을 입력합니다.
**참고**  
데이터를 S3 버킷에 쓰는 기능을 부여하는 S3 권한은 이 작업을 수행하는 IAM 사용자의 권한이 아니라 인스턴스에 할당된 인스턴스 프로파일(EC2 인스턴스용) 또는 IAM 서비스 역할(하이브리드 정품 인증 시스템)의 권한입니다. 자세한 내용은 [Systems Manager에 필요한 인스턴스 권한 구성](setup-instance-permissions.md)이나 [하이브리드 환경을 위한 IAM 서비스 역할 생성](hybrid-multicloud-service-role.md)을 참조하세요. 또한 지정된 S3 버킷이 다른 AWS 계정에 있는 경우 관리형 노드와 연결된 인스턴스 프로파일 또는 IAM 서비스 역할은 해당 버킷에 쓸 수 있는 권한이 있어야 합니다.

1. **SNS notifications**(SNS 알림) 섹션에서, 명령 실행 상태에 대한 알림이 전송되도록 하려면 **Enable SNS notifications**(SNS 알림 활성화) 확인란을 선택합니다.

   Run Command에 대한 Amazon SNS 알림 구성에 대한 자세한 내용은 [Amazon SNS 알림을 사용하여 Systems Manager 상태 변경 모니터링](monitoring-sns-notifications.md) 섹션을 참조하세요.

1. **Run**(실행)을 선택합니다.

명령을 취소하는 방법에 대한 자세한 내용은 [명령 취소](cancel-run-command.md) 섹션을 참조하세요.

## 명령 실행
<a name="run-command-rerun"></a>

Systems Manager에는 Systems Manager 콘솔의 **Run Command** 페이지에서 명령을 다시 실행하는 2가지 옵션이 있습니다.
+ **Rerun(다시 실행)**: 이 버튼을 사용하면 명령을 변경하지 않고 동일한 명령을 실행할 수 있습니다.
+ **새로 복사(Copy to new)**: 이 버튼은 한 명령의 설정을 새 명령으로 복사하고 실행하기 전에 해당 설정을 편집할 수 있는 옵션을 제공합니다.

**명령을 다시 실행하려면**

1. AWS Systems Manager 콘솔([https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/))을 엽니다.

1. 탐색 창에서 **Run Command**를 선택합니다.

1. 다시 실행할 명령을 선택합니다. 명령 세부 정보 페이지에서 명령을 실행한 직후 명령을 다시 실행할 수 있습니다. 또는 **명령 기록(Command history)** 탭에서 이전에 실행한 명령을 선택할 수 있습니다.

1. **Rerun(다시 실행)**을 선택하여 동일한 명령을 변경 없이 실행하거나, 명령을 실행하기 전에 **새로 복사**를 선택하여 명령 설정을 편집합니다.

# 특정 문서 버전을 사용하여 명령 실행
<a name="run-command-version"></a>

문서 버전 파라미터를 사용하여 명령 실행 시 사용할 AWS Systems Manager 문서 버전을 지정할 수 있습니다. 이 파라미터에는 다음 옵션 중 하나를 지정할 수 있습니다.
+ \$1DEFAULT
+ \$1LATEST
+ 버전 번호

문서 버전 파라미터를 실행하여 명령을 실행하려면 다음 절차를 사용합니다.

------
#### [ Linux ]

**로컬 Linux 시스템에서 AWS CLI를 사용하여 명령을 실행하려면**

1. 아직 하지 않은 경우 AWS Command Line Interface(AWS CLI)을 설치하고 구성합니다.

   자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

1. 사용할 수 있는 모든 문서 나열

   이 명령을 실행하면 AWS Identity and Access Management(IAM) 권한에 따라 계정에 사용할 수 있는 문서를 모두 나열합니다.

   ```
   aws ssm list-documents
   ```

1. 다음 명령을 실행하여 문서의 여러 버전을 확인합니다. *document name*을 사용자의 정보로 바꿉니다.

   ```
   aws ssm list-document-versions \
       --name "document name"
   ```

1. 다음 명령을 실행하여 SSM 문서 버전을 사용하는 명령을 실행합니다. 각 *example resource placeholder*를 사용자의 정보로 바꿉니다.

   ```
   aws ssm send-command \
       --document-name "AWS-RunShellScript" \
       --parameters commands="echo Hello" \
       --instance-ids instance-ID \
       --document-version '$LATEST'
   ```

------
#### [ Windows ]

**로컬 Windows 시스템에서 AWS CLI를 사용하여 명령을 실행하려면**

1. 아직 하지 않은 경우 AWS Command Line Interface(AWS CLI)을 설치하고 구성합니다.

   자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

1. 사용할 수 있는 모든 문서 나열

   이 명령을 실행하면 AWS Identity and Access Management(IAM) 권한에 따라 계정에 사용할 수 있는 문서를 모두 나열합니다.

   ```
   aws ssm list-documents
   ```

1. 다음 명령을 실행하여 문서의 여러 버전을 확인합니다. *document name*을 사용자의 정보로 바꿉니다.

   ```
   aws ssm list-document-versions ^
       --name "document name"
   ```

1. 다음 명령을 실행하여 SSM 문서 버전을 사용하는 명령을 실행합니다. 각 *example resource placeholder*를 사용자의 정보로 바꿉니다.

   ```
   aws ssm send-command ^
       --document-name "AWS-RunShellScript" ^
       --parameters commands="echo Hello" ^
       --instance-ids instance-ID ^
       --document-version "$LATEST"
   ```

------
#### [ PowerShell ]

**Tools for PowerShell을 사용하여 명령을 실행하려면**

1. 아직 설치하지 않은 경우 AWS Tools for PowerShell(Tools for Windows PowerShell)을 설치하고 구성합니다.

   자세한 내용은 [AWS Tools for PowerShell 설치](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)를 참조하세요.

1. 사용할 수 있는 모든 문서 나열

   이 명령을 실행하면 AWS Identity and Access Management(IAM) 권한에 따라 계정에 사용할 수 있는 문서를 모두 나열합니다.

   ```
   Get-SSMDocumentList
   ```

1. 다음 명령을 실행하여 문서의 여러 버전을 확인합니다. *document name*을 사용자의 정보로 바꿉니다.

   ```
   Get-SSMDocumentVersionList `
       -Name "document name"
   ```

1. 다음 명령을 실행하여 SSM 문서 버전을 사용하는 명령을 실행합니다. 각 *example resource placeholder*를 사용자의 정보로 바꿉니다.

   ```
   Send-SSMCommand `
       -DocumentName "AWS-RunShellScript" `
       -Parameter @{commands = "echo helloWorld"} `
       -InstanceIds "instance-ID" `
       -DocumentVersion $LATEST
   ```

------

# 대규모로 명령 실행
<a name="send-commands-multiple"></a>

AWS Systems Manager의 도구인 Run Command에서는 `targets`를 사용하여 관리형 노드의 플릿에 대해 명령을 실행할 수 있습니다. `targets` 파라미터는 관리형 노드에 대해 지정한 태그를 바탕으로 `Key,Value` 조합을 허용합니다. 명령을 실행하면 시스템에서 지정된 태그와 일치하는 모든 관리형 노드를 찾아 이러한 인스턴스에 대해 명령 실행을 시도합니다. 관리형 인스턴스의 태그 지정에 대한 자세한 내용은 **AWS 리소스 태그 지정 사용 설명서의 [AWS 리소스 태그 지정](https://docs.aws.amazon.com/tag-editor/latest/userguide/tag-editor.html)을 참조하세요. 관리형 IoT 디바이스 태그 지정에 대한 자세한 내용은 *AWS IoT Greengrass Version 2개발자 안내서*의 [AWS IoT Greengrass Version 2 리소스 태그하기](https://docs.aws.amazon.com/greengrass/v2/developerguide/tag-resources.html) 섹션을 참조하세요.

다음 섹션에 설명된 대로 `targets` 파라미터를 사용하여 특정 관리형 노드 ID 목록을 대상으로 지정할 수도 있습니다.

수백 또는 수천 개의 관리형 노드에 걸쳐 명령 실행을 제어할 수 있도록 Run Command에는 하나의 요청을 동시에 처리할 수 있는 노드의 수와 명령이 취소되기 전에 명령에서 발생시킬 수 있는 오류의 수를 제한하기 위한 파라미터가 포함되어 있습니다.

**Topics**
+ [다중 관리형 노드 대상 지정](#send-commands-targeting)
+ [비율 제어 사용](#send-commands-rate)

## 다중 관리형 노드 대상 지정
<a name="send-commands-targeting"></a>

태그, AWS 리소스 그룹 이름, 또는 관리형 노드 ID를 지정하여 명령 및 대상 관리 노드를 실행할 수 있습니다.

다음 예시에서는 AWS Command Line Interface(AWS CLI)에서 Run Command를 사용할 경우의 명령 형식을 보여줍니다. *example resource placeholder*를 사용자의 정보로 바꿉니다. 이번 단원의 샘플 명령은 `[...]`를 사용해 잘립니다.

**예제 1: 태그를 대상으로 지정**

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:tag-name,Values=tag-value \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:tag-name,Values=tag-value ^
    [...]
```

------

**예제 2: AWS 리소스 그룹을 대상으로 지정**

명령 한 번마다 지정할 수 있는 리소스 그룹 이름은 최대 1개입니다. 리소스 그룹을 생성할 때는 그룹화 기준에서 `AWS::SSM:ManagedInstance`와 `AWS::EC2::Instance`를 리소스 유형으로 추가하는 것이 좋습니다.

**참고**  
리소스 그룹을 대상으로 지정하는 명령을 전송하려면 먼저 해당 그룹에 속한 리소스를 나열하거나 볼 수 있는 AWS Identity and Access Management(IAM) 권한을 부여해야 합니다. 자세한 내용은 *AWS Resource Groups 사용 설명서*의 [권한 설정](https://docs.aws.amazon.com/ARG/latest/userguide/gettingstarted-prereqs.html#gettingstarted-prereqs-permissions)을 참조하세요.

------
#### [ Linux & macOS ]

```
aws ssm send-command \    
    --document-name document-name \
    --targets Key=resource-groups:Name,Values=resource-group-name \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^    
    --document-name document-name ^
    --targets Key=resource-groups:Name,Values=resource-group-name ^
    [...]
```

------

**예제 3: 리소스 유형별로 AWS 리소스 그룹 태그 지정**

명령 한 번마다 지정할 수 있는 리소스 그룹 유형은 최대 5개입니다. 리소스 그룹을 생성할 때는 그룹화 기준에서 `AWS::SSM:ManagedInstance`와 `AWS::EC2::Instance`를 리소스 유형으로 추가하는 것이 좋습니다.

**참고**  
리소스 그룹을 대상으로 지정하는 명령을 전송하려면 먼저 해당 그룹에 속한 리소스를 나열하거나 볼 수 있는 IAM 권한을 부여해야 합니다. 자세한 내용은 *AWS Resource Groups 사용 설명서*의 [권한 설정](https://docs.aws.amazon.com/ARG/latest/userguide/gettingstarted-prereqs.html#gettingstarted-prereqs-permissions)을 참조하세요.

------
#### [ Linux & macOS ]

```
aws ssm send-command \    
    --document-name document-name \
    --targets Key=resource-groups:ResourceTypeFilters,Values=resource-type-1,resource-type-2 \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^    
    --document-name document-name ^
    --targets Key=resource-groups:ResourceTypeFilters,Values=resource-type-1,resource-type-2 ^
    [...]
```

------

**예제 4: 인스턴스 ID를 대상으로 지정**

다음 예에서는 `instanceids` 키와 `targets` 파라미터를 사용하여 관리형 노드를 대상으로 지정하는 방법을 보여줍니다. 각 디바이스에 mi-*ID\$1number*가 지정되어 있기 때문에 이 키를 사용하여 관리형 AWS IoT Greengrass 코어 디바이스를 대상으로 지정할 수 있습니다. AWS Systems Manager의 도구인 Fleet Manager에서 디바이스 ID를 볼 수 있습니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=instanceids,Values=instance-ID-1,instance-ID-2,instance-ID-3 \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=instanceids,Values=instance-ID-1,instance-ID-2,instance-ID-3 ^
    [...]
```

------

`Environment`라는 `Key`와 `Development`, `Test`, `Pre-production` 및 `Production`의 `Values`를 사용하여 다양한 환경에 대해 관리형 노드에 태그를 지정한 경우에는 다음 구문과 함께 `targets` 파라미터를 사용해 이러한 환경 중 *하나*의 모든 관리형 노드로 명령을 보낼 수 있습니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Environment,Values=Development \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Environment,Values=Development ^
    [...]
```

------

`Values` 목록에 추가하여 다른 환경의 추가 관리형 노드를 대상으로 지정할 수 있습니다. 쉼표를 사용하여 항목을 구분합니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Environment,Values=Development,Test,Pre-production \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Environment,Values=Development,Test,Pre-production ^
    [...]
```

------

**번형**: `Key` 기준을 여러 개 사용하여 대상 세분화

`Key` 조건을 여러 개 포함시켜 명령의 대상 수를 세분화할 수 있습니다. `Key` 조건을 두 개 이상 포함시키면 시스템에서 *모든* 조건을 충족하는 관리형 노드를 대상으로 지정합니다. 다음 명령은 재무 부서에 대해 태그가 지정되고 *또한* 데이터베이스 서버 역할에 대해 태그가 지정된 모든 관리형 노드를 대상으로 지정합니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Department,Values=Finance Key=tag:ServerRole,Values=Database \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Department,Values=Finance Key=tag:ServerRole,Values=Database ^
    [...]
```

------

**번형**: 여러 `Key` 및 `Value` 기준 사용

앞의 예제를 확장해 `Values` 조건에 항목을 추가로 포함시켜 여러 부서 및 여러 서버 역할을 대상으로 지정할 수 있습니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Department,Values=Finance,Marketing Key=tag:ServerRole,Values=WebServer,Database \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Department,Values=Finance,Marketing Key=tag:ServerRole,Values=WebServer,Database ^
    [...]
```

------

**번형**: 여러 `Values` 기준을 사용하여 태그가 지정된 관리형 노드를 대상으로 지정

`Department`라는 `Key`와 `Sales`, `Finance`의 `Values`를 사용하여 다양한 환경에 대해 관리형 노드에 태그를 지정한 경우에는 다음 구문과 함께 `targets` 파라미터를 사용해 이러한 환경의 모든 노드로 명령을 보낼 수 있습니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Department,Values=Sales,Finance \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Department,Values=Sales,Finance ^
    [...]
```

------

최대 5개의 키와 각 키에 대해 5개의 값을 지정할 수 있습니다.

태그 키(태그 이름) 또는 태그 값에 공백이 포함된 경우 다음 예와 같이 태그 키 또는 값을 인용 부호로 묶습니다.

**예**: `Value` 태그의 공백

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:OS,Values="Windows Server 2016" \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:OS,Values="Windows Server 2016" ^
    [...]
```

------

**예**: `tag` 키 및 `Value`의 공백

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key="tag:Operating System",Values="Windows Server 2016" \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key="tag:Operating System",Values="Windows Server 2016" ^
    [...]
```

------

**예**: `Values` 목록에서 한 항목의 공백

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --targets Key=tag:Department,Values="Sales","Finance","Systems Mgmt" \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --targets Key=tag:Department,Values="Sales","Finance","Systems Mgmt" ^
    [...]
```

------

## 비율 제어 사용
<a name="send-commands-rate"></a>

*동시성 제어*와 *오류 제어*를 사용하여 그룹의 관리형 노드로 명령이 전송되는 비율을 제어할 수 있습니다.

**Topics**
+ [동시성 제어 사용](#send-commands-velocity)
+ [오류 제어 사용](#send-commands-maxerrors)

### 동시성 제어 사용
<a name="send-commands-velocity"></a>

`max-concurrency` 파라미터(**Run a command**(명령 실행) 페이지의 **Concurrency**(동시성) 옵션))로 명령을 동시에 실행하는 관리형 노드의 수를 제어할 수 있습니다. 관리형 노드의 절대 개수(예: **10**)를 지정하거나 대상 집합의 비율(예: **10%**)을 지정할 수 있습니다. 대기 중인 시스템은 단일 노드에 명령을 전송하고 시스템이 초기 호출을 승인할 때까지 기다렸다가 명령을 2개 더 많은 노드에 보냅니다. 시스템은 시스템이 `max-concurrency` 값을 충족할 때까지 기하급수적으로 더 많은 노드에 명령을 보냅니다. `max-concurrency`의 기본값은 50입니다. 다음 예는 `max-concurrency` 파라미터에 대한 값을 지정하는 방법을 보여줍니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --max-concurrency 10 \
    --targets Key=tag:Environment,Values=Development \
    [...]
```

```
aws ssm send-command \
    --document-name document-name \
    --max-concurrency 10% \
    --targets Key=tag:Department,Values=Finance,Marketing Key=tag:ServerRole,Values=WebServer,Database \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --max-concurrency 10 ^
    --targets Key=tag:Environment,Values=Development ^
    [...]
```

```
aws ssm send-command ^
    --document-name document-name ^
    --max-concurrency 10% ^
    --targets Key=tag:Department,Values=Finance,Marketing Key=tag:ServerRole,Values=WebServer,Database ^
    [...]
```

------

### 오류 제어 사용
<a name="send-commands-maxerrors"></a>

`max-errors` 파라미터(**명령 실행** 페이지의 **오류 임계값(Error threshold)** 필드)로 오류 제한을 설정하여 수백 또는 수천 개의 관리형 노드에 대한 명령 실행을 제어할 수도 있습니다. 이 파라미터는 시스템이 추가 관리형 노드로의 명령 전송을 중지하기까지 허용되는 오류 횟수를 지정합니다. 오류의 절대 개수(예: **10**)를 지정하거나 대상 집합의 비율(예: **10%**)을 지정할 수 있습니다. 예를 들어 **3**을 지정하면 네 번째 오류를 받았을 때 명령 전송이 중지됩니다. **0**을 지정하면 첫 번째 오류 결과가 반환된 후 추가 관리형 노드로의 명령 전송이 중지됩니다. 50개의관리형 노드로 명령을 보내고 `max-errors`을 **10%**로 설정하면 여섯 번째 오류를 받았을 때 추가 노드로의 명령 전송이 중지됩니다.

`max-errors`에 도달할 때 이미 명령을 실행 중인 호출은 완료될 수 있지만, 이런 호출 중 일부는 실패할 수도 있습니다. 실패한 호출 수가 `max-errors`보다 많지 않도록 해야 할 경우에는 호출이 한 번에 한 개를 초과하지 않도록 `max-concurrency`를 **1**로 설정하십시오. max-errors의 기본값은 0입니다. 다음 예는 `max-errors` 파라미터에 대한 값을 지정하는 방법을 보여줍니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name document-name \
    --max-errors 10 \
    --targets Key=tag:Database,Values=Development \
    [...]
```

```
aws ssm send-command \
    --document-name document-name \
    --max-errors 10% \
    --targets Key=tag:Environment,Values=Development \
    [...]
```

```
aws ssm send-command \
    --document-name document-name \
    --max-concurrency 1 \
    --max-errors 1 \
    --targets Key=tag:Environment,Values=Production \
    [...]
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name document-name ^
    --max-errors 10 ^
    --targets Key=tag:Database,Values=Development ^
    [...]
```

```
aws ssm send-command ^
    --document-name document-name ^
    --max-errors 10% ^
    --targets Key=tag:Environment,Values=Development ^
    [...]
```

```
aws ssm send-command ^
    --document-name document-name ^
    --max-concurrency 1 ^
    --max-errors 1 ^
    --targets Key=tag:Environment,Values=Production ^
    [...]
```

------

# 명령 취소
<a name="cancel-run-command"></a>

서비스에 명령이 보류 중 또는 실행 중 상태로 표시되는 경우 명령을 취소할 수 있습니다. 그러나 명령이 그러한 상태 중 하나인 경우에도 명령이 취소되고 기본 프로세스가 중지되는 것을 보장할 수 없습니다.

**콘솔을 사용하여 명령을 취소하려면**

1. AWS Systems Manager 콘솔([https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/))을 엽니다.

1. 탐색 창에서 **Run Command**를 선택합니다.

1. 취소하고 싶은 명령 호출을 선택합니다.

1. **명령 취소**를 선택합니다.

**AWS CLI를 사용하여 명령을 취소하려면**  
다음 명령을 실행합니다. 각 *example resource placeholder*를 사용자의 정보로 바꿉니다.

------
#### [ Linux & macOS ]

```
aws ssm cancel-command \
    --command-id "command-ID" \
    --instance-ids "instance-ID"
```

------
#### [ Windows ]

```
aws ssm cancel-command ^
    --command-id "command-ID" ^
    --instance-ids "instance-ID"
```

------

취소된 명령의 상태에 대한 자세한 내용은 [명령 상태 이해](monitor-commands.md) 섹션을 참조하세요.

# 명령에 종료 코드 사용
<a name="run-command-handle-exit-status"></a>

경우에 따라 종료 코드를 사용하여 명령을 처리하는 방법을 관리해야 할 수도 있습니다.

## 명령에 종료 코드 지정
<a name="command-exit-codes"></a>

AWS Systems Manager의 도구인 Run Command를 사용하여 종료 코드를 지정함으로써 명령 처리 방법을 결정할 수 있습니다. 기본적으로 스크립트에서 실행된 마지막 명령의 종료 코드는 전체 스크립트의 종료 코드로 보고됩니다. 예를 들어 세 개의 명령이 포함된 스크립트가 있습니다. 첫 번째 명령은 실패하지만 다음 명령은 성공합니다. 마지막 명령이 성공했기 때문에 실행 상태는 `succeeded`로 보고됩니다.

**Shell 스크립트**  
첫 번째 명령 실패 시 전체 스크립트를 실패하려면, 마지막 명령 이전에 명령이 실패하는 경우 셸 조건문을 포함하여 스크립트를 종료할 수 있습니다. 다음과 같은 접근 방식을 사용하지 마십시오.

```
<command 1>
    if [ $? != 0 ]
    then
        exit <N>
    fi
    <command 2>
    <command 3>
```

다음 예제에서는 첫 번째 명령이 실패하면 전체 스크립트가 실패합니다.

```
cd /test
    if [ $? != 0 ]
    then
        echo "Failed"
        exit 1
    fi
    date
```

**PowerShell 스크립트**  
PowerShell에서 종료 코드를 성공적으로 캡처하려면 Run Command에 대한 스크립트에서 `exit`를 명시적으로 호출해야 합니다.

```
<command 1>
    if ($?) {<do something>}
    else {exit <N>}
    <command 2>
    <command 3>
    exit <N>
```

예:

```
cd C:\
    if ($?) {echo "Success"}
    else {exit 1}
    date
```

# 명령 실행 시 재부팅 처리
<a name="send-commands-reboot"></a>

AWS Systems Manager의 도구인 Run Command을 사용하여 관리형 노드를 재부팅하는 스크립트를 실행할 수 있으며, 스크립트에 종료 코드를 지정하는 것이 좋습니다. 다른 방식으로 스크립트에서 노드를 재부팅하려고 시도할 경우, 재부팅이 스크립트의 마지막 단계라 하더라도 스크립트 실행 상태가 올바로 업데이트되지 않을 수 있습니다. Windows 관리형 노드의 경우 스크립트에서 `exit 3010`을 지정합니다. Linux 및 macOS 관리형 노드의 경우 `exit 194`를 지정합니다. 종료 코드는 AWS Systems Manager 에이전트(SSM Agent)에 관리형 노드를 재부팅하라고 지시한 다음 재부팅이 완료되면 스크립트를 재시작합니다. 재부팅을 시작하기 전에 SSM Agent는 클라우드 내 Systems Manager 서비스에 서버를 재부팅하는 동안 통신이 중단됨을 알립니다.

**참고**  
재부팅 스크립트는 `aws:runDocument` 플러그 인의 일부일 수 없습니다. 문서에 재부팅 스크립트가 포함되어 있고 다른 문서가 `aws:runDocument` 플러그 인을 통해 해당 문서를 실행하려고 할 경우 SSM Agent에 오류가 발생합니다.

**idempotent 스크립트 생성**

관리형 노드를 재부팅하는 스크립트를 개발할 때는 재부팅 후 떠난 곳에서 스크립트 실행을 계속하도록 idempotent 스크립트를 만듭니다. idempotent 스크립트는 상태를 관리하며 작업 수행 여부를 검증합니다. 이렇게 하면 한 번만 실행되도록 되어 있는 단계가 여러 번 실행되는 것을 방지할 수 있습니다.

다음은 관리형 노드를 여러 번 재부팅하는 idempotent 스크립트의 대략적인 예입니다.

```
$name = Get current computer name
If ($name –ne $desiredName) 
    {
        Rename computer
        exit 3010
    }
            
$domain = Get current domain name
If ($domain –ne $desiredDomain) 
    {
        Join domain
        exit 3010
    }
            
If (desired package not installed) 
    {
        Install package
        exit 3010
    }
```

**예시**

다음 스크립트 샘플은 종료 코드를 사용하여 관리형 노드를 재시작합니다. Linux 예제에서는 Amazon Linux에 패키지 업데이트를 설치한 다음 노드를 다시 시작합니다. Windows Server 예시에서는 노드에 Telnet-Client를 설치한 다음 노드를 다시 시작합니다.

------
#### [ Amazon Linux 2 ]

```
#!/bin/bash
yum -y update
needs-restarting -r
if [ $? -eq 1 ]
then
        exit 194
else
        exit 0
fi
```

------
#### [ Windows ]

```
$telnet = Get-WindowsFeature -Name Telnet-Client
if (-not $telnet.Installed)
    { 
        # Install Telnet and then send a reboot request to SSM Agent.
        Install-WindowsFeature -Name "Telnet-Client"
        exit 3010 
    }
```

------

# 명령 상태 이해
<a name="monitor-commands"></a>

AWS Systems Manager의 도구인 Run Command는 어떤 명령을 처리하는 동안과 명령을 처리한 각 관리형 노드에 대해 그 명령이 거치게 되는 다양한 상태에 대한 자세한 상태 정보를 보고합니다. 다음 방법을 사용하여 명령 상태를 모니터링할 수 있습니다.
+ Run Command 콘솔 인터페이스의 **Commands**(명령) 탭에서 **Refresh**(새로 고침) 아이콘을 선택합니다.
+ AWS Command Line Interface(AWS CLI)를 사용하여 [list-commands](https://docs.aws.amazon.com/cli/latest/reference/ssm/list-commands.html) 또는 [list-command-invocations](https://docs.aws.amazon.com/cli/latest/reference/ssm/list-command-invocations.html)를 호출합니다. AWS Tools for Windows PowerShell을 사용하여 [Get-SSMCommand](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMCommand.html) 또는 [Get-SSMCommandInvocation](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMCommandInvocation.html)을 호출합니다.
+ 상태 변경에 응답하도록 Amazon EventBridge를 구성합니다.
+ 모든 상태 변경 또는 `Failed`, `TimedOut` 등의 특정 상태에 대해 알림을 보내도록 Amazon Simple Notification Service(SNS)를 구성합니다.

## Run Command 상태
<a name="monitor-about-status"></a>

Run Command는 플러그인, 호출, 전체 명령 상태라는 세 가지 영역에 대한 자세한 상태 정보를 보고합니다. *플러그인*은 명령의 SSM 문서에 정의된 코드 실행 블록입니다. 플러그인에 대한 자세한 내용은 [Command 문서 플러그인 참조](documents-command-ssm-plugin-reference.md) 섹션을 참조하세요.

동시에 여러 관리형 노드에 명령을 보내는 경우, 각 노드를 대상으로 하는 명령 사본 각각을 *명령 호출*이라고 합니다. 예를 들어 `AWS-RunShellScript` 문서를 사용하여 `ifconfig` 명령을 20개의 Linux 인스턴스에 보내는 경우 이 명령에는 20개의 호출이 있습니다. 각 명령 호출은 개별적으로 상태를 보고합니다. 지정된 명령 호출에 대한 플러그인 역시 상태를 개별적으로 보고합니다.

마지막으로, Run Command에는 모든 플러그인과 호출에 대한 총체적인 명령 상태가 포함되어 있습니다. 다음 표에 나와 있는 것처럼, 총체적인 명령 상태는 플러그인이나 호출에서 보고되는 상태와 다를 수 있습니다.

**참고**  
`max-concurrency` 또는 `max-errors` 파라미터를 사용하여 많은 수의 관리형 노드에 명령을 실행할 경우 다음 표의 설명과 같이 명령 상태는 해당 파라미터에 따른 제한을 반영합니다. 이런 파라미터에 대한 자세한 내용은 [대규모로 명령 실행](send-commands-multiple.md) 섹션을 참조하세요.


**명령 플러그인 및 호출의 세부 상태**  

| Status | 세부 정보 | 
| --- | --- | 
| 보류중 | 명령이 아직 관리형 노드로 전송되지 않았거나 SSM Agent에 의해 수신되지 않았습니다. 시간 제한(초)(Timeout (seconds)) 파라미터와 실행 시간 제한(Execution timeout) 파라미터의 합에 해당하는 시간이 경과하기 전에 에이전트가 명령을 수신하지 않으면 상태가 Delivery Timed Out로 변경됩니다. | 
| InProgress | Systems Manager가 관리형 노드에 명령을 보내려고 시도하거나 SSM Agent에서 명령을 수신하고 인스턴스에서 실행을 시작했습니다. 모든 명령 플러그인의 결과에 따라 상태는 Success, Failed, Delivery Timed Out 또는 Execution Timed Out으로 변경됩니다. 예외: 에이전트가 노드에서 실행 중이 아니거나 사용 가능한 경우 명령 상태는 에이전트를 다시 사용할 수 있거나 실행 시간 제한에 도달할 때까지 In Progress으로 유지됩니다. 상태는 종료 상태로 변경됩니다. | 
| Delayed | 시스템에서 관리형 노드로 명령 전송을 시도했지만 완료하지 못했습니다. 시스템이 다시 시도합니다. | 
| Success | 이 상태는 다양한 조건에서 반환됩니다. 이 상태가 노드에서 명령이 처리되었다는 뜻은 아닙니다. 예를 들어 관리형 노드의 SSM Agent에 명령이 수신된 후 PowerShell ExecutionPolicy에서 명령 실행을 차단한 결과로 종료 코드 0이 반환될 수 있습니다. 이것은 종료 상태입니다. 명령에서 Success 상태를 반환하는 조건은 다음과 같습니다.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/monitor-commands.html)  리소스 그룹을 타켓팅할 때도 동일한 조건이 적용됩니다. 오류를 해결하거나 명령 실행에 대한 자세한 정보를 얻으려면 적절한 종료 코드(명령 실패에 대한 0 이외의 종료 코드)를 반환해 오류나 예외를 처리하는 명령을 전송합니다.  | 
| DeliveryTimedOut | 총 시간 제한 만료 전까지 명령이 관리형 노드로 전송되지 않았습니다. 상위 명령의 max-errors 제한에 총 시간 초과 횟수가 계산되지는 않지만, 상위 명령 상태를 Success, Incomplete 또는 Delivery Timed Out으로 표시할지 여부에는 영향을 미칩니다. 이것은 종료 상태입니다. | 
| ExecutionTimedOut | 관리형 노드에서 명령 자동화가 시작되었지만, 실행 시간제한 만료 전까지 명령이 완료되지 않았습니다. 실행 시간 초과는 실패로 계산되며, 이 경우 0이 아닌 응답이 전송되고 Systems Manager는 명령 자동화 실행 시도를 종료하고 실패 상태를 보고합니다. | 
| 실패 |  관리형 노드에서 명령 실행을 완료하지 못했습니다. 플러그인의 경우 이는 결과 코드가 0이 아니었음을 나타냅니다. 명령 호출의 경우 이는 하나 이상의 플러그인에 대한 결과 코드가 0이 아니었음을 나타냅니다. 호출 실패는 상위 명령의 max-errors 제한에 계산됩니다. 이것은 종료 상태입니다. | 
| 취소됨 | 명령이 완료되기 전에 취소되었습니다. 이것은 종료 상태입니다. | 
| Undeliverable | 관리형 노드로 명령을 전달할 수 없습니다. 해당 노드가 없거나 응답하지 않는 것일 수 있습니다. 배달할 수 없는 호출은 상위 명령의 max-errors 제한에 계산되지 않지만 상위 명령 상태를 Success 또는 Incomplete으로 표시할지 여부에 영향을 미치지도 않습니다. (예를 들어 명령의 모든 호출이 Undeliverable 상태인 경우 반환된 명령 상태는 Failed입니다. 그러나 명령에 5개 호출이 있는 경우 그 중 4개가 Undeliverable 상태를 반환하고 나머지 1개가 Success 상태를 반환하는 경우 상위 명령의 상태는 Success입니다.) 이것은 종료 상태입니다. | 
| 종료됨 | 상위 명령이 max-errors 제한을 초과해 시스템에서 이후의 명령 호출을 취소했습니다. 이것은 종료 상태입니다. | 
| InvalidPlatform | 선택한 문서에 지정된 필수 플랫폼과 일치하지 않는 관리형 노드로 명령이 전송되었습니다. Invalid Platform은 상위 명령의 최대 오류 제한에 포함되지 않지만 상위 명령 상태가 성공인지 실패인지 여부에 영향을 줍니다. (예를 들어 명령의 모든 호출이 Invalid Platform 상태인 경우 반환된 명령 상태는 Failed입니다. 그러나 명령에 5개 호출이 있는 경우 그 중 4개가 Invalid Platform 상태를 반환하고 나머지 1개가 Success 상태를 반환하는 경우 상위 명령의 상태는 Success입니다.) 이것은 종료 상태입니다. | 
| AccessDenied | 명령을 시작하는 AWS Identity and Access Management(IAM) 사용자 또는 역할은 대상 지정된 관리형 노드에 액세스할 수 없습니다. Access Denied는 상위 명령의 max-errors 한도에 불리하게 작용하지 않지만 상위 명령 상태가 Success 또는 Failed인지 여부에 원인을 제공합니다. (예를 들어 명령의 모든 호출이 Access Denied 상태인 경우 반환된 명령 상태는 Failed입니다. 그러나 명령에 5개 호출이 있는 경우 그 중 4개가 Access Denied 상태를 반환하고 나머지 1개가 Success 상태를 반환하는 경우 상위 명령의 상태는 Success입니다.) 이것은 종료 상태입니다. | 


**명령의 세부 상태**  

| Status | 세부 정보 | 
| --- | --- | 
| 보류중 | 어떤 관리형 노드에서도 에이전트가 아직 명령을 받지 않았습니다. | 
| InProgress | 1개 이상의 관리형 노드로 명령을 전송했지만 모든 노드에서 최종 상태에 도달하지는 못했습니다. | 
| Delayed | 시스템에서 노드로 명령 전송을 시도했지만 완료하지 못했습니다. 시스템이 다시 시도합니다. | 
| Success | 지정되었거나 대상이 된 모든 관리형 노드의 SSM Agent에 명령이 수신되었고 종료 코드 0을 반환했습니다. 모든 명령 호출이 터미널 상태에 도달했고 max-errors 값에 도달하지 않았습니다. 이 상태가 지정되었거나 대상이 된 모든 관리형 노드에서 명령이 처리되었다는 뜻은 아닙니다. 이것은 종료 상태입니다. 오류를 해결하거나 명령 실행에 대한 자세한 정보를 얻으려면 적절한 종료 코드(명령 실패에 대한 0 이외의 종료 코드)를 반환해 오류나 예외를 처리하는 명령을 전송합니다.  | 
| DeliveryTimedOut | 총 시간 제한 만료 전까지 명령이 관리형 노드로 전송되지 않았습니다. max-errors 이상의 명령 호출 값이 Delivery Timed Out 상태를 표시합니다. 이것은 종료 상태입니다. | 
| 실패 |  관리형 노드에서 명령 실행을 완료하지 못했습니다. `max-errors` 이상의 명령 호출 값이 `Failed` 상태를 표시합니다. 이것은 종료 상태입니다.  | 
| 불완전 | 모든 관리형 노드에서 명령을 시도했고 값이 Success가 아닌 호출이 한 개 이상입니다. 하지만 Failed 상태가 될 정도로 많은 호출에 실패한 것은 아닙니다. 이것은 종료 상태입니다. | 
| 취소됨 | 명령이 완료되기 전에 취소되었습니다. 이것은 종료 상태입니다. | 
| RateExceeded | 명령의 대상이 되는 관리형 노드 수가 보류 중인 호출에 대한 계정 할당량을 초과했습니다. 시스템에서 이 명령을 어떤 노드에서 실행하기 전에 취소했습니다. 이것은 종료 상태입니다. | 
| AccessDenied | 명령을 시작하는 사용자 또는 역할은 대상으로 지정된 리소스 그룹에 액세스할 수 없습니다. AccessDenied는 상위 명령의 max-errors 한도에 불리하게 작용하지 않지만 상위 명령 상태가 Success 또는 Failed인지 여부에 원인을 제공합니다. (예를 들어 명령의 모든 호출이 AccessDenied 상태인 경우 반환된 명령 상태는 Failed입니다. 그러나 명령에 5번의 호출이 있고 그 중 4번은 상태 AccessDenied를 반환하고 1번은 Success 상태를 반환하는 경우 상위 명령의 상태는 Success입니다.) 이것은 종료 상태입니다. | 
| 태그에 인스턴스 없음 | 명령으로 대상 지정된 태그 키 페어 또는 리소스 그룹은 관리형 노드와 일치하지 않습니다. 이것은 종료 상태입니다. | 

## 명령 제한 시간 값 이해
<a name="monitor-about-status-timeouts"></a>

Systems Manager는 명령을 실행할 때 다음 시간 제한 값을 적용합니다.

**총 제한 시간**  
Systems Manager 콘솔에서 **시간 제한(초)(Timeout (seconds))** 필드에 시간 제한 값을 지정합니다. 명령이 전송된 후 Run Command는 명령이 만료되었는지 여부를 확인합니다. 명령이 명령 만료 제한(총 시간 제한)에 도달하면 상태가 `InProgress`, `Pending` 또는 `Delayed`인 모든 호출에 대해 상태가 `DeliveryTimedOut`으로 변경됩니다.

![\[Systems Manager 콘솔의 시간 제한(초)(Timeout (seconds)) 필드\]](http://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/images/run-command-delivery-time-out-time-out-seconds.png)


보다 기술적인 수준에서 총 시간 제한(**시간 제한(초)(Timeout (seconds))**)은 다음과 같이 두 가지 시간 제한 값의 조합입니다.

`Total timeout = "Timeout(seconds)" from the console + "timeoutSeconds": "{{ executionTimeout }}" from your SSM document`

예를 들어 Systems Manager 콘솔에서 **시간 제한(초)(Timeout (seconds))**의 기본값은 600초입니다. `AWS-RunShellScript`SSM 문서를 사용하여 명령을 실행하는 경우 다음 문서 샘플과 같이 **"timeoutSeconds": "\$1\$1 executionTimeout \$1\$1"**의 기본값은 3,600초입니다.

```
  "executionTimeout": {
      "type": "String",
      "default": "3600",

  "runtimeConfig": {
    "aws:runShellScript": {
      "properties": [
        {
          "timeoutSeconds": "{{ executionTimeout }}"
```

즉, 시스템이 명령 상태를 `DeliveryTimedOut`으로 설정하기 전에 명령이 4,200초(70분) 동안 실행됩니다.

**실행 제한 시간**  
Systems Manager 콘솔의 **실행 시간 제한(Execution Timeout)** 필드에 실행 시간 제한 값을 지정합니다(사용 가능한 경우). 모든 SSM 문서에 실행 시간 제한을 지정해야 하는 것은 아닙니다. **Execution Timeout**(실행 시간 초과) 필드는 SSM 문서에 해당 입력 파라미터가 정의되어 있는 경우에만 표시됩니다. 지정된 경우 이 시간 내에 명령이 완료되어야 합니다.

**참고**  
Run Command는 명령이 에이전트에 전송되었는지 여부를 판별하기 위해 SSM Agent 문서 터미널 응답에 의존합니다. SSM Agent는 `ExecutionTimedOut`으로 표시되는 호출 또는 명령에 대한 `ExecutionTimedOut` 신호를 보내야 합니다.

![\[Systems Manager 콘솔의 실행 시간 제한(Execution Timeout) 필드\]](http://docs.aws.amazon.com/ko_kr/systems-manager/latest/userguide/images/run-command-execution-timeout-console.png)


**기본 실행 제한 시간**  
SSM 문서에서 실행 제한 시간 값을 명시적으로 지정할 필요가 없는 경우 Systems Manager는 하드 코딩된 기본 실행 제한 시간을 적용합니다.

**Systems Manager가 시간 제한을 보고하는 방법**  
Systems Manager가 대상의 SSM Agent로부터 `execution timeout` 응답을 수신한 경우 Systems Manager는 명령 호출을 `executionTimeout`으로 표시합니다.

Run Command가 SSM Agent로부터 문서 터미널 응답을 받지 못하면 명령 호출은 `deliveryTimeout`으로 표시됩니다.

대상의 시간 제한 상태를 확인하기 위해 SSM Agent는 모든 파라미터와 SSM 문서의 콘텐츠를 결합하여 `executionTimeout`을 계산합니다. SSM Agent에서 명령이 시간 초과되었다고 판단하면 `executionTimeout`을 서비스로 전송합니다.

**시간 제한(초)(Timeout (seconds))**의 기본값은 3,600초입니다. **실행 시간 제한(Execution Timeout)**의 기본값도 3,600초입니다. 따라서 명령의 총 기본 시간 제한은 7,200초입니다.

**참고**  
SSM Agent는 SSM 문서 유형 및SSM 문서 버전에 따라 `executionTimeout`을 다르게 처리합니다.

# Run Command 연습
<a name="run-command-walkthroughs"></a>

이 섹션의 시연에서는 AWS Command Line Interface(AWS CLI) 또는 AWS Tools for Windows PowerShell 사용을 통해 AWS Systems Manager의 도구인 Run Command에서 명령을 실행하는 방법을 보여줍니다.

**Topics**
+ [Run Command를 사용하여 소프트웨어 업데이트](run-command-tutorial-update-software.md)
+ [연습: Run Command에서 AWS CLI 사용](walkthrough-cli.md)
+ [연습: Run Command에서 AWS Tools for Windows PowerShell 사용](walkthrough-powershell.md)

다음 참조에서도 명령 샘플을 볼 수 있습니다.
+ [Systems Manager AWS CLI 참조](https://docs.aws.amazon.com/cli/latest/reference/ssm/)
+ [AWS Tools for Windows PowerShell - AWS Systems Manager](https://docs.aws.amazon.com/powershell/latest/reference/items/SimpleSystemsManagement_cmdlets.html)

# Run Command를 사용하여 소프트웨어 업데이트
<a name="run-command-tutorial-update-software"></a>

다음 절차에서는 관리형 노드에서 소프트웨어를 업데이트하는 방법을 설명합니다.

## Run Command를 사용하여 SSM Agent 업데이트
<a name="rc-console-agentexample"></a>

다음 절차에서는 관리형 노드에서 실행 중인 SSM Agent를 업데이트하는 방법을 설명합니다. SSM Agent의 최신 버전으로 업데이트하거나 이전 버전으로 다운그레이드할 수 있습니다. 명령을 실행하면 시스템은 AWS에서 버전을 다운로드하여 설치한 다음, 명령을 실행하기 이전에 있었던 버전을 제거합니다. 이 프로세스 중에 오류가 발생하면, 서버에서 명령을 실행하기 이전의 버전으로 롤백하며 명령 상태에 명령이 실패했다고 표시됩니다.

**참고**  
인스턴스가 macOS 버전 13.0(Ventura) 이상을 실행하는 경우 SSM Agent 문서를 실행하려면 인스턴스의 AWS-UpdateSSMAgent 버전이 3.1.941.0 이상이어야 합니다. 인스턴스가 3.1.941.0 이전에 릴리스된 SSM Agent 버전을 실행 중인 경우 `brew update` 및 `brew upgrade amazon-ssm-agent` 명령을 실행하여 AWS-UpdateSSMAgent 문서를 실행하도록 SSM Agent를 업데이트할 수 있습니다.

SSM Agent 업데이트에 대해 알림을 수신하려면 GitHub에서 [SSM Agent 릴리스 정보](https://github.com/aws/amazon-ssm-agent/blob/mainline/RELEASENOTES.md) 페이지를 구독합니다.

**Run Command를 사용하여 SSM Agent를 업데이트하려면**

1. [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)에서 AWS Systems Manager 콘솔을 엽니다.

1. 탐색 창에서 **Run Command**를 선택합니다.

1. **Run command**(실행 명령)를 선택합니다.

1. **Command 문서(Command document)** 목록에서 **`AWS-UpdateSSMAgent`**를 선택합니다.

1. **명령 파라미터** 섹션에서, 원하는 경우 다음 파라미터의 값을 지정합니다.

   1. (옵션) **버전(Version)**에 설치할 SSM Agent의 버전을 입력합니다. [이전 버전](https://github.com/aws/amazon-ssm-agent/blob/mainline/RELEASENOTES.md)의 에이전트를 설치할 수 있습니다. 버전을 지정하지 않으면 최신 버전으로 설치됩니다.

   1. (옵션) **다운그레이드 허용(Allow Downgrade)**에서 **true**를 선택하여 이전 버전의 SSM Agent를 설치합니다. 이 옵션을 선택하는 경우 [이전](https://github.com/aws/amazon-ssm-agent/blob/mainline/RELEASENOTES.md) 버전 번호를 지정해야 합니다. 최신 서비스 버전을 설치하려면 **false**를 선택합니다.

1. **대상(Targets)** 섹션에서, 태그를 지정하거나, 수동으로 인스턴스나 엣지 디바이스를 선택하거나, 리소스 그룹을 지정하여 이 작업을 실행할 관리형 노드를 식별합니다.
**작은 정보**  
예상한 관리형 노드가 목록에 없으면 [관리형 노드 가용성 문제 해결](fleet-manager-troubleshooting-managed-nodes.md)에서 문제 해결 팁을 참조하세요.

1. **Other parameters**(다른 파라미터):
   + **Comment**(설명)에 명령에 대한 정보를 입력합니다.
   + **제한 시간(초)**에서 전체 명령 실행이 실패할 때까지 시스템이 기다리는 시간을 초 단위로 지정합니다.

1. **Rate control**(속도 제어)에서
   + **Concurrency**(동시성)에서 명령을 동시에 실행할 관리형 노드의 백분율 또는 개수를 지정합니다.
**참고**  
관리형 노드에 적용할 태그를 지정하거나, AWS 리소스 그룹을 지정하여 대상을 선택하였지만 대상으로 지정할 관리형 노드 수를 잘 모를 경우에는 백분율을 지정하여 동시에 문서를 실행할 수 있는 대상 수를 제한합니다.
   + **Error threshold**(오류 임계값)에서, 명령이 노드의 개수 또는 백분율에서 실패한 후 다른 관리형 노드에서 해당 명령의 실행을 중지할 시간을 지정합니다. 예를 들어 세 오류를 지정하면 네 번째 오류를 받았을 때 Systems Manager가 명령 전송을 중지합니다. 여전히 명령을 처리 중인 관리형 노드도 오류를 전송할 수 있습니다.

1. (선택 사항) **Output options**(출력 옵션)에서 명령 출력을 파일에 저장하려면 **Write command output to an S3 bucket**(S3 버킷에 명령 출력 쓰기) 상자를 선택합니다. 상자에 버킷 및 접두사(폴더) 이름을 입력합니다.
**참고**  
데이터를 S3 버킷에 쓰는 기능을 부여하는 S3 권한은 이 작업을 수행하는 IAM 사용자의 권한이 아니라 인스턴스에 할당된 인스턴스 프로파일(EC2 인스턴스용) 또는 IAM 서비스 역할(하이브리드 정품 인증 시스템)의 권한입니다. 자세한 내용은 [Systems Manager에 필요한 인스턴스 권한 구성](setup-instance-permissions.md)이나 [하이브리드 환경을 위한 IAM 서비스 역할 생성](hybrid-multicloud-service-role.md)을 참조하세요. 또한 지정된 S3 버킷이 다른 AWS 계정에 있는 경우 관리형 노드와 연결된 인스턴스 프로파일 또는 IAM 서비스 역할은 해당 버킷에 쓸 수 있는 권한이 있어야 합니다.

1. **SNS notifications**(SNS 알림) 섹션에서, 명령 실행 상태에 대한 알림이 전송되도록 하려면 **Enable SNS notifications**(SNS 알림 활성화) 확인란을 선택합니다.

   Run Command에 대한 Amazon SNS 알림 구성에 대한 자세한 내용은 [Amazon SNS 알림을 사용하여 Systems Manager 상태 변경 모니터링](monitoring-sns-notifications.md) 섹션을 참조하세요.

1. **Run**(실행)을 선택합니다.

## Run Command를 사용하여 PowerShell 업데이트
<a name="rc-console-pwshexample"></a>

다음 절차에서는 Windows Server 2012 및 2012 R2 관리형 노드에서 PowerShell을 버전 5.1로 업데이트하는 방법을 설명합니다. 이 절차에서 제공하는 스크립트는 Windows Management Framework(WMF) 버전 5.1 업데이트를 다운로드하고 업데이트 설치를 시작합니다. WMF 5.1을 설치할 때 필요하기 때문에 이 프로세스 중 노드가 재부팅됩니다. 업데이트 다운로드 및 설치를 완료하는 데 5분 정도 걸립니다.

**Run Command를 사용하여 PowerShell을 업데이트하려면**

1. [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)에서 AWS Systems Manager 콘솔을 엽니다.

1. 탐색 창에서 **Run Command**를 선택합니다.

1. **Run command**(실행 명령)를 선택합니다.

1. **Command 문서(Command document)** 목록에서 **`AWS-RunPowerShellScript`**를 선택합니다.

1. **명령(Commands)** 섹션에 운영 체제에 대해 다음 명령을 붙여 넣습니다.

------
#### [ Windows Server 2012 R2 ]

   ```
   Set-Location -Path "C:\Windows\Temp"
   
   Invoke-WebRequest "https://go.microsoft.com/fwlink/?linkid=839516" -OutFile "Win8.1AndW2K12R2-KB3191564-x64.msu"
   
   Start-Process -FilePath "$env:systemroot\system32\wusa.exe" -Verb RunAs -ArgumentList ('Win8.1AndW2K12R2-KB3191564-x64.msu', '/quiet')
   ```

------
#### [ Windows Server 2012 ]

   ```
   Set-Location -Path "C:\Windows\Temp"
   
   Invoke-WebRequest "https://go.microsoft.com/fwlink/?linkid=839513" -OutFile "W2K12-KB3191565-x64.msu"
   
   Start-Process -FilePath "$env:systemroot\system32\wusa.exe" -Verb RunAs -ArgumentList ('W2K12-KB3191565-x64.msu', '/quiet')
   ```

------

1. **대상(Targets)** 섹션에서, 태그를 지정하거나, 수동으로 인스턴스나 엣지 디바이스를 선택하거나, 리소스 그룹을 지정하여 이 작업을 실행할 관리형 노드를 식별합니다.
**작은 정보**  
예상한 관리형 노드가 목록에 없으면 [관리형 노드 가용성 문제 해결](fleet-manager-troubleshooting-managed-nodes.md)에서 문제 해결 팁을 참조하세요.

1. **Other parameters**(다른 파라미터):
   + **Comment**(설명)에 명령에 대한 정보를 입력합니다.
   + **제한 시간(초)**에서 전체 명령 실행이 실패할 때까지 시스템이 기다리는 시간을 초 단위로 지정합니다.

1. **Rate control**(속도 제어)에서
   + **Concurrency**(동시성)에서 명령을 동시에 실행할 관리형 노드의 백분율 또는 개수를 지정합니다.
**참고**  
관리형 노드에 적용할 태그를 지정하거나, AWS 리소스 그룹을 지정하여 대상을 선택하였지만 대상으로 지정할 관리형 노드 수를 잘 모를 경우에는 백분율을 지정하여 동시에 문서를 실행할 수 있는 대상 수를 제한합니다.
   + **Error threshold**(오류 임계값)에서, 명령이 노드의 개수 또는 백분율에서 실패한 후 다른 관리형 노드에서 해당 명령의 실행을 중지할 시간을 지정합니다. 예를 들어 세 오류를 지정하면 네 번째 오류를 받았을 때 Systems Manager가 명령 전송을 중지합니다. 여전히 명령을 처리 중인 관리형 노드도 오류를 전송할 수 있습니다.

1. (선택 사항) **Output options**(출력 옵션)에서 명령 출력을 파일에 저장하려면 **Write command output to an S3 bucket**(S3 버킷에 명령 출력 쓰기) 상자를 선택합니다. 상자에 버킷 및 접두사(폴더) 이름을 입력합니다.
**참고**  
데이터를 S3 버킷에 쓰는 기능을 부여하는 S3 권한은 이 작업을 수행하는 IAM 사용자의 권한이 아니라 인스턴스에 할당된 인스턴스 프로파일(EC2 인스턴스용) 또는 IAM 서비스 역할(하이브리드 정품 인증 시스템)의 권한입니다. 자세한 내용은 [Systems Manager에 필요한 인스턴스 권한 구성](setup-instance-permissions.md)이나 [하이브리드 환경을 위한 IAM 서비스 역할 생성](hybrid-multicloud-service-role.md)을 참조하세요. 또한 지정된 S3 버킷이 다른 AWS 계정에 있는 경우 관리형 노드와 연결된 인스턴스 프로파일 또는 IAM 서비스 역할은 해당 버킷에 쓸 수 있는 권한이 있어야 합니다.

1. **SNS notifications**(SNS 알림) 섹션에서, 명령 실행 상태에 대한 알림이 전송되도록 하려면 **Enable SNS notifications**(SNS 알림 활성화) 확인란을 선택합니다.

   Run Command에 대한 Amazon SNS 알림 구성에 대한 자세한 내용은 [Amazon SNS 알림을 사용하여 Systems Manager 상태 변경 모니터링](monitoring-sns-notifications.md) 섹션을 참조하세요.

1. **Run**(실행)을 선택합니다.

관리형 노드가 재부팅되고 업데이트 설치가 완료되면 관리형 노드에 연결하여 PowerShell이 버전 5.1로 업그레이드되었는지 확인합니다. 노드에서 PowerShell의 버전을 확인하려면 PowerShell을 열고 `$PSVersionTable`을 입력합니다. 출력 테이블의 `PSVersion` 값은 업그레이드가 성공한 경우 5.1을 표시합니다.

`PSVersion` 값이 5.1과 다른 경우(예: 3.0 또는 4.0) **Windows 로그(Windows Logs)** 아래에 있는 이벤트 뷰어의 **설치(Setup)** 로그를 검토합니다. 이러한 로그에서 업데이트 설치가 실패한 이유를 확인할 수 있습니다.

# 연습: Run Command에서 AWS CLI 사용
<a name="walkthrough-cli"></a>

다음 예제 시연에서는 AWS Command Line Interface(AWS CLI)를 사용하여 명령 및 명령 파라미터에 대한 정보를 보는 방법, 명령을 실행하는 방법, 해당 명령의 상태를 보는 방법을 보여줍니다.

**중요**  
신뢰할 수 있는 관리자만 이번 주제에서 언급하는 AWS Systems Manager 사전 구성 문서를 사용할 수 있도록 허용해야 합니다. Systems Manager 문서에서 지정하는 명령 또는 스크립트는 관리형 노드에 대한 관리자 권한으로 실행됩니다. 미리 정의된 Systems Manager 문서(`AWS-`로 시작하는 모든 문서)를 실행할 권한이 있는 사용자는 해당 노드에 대한 관리자 권한도 보유합니다. 그 밖의 모든 사용자들에 대해서는 제한된 문서를 생성하여 그 문서를 특정 사용자와 공유해야 합니다.

**Topics**
+ [1단계: 시작하기](#walkthrough-cli-settings)
+ [2단계: 셸 스크립트를 실행하여 리소스 세부 정보 보기](#walkthrough-cli-run-scripts)
+ [3단계: `AWS-RunShellScript` 문서를 사용하여 간단한 명령 전송](#walkthrough-cli-example-1)
+ [4단계: Run Command을 사용하여 간단한 Python 스크립트 실행](#walkthrough-cli-example-2)
+ [5단계: Run Command를 사용하여 Bash 스크립트 실행](#walkthrough-cli-example-3)

## 1단계: 시작하기
<a name="walkthrough-cli-settings"></a>

구성할 관리형 노드에 대한 관리자 권한이 있거나 AWS Identity and Access Management(IAM)에서 적절한 권한을 부여받아야 합니다. 또한 이 예제에서는 미국 동부(오하이오) 리전(us-east-2)을 사용합니다. Run Command는 **Amazon Web Services 일반 참조의 [Systems Manager 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region)에 나열된 AWS 리전에서 사용할 수 있습니다. 자세한 내용은 [AWS Systems Manager에 대한 관리형 노드 설정](systems-manager-setting-up-nodes.md) 섹션을 참조하세요.

**AWS CLI을 사용하여 명령을 실행하려면**

1. 아직 하지 않은 경우 AWS Command Line Interface(AWS CLI)을 설치하고 구성합니다.

   자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 참조하세요.

1. 사용할 수 있는 모든 문서를 나열합니다.

   이 명령을 실행하면 IAM 권한에 따라 계정에 사용할 수 있는 문서를 모두 나열합니다.

   ```
   aws ssm list-documents
   ```

1. 관리형 노드가 명령을 수신할 준비가 되었는지 확인합니다.

   다음 명령의 출력은 관리형 노드가 온라인 상태인지 여부를 보여줍니다.

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-instance-information \
       --output text --query "InstanceInformationList[*]"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-instance-information ^
       --output text --query "InstanceInformationList[*]"
   ```

------

1. 다음 명령을 실행하여 특정 관리형 노드에 대한 세부 정보를 봅니다.
**참고**  
이 시연에서 명령을 실행하려면 인스턴스 및 명령 ID를 바꿉니다. 관리형 AWS IoT Greengrass 코어 디바이스에서, 인스턴스 ID로 mi-*ID\$1number*를 사용합니다. **send-command**의 응답으로 명령 ID가 반환됩니다. 인스턴스 ID는 AWS Systems Manager의 도구인 Fleet Manager서 제공됩니다.

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-instance-information \
       --instance-information-filter-list key=InstanceIds,valueSet=instance-ID
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-instance-information ^
       --instance-information-filter-list key=InstanceIds,valueSet=instance-ID
   ```

------

## 2단계: 셸 스크립트를 실행하여 리소스 세부 정보 보기
<a name="walkthrough-cli-run-scripts"></a>

Run Command 및 `AWS-RunShellScript` 문서를 사용하면 로컬로 로그인한 것처럼 관리형 노드에서 명령이나 스크립트를 실행할 수 있습니다.

**설명 및 사용 가능한 파라미터 보기**

다음 명령을 실행하여 Systems Manager JSON 문서에 대한 설명을 봅니다.

------
#### [ Linux & macOS ]

```
aws ssm describe-document \
    --name "AWS-RunShellScript" \
    --query "[Document.Name,Document.Description]"
```

------
#### [ Windows ]

```
aws ssm describe-document ^
    --name "AWS-RunShellScript" ^
    --query "[Document.Name,Document.Description]"
```

------

다음 명령을 실행하여 사용 가능한 파라미터 및 해당 파라미터에 대한 세부 정보를 봅니다.

------
#### [ Linux & macOS ]

```
aws ssm describe-document \
    --name "AWS-RunShellScript" \
    --query "Document.Parameters[*]"
```

------
#### [ Windows ]

```
aws ssm describe-document ^
    --name "AWS-RunShellScript" ^
    --query "Document.Parameters[*]"
```

------

## 3단계: `AWS-RunShellScript` 문서를 사용하여 간단한 명령 전송
<a name="walkthrough-cli-example-1"></a>

다음 명령을 실행하여 관리형 노드에 대한 IP 정보를 가져옵니다.

Windows Server 관리형 노드를 대상으로 지정했다면, `document-name`을 `AWS-RunPowerShellScript`로 바꾸고 `command`를 `ifconfig`에서 `ipconfig`로 바꿉니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --instance-ids "instance-ID" \
    --document-name "AWS-RunShellScript" \
    --comment "IP config" \
    --parameters commands=ifconfig \
    --output text
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --instance-ids "instance-ID" ^
    --document-name "AWS-RunShellScript" ^
    --comment "IP config" ^
    --parameters commands=ifconfig ^
    --output text
```

------

**응답 데이터와 함께 명령 정보 가져오기**  
다음 명령은 이전 명령에서 반환된 명령 ID를 사용하여 명령 실행의 세부 정보와 응답 데이터를 가져옵니다. 명령이 완료되면 시스템에서 응답 데이터가 반환됩니다. 명령 실행에서 `"Pending"` 또는 `"InProgress"`가 표시되는 경우, 이 명령을 다시 실행하여 응답 데이터를 확인하십시오.

------
#### [ Linux & macOS ]

```
aws ssm list-command-invocations \
    --command-id $sh-command-id \
    --details
```

------
#### [ Windows ]

```
aws ssm list-command-invocations ^
    --command-id $sh-command-id ^
    --details
```

------

**사용자 식별**

다음 명령은 명령을 실행하는 기본 사용자를 표시합니다.

------
#### [ Linux & macOS ]

```
sh_command_id=$(aws ssm send-command \
    --instance-ids "instance-ID" \
    --document-name "AWS-RunShellScript" \
    --comment "Demo run shell script on Linux managed node" \
    --parameters commands=whoami \
    --output text \
    --query "Command.CommandId")
```

------

**명령 상태 가져오기**  
다음 명령은 명령 ID를 사용하여 관리형 노드에서 명령 실행 상태를 가져옵니다. 이 예에서는 이전 명령에서 반환된 명령 ID를 사용합니다.

------
#### [ Linux & macOS ]

```
aws ssm list-commands \
    --command-id "command-ID"
```

------
#### [ Windows ]

```
aws ssm list-commands ^
    --command-id "command-ID"
```

------

**명령 세부 정보 가져오기**  
다음 명령은 이전 명령의 명령 ID를 사용하여 관리형 노드 단위로 명령 실행 상태를 가져옵니다.

------
#### [ Linux & macOS ]

```
aws ssm list-command-invocations \
    --command-id "command-ID" \
    --details
```

------
#### [ Windows ]

```
aws ssm list-command-invocations ^
    --command-id "command-ID" ^
    --details
```

------

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
다음 명령은 특정 관리형 노드에 대한 원래 `aws ssm send-command` 요청을 반환합니다.

------
#### [ Linux & macOS ]

```
aws ssm list-command-invocations \
    --instance-id instance-ID \
    --command-id "command-ID" \
    --details
```

------
#### [ Windows ]

```
aws ssm list-command-invocations ^
    --instance-id instance-ID ^
    --command-id "command-ID" ^
    --details
```

------

**Python 버전 표시**

다음 명령은 노드에서 실행되는 Python의 버전을 반환합니다.

------
#### [ Linux & macOS ]

```
sh_command_id=$(aws ssm send-command \
    --instance-ids "instance-ID" \
    --document-name "AWS-RunShellScript" \
    --comment "Demo run shell script on Linux Instances" \
    --parameters commands='python -V' \
    --output text --query "Command.CommandId") \
    sh -c 'aws ssm list-command-invocations \
    --command-id "$sh_command_id" \
    --details \
    --query "CommandInvocations[].CommandPlugins[].{Status:Status,Output:Output}"'
```

------

## 4단계: Run Command을 사용하여 간단한 Python 스크립트 실행
<a name="walkthrough-cli-example-2"></a>

다음 명령은 Run Command을 사용하여 간단한 Python “Hello World” 스크립트를 실행합니다.

------
#### [ Linux & macOS ]

```
sh_command_id=$(aws ssm send-command \
    --instance-ids "instance-ID" \
    --document-name "AWS-RunShellScript" \
    --comment "Demo run shell script on Linux Instances" \
    --parameters '{"commands":["#!/usr/bin/python","print \"Hello World from python\""]}' \
    --output text \
    --query "Command.CommandId") \
    sh -c 'aws ssm list-command-invocations \
    --command-id "$sh_command_id" \
    --details \
    --query "CommandInvocations[].CommandPlugins[].{Status:Status,Output:Output}"'
```

------

## 5단계: Run Command를 사용하여 Bash 스크립트 실행
<a name="walkthrough-cli-example-3"></a>

이 섹션의 예에서는 Run Command를 사용하여 다음 bash 스크립트를 실행하는 방법을 보여줍니다.

Run Command를 사용하여 원격 위치에 저장된 스크립트를 실행하는 예는 [Amazon S3에서 스크립트 실행](integration-s3.md) 및 [GitHub에서 스크립트 실행](integration-remote-scripts.md)를 참조하세요.

```
#!/bin/bash
yum -y update
yum install -y ruby
cd /home/ec2-user
curl -O https://aws-codedeploy-us-east-2.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
```

이 스크립트는 *AWS CodeDeploy User Guide*의 [Create an Amazon EC2 instance for CodeDeploy](https://docs.aws.amazon.com/codedeploy/latest/userguide/instances-ec2-create.html)에 설명된 대로 Amazon Linux 및 Red Hat Enterprise Linux(RHEL) 인스턴스에 AWS CodeDeploy 에이전트를 설치합니다.

이 스크립트는 미국 동부(오하이오) 리전(us-east-2)인 `aws-codedeploy-us-east-2`의 AWS 관리형 S3 버킷에서 CodeDeploy 에이전트를 설치합니다.

**AWS CLI 명령에서 bash 스크립트 실행**

다음 샘플은 `--parameters` 옵션을 사용하여 CLI 명령에 bash 스크립트를 포함하는 방법을 보여줍니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets '[{"Key":"InstanceIds","Values":["instance-id"]}]' \
    --parameters '{"commands":["#!/bin/bash","yum -y update","yum install -y ruby","cd /home/ec2-user","curl -O https://aws-codedeploy-us-east-2.s3.amazonaws.com/latest/install","chmod +x ./install","./install auto"]}'
```

------

**JSON 파일에서 bash 스크립트 실행**

다음 예에서는 bash 스크립트의 내용을 JSON 파일로 저장하고, `--cli-input-json` 옵션을 사용하여 해당 파일을 명령에 포함합니다.

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name "AWS-RunShellScript" \
    --targets "Key=InstanceIds,Values=instance-id" \
    --cli-input-json file://installCodeDeployAgent.json
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name "AWS-RunShellScript" ^
    --targets "Key=InstanceIds,Values=instance-id" ^
    --cli-input-json file://installCodeDeployAgent.json
```

------

참조되는 `installCodeDeployAgent.json` 파일의 내용이 다음 예제에 나와 있습니다.

```
{
    "Parameters": {
        "commands": [
            "#!/bin/bash",
            "yum -y update",
            "yum install -y ruby",
            "cd /home/ec2-user",
            "curl -O https://aws-codedeploy-us-east-2.s3.amazonaws.com/latest/install",
            "chmod +x ./install",
            "./install auto"
        ]
    }
}
```

# 연습: Run Command에서 AWS Tools for Windows PowerShell 사용
<a name="walkthrough-powershell"></a>

다음 예에서는 AWS Tools for Windows PowerShell를 사용하여 명령 및 명령 파라미터에 대한 정보를 보는 방법, 명령을 실행하는 방법, 해당 명령의 상태를 보는 방법을 보여 줍니다. 이 연습에는 각 사전 정의 AWS Systems Manager 문서의 예가 포함되어 있습니다.

**중요**  
신뢰할 수 있는 관리자만 이번 주제에서 언급하는 Systems Manager 사전 구성 문서를 사용할 수 있도록 허용해야 합니다. Systems Manager 문서에서 지정하는 명령 또는 스크립트는 관리형 노드에 대한 관리자 권한으로 실행됩니다. 미리 정의된 Systems Manager 문서(AWS로 시작하는 모든 문서)를 실행할 권한이 있는 사용자는 해당 노드에 대한 관리자 권한도 보유합니다. 그 밖의 모든 사용자들에 대해서는 제한된 문서를 생성하여 그 문서를 특정 사용자와 공유해야 합니다.

**Topics**
+ [AWS Tools for Windows PowerShell 세션 설정 구성](#walkthrough-powershell-settings)
+ [사용할 수 있는 모든 문서 나열](#walkthrough-powershell-all-documents)
+ [PowerShell 명령 또는 스크립트 실행](#walkthrough-powershell-run-script)
+ [`AWS-InstallApplication` 문서를 사용하여 애플리케이션 설치](#walkthrough-powershell-install-application)
+ [`AWS-InstallPowerShellModule` JSON 문서를 사용하여 PowerShell 모듈 설치](#walkthrough-powershell-install-module)
+ [`AWS-JoinDirectoryServiceDomain` JSON 문서를 사용하여 도메인에 관리형 노드 조인](#walkthrough-powershell-domain-join)
+ [`AWS-ConfigureCloudWatch` 문서를 사용하여 Amazon CloudWatch Logs로 Windows 지표 전송](#walkthrough-powershell-windows-metrics)
+ [`AWS-ConfigureWindowsUpdate` 문서를 사용하여 Windows 자동 업데이트 설정 또는 해제](#walkthrough-powershell-enable-windows-update)
+ [Run Command를 사용하여 Windows 업데이트 관리](#walkthough-powershell-windows-updates)

## AWS Tools for Windows PowerShell 세션 설정 구성
<a name="walkthrough-powershell-settings"></a>

**자격 증명 지정**  
로컬 컴퓨터에서 **Tools for Windows PowerShell**을 열고 다음 명령을 실행하여 자격 증명을 지정합니다. 구성할 관리형 노드에 대한 관리자 권한이 있거나 AWS Identity and Access Management(IAM)에서 적절한 권한을 부여받아야 합니다. 자세한 내용은 [AWS Systems Manager에 대한 관리형 노드 설정](systems-manager-setting-up-nodes.md) 섹션을 참조하세요.

```
Set-AWSCredentials –AccessKey key-name –SecretKey key-name
```

**기본 AWS 리전 설정**  
다음 명령을 실행하여 PowerShell 세션의 리전을 설정합니다. 예제에서는 미국 동부(오하이오) 리전(us-east-2)을 사용합니다. Run Command는 **Amazon Web Services 일반 참조의 [Systems Manager 서비스 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region)에 나열된 AWS 리전에서 사용할 수 있습니다.

```
Set-DefaultAWSRegion `
    -Region us-east-2
```

## 사용할 수 있는 모든 문서 나열
<a name="walkthrough-powershell-all-documents"></a>

이 명령을 실행하면 계정에 사용 가능한 모든 문서가 나열됩니다.

```
Get-SSMDocumentList
```

## PowerShell 명령 또는 스크립트 실행
<a name="walkthrough-powershell-run-script"></a>

Run Command 및 `AWS-RunPowerShell` 문서를 사용하면 로컬로 로그인한 것처럼 관리형 노드에서 명령이나 스크립트를 실행할 수 있습니다. 명령을 내리거나 로컬 스크립트의 경로를 입력하여 명령을 실행할 수 있습니다.

**참고**  
Run Command를 사용할 때 서버와 관리형 노드를 재부팅하여 스크립트를 호출하는 방법은 [명령 실행 시 재부팅 처리](send-commands-reboot.md) 섹션을 참조하세요.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-RunPowerShellScript"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-RunPowerShellScript" | Select -ExpandProperty Parameters
```

### `AWS-RunPowerShellScript` 문서를 사용하여 명령 전송
<a name="walkthrough-powershell-run-script-send-command-aws-runpowershellscript"></a>

다음 명령은 두 개의 관리형 노드에 대해 `"C:\Users"` 디렉터리의 내용과 `"C:\"` 디렉터리의 내용을 보여줍니다.

```
$runPSCommand = Send-SSMCommand `
    -InstanceIds @("instance-ID-1", "instance-ID-2") `
    -DocumentName "AWS-RunPowerShellScript" `
    -Comment "Demo AWS-RunPowerShellScript with two instances" `
    -Parameter @{'commands'=@('dir C:\Users', 'dir C:\')}
```

**명령 요청 세부 정보 가져오기**  
다음 명령은 `CommandId`를 사용하여 두 관리형 노드에서 명령 실행 상태를 가져옵니다. 이 예에서는 이전 명령에서 반환된 `CommandId`를 사용합니다.

```
Get-SSMCommand `
    -CommandId $runPSCommand.CommandId
```

이 예에서 명령 상태는 성공, 보류 중 또는 진행 중일 수 있습니다.

**관리형 노드당 명령 정보 가져오기**  
다음 명령은 이전 명령의 `CommandId`를 사용하여 관리형 노드 단위로 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -CommandId $runPSCommand.CommandId
```

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
다음 명령은 특정 관리형 노드에 대한 원래 `Send-SSMCommand` 출력을 반환합니다.

```
Get-SSMCommandInvocation `
    -CommandId $runPSCommand.CommandId `
    -Details $true `
    -InstanceId instance-ID | Select -ExpandProperty CommandPlugins
```

### 명령 취소
<a name="walkthrough-powershell-run-script-cancel-command"></a>

다음 명령은 `AWS-RunPowerShellScript` 문서에 대한 `Send-SSMCommand`를 취소합니다.

```
$cancelCommand = Send-SSMCommand `
    -InstanceIds @("instance-ID-1","instance-ID-2") `
    -DocumentName "AWS-RunPowerShellScript" `
    -Comment "Demo AWS-RunPowerShellScript with two instances" `
    -Parameter @{'commands'='Start-Sleep –Seconds 120; dir C:\'}

Stop-SSMCommand -CommandId $cancelCommand.CommandId
```

**명령 상태 확인**  
다음 명령은 `Cancel` 명령의 상태를 확인합니다.

```
Get-SSMCommand `
    -CommandId $cancelCommand.CommandId
```

## `AWS-InstallApplication` 문서를 사용하여 애플리케이션 설치
<a name="walkthrough-powershell-install-application"></a>

Run Command 및 `AWS-InstallApplication` 문서를 사용하면 관리형 노드에 애플리케이션을 설치, 복구 또는 제거할 수 있습니다. 이 명령에는 MSI 경로 또는 주소가 필요합니다.

**참고**  
Run Command를 사용할 때 서버와 관리형 노드를 재부팅하여 스크립트를 호출하는 방법은 [명령 실행 시 재부팅 처리](send-commands-reboot.md) 섹션을 참조하세요.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-InstallApplication"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-InstallApplication" | Select -ExpandProperty Parameters
```

### `AWS-InstallApplication` 문서를 사용하여 명령 전송
<a name="walkthrough-powershell-install-application-send-command-aws-installapplication"></a>

다음 명령은 무인 모드로 관리형 노드에 Python 버전을 설치하고 `C:` 드라이브의 로컬 텍스트 파일에 출력을 로깅합니다.

```
$installAppCommand = Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallApplication" `
    -Parameter @{'source'='https://www.python.org/ftp/python/2.7.9/python-2.7.9.msi'; 'parameters'='/norestart /quiet /log c:\pythoninstall.txt'}
```

**관리형 노드당 명령 정보 가져오기**  
다음 명령은 `CommandId`를 사용하여 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -CommandId $installAppCommand.CommandId `
    -Details $true
```

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
다음 명령은 Python 설치 결과를 반환합니다.

```
Get-SSMCommandInvocation `
    -CommandId $installAppCommand.CommandId `
    -Details $true `
    -InstanceId instance-ID | Select -ExpandProperty CommandPlugins
```

## `AWS-InstallPowerShellModule` JSON 문서를 사용하여 PowerShell 모듈 설치
<a name="walkthrough-powershell-install-module"></a>

Run Command를 사용하여 관리형 노드에 PowerShell 모듈을 설치할 수 있습니다. PowerShell 모듈에 대한 자세한 내용은 [Windows PowerShell Modules](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_modules?view=powershell-6) 섹션을 참조하세요.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-InstallPowerShellModule"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-InstallPowerShellModule" | Select -ExpandProperty Parameters
```

### PowerShell 모듈 설치
<a name="walkthrough-powershell-install-module-install"></a>

다음 명령은 EZOut.zip 파일을 다운로드하여 설치한 다음, 명령을 추가로 실행하여 XPS 뷰어를 설치합니다. 마지막으로 이 명령의 출력이 “amzn-s3-demo-bucket”이라는 S3 버킷으로 업로드됩니다.

```
$installPSCommand = Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallPowerShellModule" `
    -Parameter @{'source'='https://gallery.technet.microsoft.com/EZOut-33ae0fb7/file/110351/1/EZOut.zip';'commands'=@('Add-WindowsFeature -name XPS-Viewer -restart')} `
    -OutputS3BucketName amzn-s3-demo-bucket
```

**관리형 노드당 명령 정보 가져오기**  
다음 명령은 `CommandId`를 사용하여 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -CommandId $installPSCommand.CommandId `
    -Details $true
```

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
다음 명령은 특정 `CommandId`에 대한 원래 `Send-SSMCommand` 출력을 반환합니다.

```
Get-SSMCommandInvocation `
    -CommandId $installPSCommand.CommandId `
    -Details $true | Select -ExpandProperty CommandPlugins
```

## `AWS-JoinDirectoryServiceDomain` JSON 문서를 사용하여 도메인에 관리형 노드 조인
<a name="walkthrough-powershell-domain-join"></a>

Run Command를 사용하여 AWS Directory Service 도메인에 관리형 노드를 빠르게 조인할 수 있습니다. 이 명령을 실행하기 전에 [디렉터리를 생성](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started_create_directory.html)합니다. 또한 Directory Service에 대해 자세히 알아보는 것이 좋습니다. 자세한 내용은 [AWS Directory Service 관리 안내서](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/)를 참조하세요.

도메인에 관리형 노드를 조인하는 것만 가능합니다. 도메인에서 노드를 제거할 수는 없습니다.

**참고**  
Run Command를 사용하여 스크립트를 호출할 관리형 노드에 대한 자세한 내용은 [명령 실행 시 재부팅 처리](send-commands-reboot.md) 섹션을 참조하세요.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-JoinDirectoryServiceDomain"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-JoinDirectoryServiceDomain" | Select -ExpandProperty Parameters
```

### 관리형 노드를 도메인에 조인
<a name="walkthrough-powershell-domain-join-instance"></a>

다음 명령은 관리되는 노드를 지정된 Directory Service 도메인에 조인하고, 생성된 모든 아웃풋을 예시 Amazon Simple Storage Service(Amazon S3) 버킷에 업로드합니다.

```
$domainJoinCommand = Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-JoinDirectoryServiceDomain" `
    -Parameter @{'directoryId'='d-example01'; 'directoryName'='ssm.example.com'; 'dnsIpAddresses'=@('192.168.10.195', '192.168.20.97')} `
    -OutputS3BucketName amzn-s3-demo-bucket
```

**관리형 노드당 명령 정보 가져오기**  
다음 명령은 `CommandId`를 사용하여 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -CommandId $domainJoinCommand.CommandId `
    -Details $true
```

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
이 명령은 특정 `CommandId`에 대한 원래 `Send-SSMCommand`의 출력을 반환합니다.

```
Get-SSMCommandInvocation `
    -CommandId $domainJoinCommand.CommandId `
    -Details $true | Select -ExpandProperty CommandPlugins
```

## `AWS-ConfigureCloudWatch` 문서를 사용하여 Amazon CloudWatch Logs로 Windows 지표 전송
<a name="walkthrough-powershell-windows-metrics"></a>

Windows용 이벤트 추적(ETW) 로그 및 시스템, 보안, 애플리케이션의 Windows Server 메시지를 Amazon CloudWatch Logs로 보낼 수 있습니다. 로그 기록을 처음 활성화하면 Systems Manager는 애플리케이션, 보안, ETW 로그를 업로드하기 시작한 시간부터 1분 내에 생성된 모든 로그를 전송합니다. 시작한 시간보다 1분 전에 발생한 로그는 포함되지 않습니다. 로깅을 해제했다가 나중에 다시 설정하면 Systems Manager는 중단된 시간부터 로그를 전송합니다. 사용자 정의 로그 파일 및 인터넷 정보 서비스(IIS) 로그의 경우 Systems Manager는 시작 지점부터 로그 파일을 읽습니다. 또한 Systems Manager는 성능 카운터 데이터를 CloudWatch Logs로 전송할 수도 있습니다.

이전에 EC2Config에서 CloudWatch 통합을 설정한 경우 Systems Manager 설정이 `C:\Program Files\Amazon\EC2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.json` 파일의 관리형 노드에 로컬로 저장된 모든 설정을 재정의합니다. EC2Config를 사용하여 단일 관리형 노드에서 성능 카운터 및 로그를 관리하는 방법에 대한 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [CloudWatch 에이전트를 사용하여 Amazon EC2 인스턴스 및 온프레미스 서버로부터 지표 및 로그 수집](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)을 참조하세요.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-ConfigureCloudWatch"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-ConfigureCloudWatch" | Select -ExpandProperty Parameters
```

### CloudWatch로 애플리케이션 로그 전송
<a name="walkthrough-powershell-windows-metrics-send-logs-cloudwatch"></a>

다음 명령은 관리형 노드를 구성하고 Windows 애플리케이션 로그를 CloudWatch로 이동합니다.

```
$cloudWatchCommand = Send-SSMCommand `
    -InstanceID instance-ID `
    -DocumentName "AWS-ConfigureCloudWatch" `
    -Parameter @{'properties'='{"engineConfiguration": {"PollInterval":"00:00:15", "Components":[{"Id":"ApplicationEventLog", "FullName":"AWS.EC2.Windows.CloudWatch.EventLog.EventLogInputComponent,AWS.EC2.Windows.CloudWatch", "Parameters":{"LogName":"Application", "Levels":"7"}},{"Id":"CloudWatch", "FullName":"AWS.EC2.Windows.CloudWatch.CloudWatchLogsOutput,AWS.EC2.Windows.CloudWatch", "Parameters":{"Region":"region", "LogGroup":"my-log-group", "LogStream":"instance-id"}}], "Flows":{"Flows":["ApplicationEventLog,CloudWatch"]}}}'}
```

**관리형 노드당 명령 정보 가져오기**  
다음 명령은 `CommandId`를 사용하여 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -CommandId $cloudWatchCommand.CommandId `
    -Details $true
```

**특정 관리형 노드에 대한 응답 데이터로 명령 정보 가져오기**  
다음 명령은 Amazon CloudWatch 구성 결과를 반환합니다.

```
Get-SSMCommandInvocation `
    -CommandId $cloudWatchCommand.CommandId `
    -Details $true `
    -InstanceId instance-ID | Select -ExpandProperty CommandPlugins
```

### `AWS-ConfigureCloudWatch` 문서를 사용하여 CloudWatch로 성능 카운터 전송
<a name="walkthrough-powershell-windows-metrics-send-performance-counters-cloudwatch"></a>

다음 명령 예는 CloudWatch로 성능 카운터를 업로드합니다. 자세한 내용은 *[Amazon CloudWatch 사용 설명서](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/)*를 참조하세요.

```
$cloudWatchMetricsCommand = Send-SSMCommand `
    -InstanceID instance-ID `
    -DocumentName "AWS-ConfigureCloudWatch" `
    -Parameter @{'properties'='{"engineConfiguration": {"PollInterval":"00:00:15", "Components":[{"Id":"PerformanceCounter", "FullName":"AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch", "Parameters":{"CategoryName":"Memory", "CounterName":"Available MBytes", "InstanceName":"", "MetricName":"AvailableMemory", "Unit":"Megabytes","DimensionName":"", "DimensionValue":""}},{"Id":"CloudWatch", "FullName":"AWS.EC2.Windows.CloudWatch.CloudWatch.CloudWatchOutputComponent,AWS.EC2.Windows.CloudWatch", "Parameters":{"AccessKey":"", "SecretKey":"","Region":"region", "NameSpace":"Windows-Default"}}], "Flows":{"Flows":["PerformanceCounter,CloudWatch"]}}}'}
```

## `AWS-ConfigureWindowsUpdate` 문서를 사용하여 Windows 자동 업데이트 설정 또는 해제
<a name="walkthrough-powershell-enable-windows-update"></a>

Run Command 및 `AWS-ConfigureWindowsUpdate` 문서를 사용하면 Windows Server 관리형 노드에서 Windows 자동 업데이트를 설정 또는 해제할 수 있습니다. 이 명령은 Windows Update 에이전트를 구성하여 사용자가 지정하는 요일과 시간에 Windows Update를 다운로드 및 설치합니다. 업데이트에 재부팅이 필요한 경우, 업데이트가 설치되고 15분 후 관리형 노드가 자동으로 재부팅됩니다. 이 명령을 사용하여 업데이트 설치가 아닌 확인을 위해 Windows Update를 구성할 수도 있습니다. `AWS-ConfigureWindowsUpdate` 문서는 Windows Server 2012 이상 버전에서 공식적으로 지원됩니다.

**설명 및 사용 가능한 파라미터 보기**

```
Get-SSMDocumentDescription `
    –Name "AWS-ConfigureWindowsUpdate"
```

**파라미터에 대한 자세한 내용 보기**

```
Get-SSMDocumentDescription `
    -Name "AWS-ConfigureWindowsUpdate" | Select -ExpandProperty Parameters
```

### Windows 자동 업데이트 설정
<a name="walkthrough-powershell-enable-windows-update-automatic"></a>

다음 명령은 Windows Update를 구성하여 매일 오후 10시에 업데이트를 자동으로 다운로드하고 설치합니다.

```
$configureWindowsUpdateCommand = Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-ConfigureWindowsUpdate" `
    -Parameters @{'updateLevel'='InstallUpdatesAutomatically'; 'scheduledInstallDay'='Daily'; 'scheduledInstallTime'='22:00'}
```

**Windows 자동 업데이트 허용을 위한 명령 상태 보기**  
다음 명령은 `CommandId`를 사용하여 Windows 자동 업데이트 허용을 위한 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -Details $true `
    -CommandId $configureWindowsUpdateCommand.CommandId | Select -ExpandProperty CommandPlugins
```

### Windows 자동 업데이트 해제
<a name="walkthrough-powershell-enable-windows-update-disable"></a>

다음 명령은 시스템에서 업데이트를 확인하지만 관리형 노드를 자동으로 업데이트하지 않도록 Windows 업데이트 알림 수준을 낮춥니다.

```
$configureWindowsUpdateCommand = Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-ConfigureWindowsUpdate" `
    -Parameters @{'updateLevel'='NeverCheckForUpdates'}
```

**Windows 자동 업데이트 해제를 위한 명령 상태 보기**  
다음 명령은 `CommandId`를 사용하여 Windows 자동 업데이트 해제를 위한 명령 실행 상태를 가져옵니다.

```
Get-SSMCommandInvocation `
    -Details $true `
    -CommandId $configureWindowsUpdateCommand.CommandId | Select -ExpandProperty CommandPlugins
```

## Run Command를 사용하여 Windows 업데이트 관리
<a name="walkthough-powershell-windows-updates"></a>

Run Command 및 `AWS-InstallWindowsUpdates` 문서를 사용하면 Windows Server 관리형 노드에 대한 업데이트를 관리할 수 있습니다. 이 명령은 관리형 노드에 누락된 업데이트를 스캔하거나 설치하고 다음 설치를 선택적으로 재부팅합니다. 또한 사용자 환경에 설치할 업데이트에 대한 적절한 분류 및 심각도 수준을 지정할 수 있습니다.

**참고**  
Run Command를 사용할 때 서버와 관리형 노드를 재부팅하여 스크립트를 호출하는 방법은 [명령 실행 시 재부팅 처리](send-commands-reboot.md) 섹션을 참조하세요.

다음 예제에서는 지정된 Windows 업데이트 관리 작업을 수행하는 방법을 보여 줍니다.

### 누락된 Windows 업데이트를 모두 검색
<a name="walkthough-powershell-windows-updates-search"></a>

```
Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallWindowsUpdates" `
    -Parameters @{'Action'='Scan'}
```

### 특정 Windows 업데이트 설치
<a name="walkthough-powershell-windows-updates-install-specific"></a>

```
Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallWindowsUpdates" `
    -Parameters @{'Action'='Install';'IncludeKbs'='kb-ID-1,kb-ID-2,kb-ID-3';'AllowReboot'='True'}
```

### 누락된 중요 Windows 업데이트 설치
<a name="walkthough-powershell-windows-updates-install-missing"></a>

```
Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallWindowsUpdates" `
    -Parameters @{'Action'='Install';'SeverityLevels'='Important';'AllowReboot'='True'}
```

### 누락된 Windows 업데이트를 특정 항목을 배제하고 설치
<a name="walkthough-powershell-windows-updates-install-exclusions"></a>

```
Send-SSMCommand `
    -InstanceId instance-ID `
    -DocumentName "AWS-InstallWindowsUpdates" `
    -Parameters @{'Action'='Install';'ExcludeKbs'='kb-ID-1,kb-ID-2';'AllowReboot'='True'}
```

# Systems Manager Run Command 문제 해결
<a name="troubleshooting-remote-commands"></a>

AWS Systems Manager의 도구인 Run Command는 각 명령 실행에 대한 상태 정보를 제공합니다. 명령 상태에 대한 자세한 내용은 [명령 상태 이해](monitor-commands.md) 섹션을 참조하세요. 이 단원의 내용을 참조하여 Run Command와 관련된 문제를 해결할 수도 있습니다.

**Topics**
+ [일부 관리형 노드가 누락됨](#where-are-instances)
+ [스크립트의 단계가 실패했지만 전체 상태는 'succeeded(성공)'입니다.](#ts-exit-codes)
+ [SSM Agent가 제대로 실행되지 않음](#ts-ssmagent-linux)

## 일부 관리형 노드가 누락됨
<a name="where-are-instances"></a>

**명령 실행(Run a command)** 페이지에서 실행할 SSM 문서를 선택하고 **대상(Targets)** 섹션에서 **수동으로 인스턴스 선택(Manually selecting instances)**을 선택한 후 명령을 실행하도록 선택할 수 있는 관리형 노드 목록이 표시됩니다.

예상한 관리형 노드가 목록에 없으면 [관리형 노드 가용성 문제 해결](fleet-manager-troubleshooting-managed-nodes.md)에서 문제 해결 팁을 참조하세요.

관리형 노드를 생성, 활성화, 재부팅 또는 재시작하거나, 노드에 Run Command를 설치하거나, AWS Identity and Access Management(IAM) 인스턴스 프로파일을 노드에 연결한 후, 목록에 관리형 노드가 추가되는 데 몇 분 정도 걸릴 수 있습니다.

## 스크립트의 단계가 실패했지만 전체 상태는 'succeeded(성공)'입니다.
<a name="ts-exit-codes"></a>

Run Command를 사용하여 스크립트에서 종료 코드를 처리하는 방법을 정의할 수 있습니다. 기본적으로 스크립트에서 실행된 마지막 명령의 종료 코드는 전체 스크립트의 종료 코드로 보고됩니다. 그러나 마지막 명령 이전에 명령이 실패하는 경우 셸 조건문을 포함하여 스크립트를 종료할 수 있습니다. 자세한 내용 및 예제는 [명령에 종료 코드 지정](run-command-handle-exit-status.md#command-exit-codes) 섹션을 참조하세요.

## SSM Agent가 제대로 실행되지 않음
<a name="ts-ssmagent-linux"></a>

Run Command를 사용하여 명령을 실행하는 데 문제가 있는 경우 SSM Agent에 문제가 있을 수 있습니다. SSM Agent 문제 조사에 대한 자세한 내용은 [SSM Agent 문제 해결](troubleshooting-ssm-agent.md) 섹션을 참조하세요.