

# AWS CLI 사용
<a name="cli-chap-using"></a>

이 섹션에서는 구성 [AWS CLI에서 엔드포인트 사용](cli-configure-endpoints.md) 섹션에서 다룬 세부 사항을 넘어 AWS Command Line Interface(AWS CLI)에서 사용할 수 있는 일반적인 용도, 일반적인 기능 및 옵션에 대한 포괄적인 개요를 제공합니다.

이 안내서에서는 AWS CLI 명령어의 기본 구조, 형식 지정, 필터링 기능 등 명령어 작성의 기본적인 측면에 대해 자세히 설명합니다. 이러한 핵심 요소를 이해하면 복잡한 웹 기반 콘솔을 탐색할 필요 없이 필요한 리소스와 작업을 정확하게 타겟팅하는 명령을 구성할 수 있습니다.

또한 AWS CLI에 사용할 수 있는 도움말 콘텐츠 및 문서가 강조 표시됩니다. 기본 제공되는 명령줄 도움말부터 종합적인 [AWS CLI 버전 2참조 안내서](https://docs.aws.amazon.com/cli/latest/reference/)까지, AWS CLI의 기능을 탐색하는 데 도움이 되는 정보에 액세스할 수 있습니다.

AWS 서비스별 예제 및 사용 사례는 [AWS CLI의 예](cli-chap-code-examples.md) 또는 [AWS CLI 버전 2 참조 안내서](https://docs.aws.amazon.com/cli/latest/reference/)를 참조하세요. 여기에서는 명령어별 정보를 제공하고 다양한 AWS 서비스에서 AWS CLI를 활용하는 방법에 대한 예제를 보여 줍니다.

**참고**  
기본적으로 AWS CLI는 TCP 포트 443에서 HTTPS를 사용하여 AWS 서비스에 요청을 보냅니다. AWS CLI를 성공적으로 사용하려면 이 포트에서 아웃바운드 연결을 할 수 있어야 합니다.

**Topics**
+ [AWS CLI에 대한 도움말 및 리소스 액세스](cli-usage-help.md)
+ [AWS CLI의 명령 구조](cli-usage-commandstructure.md)
+ [AWS CLI에서 파라미터 값 지정](cli-usage-parameters.md)
+ [AWS CLI에서 명령 프롬프트 활성화 및 사용](cli-usage-parameters-prompting.md)
+ [AWS CLI에서 명령 출력 제어](cli-usage-output.md)
+ [AWS CLI의 명령줄 반환 코드](cli-usage-returncodes.md)
+ [AWS CLI에서 사용자 지정 마법사를 사용하여 에서 대화형 명령 실행](cli-usage-wizard.md)
+ [AWS CLI에서 별칭 생성 및 사용](cli-usage-alias.md)
+ [AWS CLI에 대한 오류 문제 해결](cli-chap-troubleshooting.md)

# AWS CLI에 대한 도움말 및 리소스 액세스
<a name="cli-usage-help"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)에 대한 도움말 콘텐츠에 액세스하는 방법을 설명합니다.

**Topics**
+ [기본 제공 AWS CLI help 명령](#cli-usage-help-command)
+ [AWS CLI 참조 안내서](#cli-reference)
+ [API 설명서](#api-reference)
+ [오류 해결](#help-tshoot)
+ [추가 도움말](#help-additional)

## 기본 제공 AWS CLI help 명령
<a name="cli-usage-help-command"></a>

AWS Command Line Interface(AWS CLI) 사용 중 모든 명령에 대한 도움을 얻을 수 있습니다. 이를 위해 명령 이름 끝에 `help`를 입력하기만 하면 됩니다.

예를 들어, 다음 명령은 일반 AWS CLI 옵션에 대한 도움말과 사용 가능한 최상위 명령을 표시합니다.

```
$ aws help
```

다음 명령은 사용 가능한 Amazon Elastic Compute Cloud(Amazon EC2) 특정 명령을 표시합니다.

```
$ aws ec2 help
```

다음 예제는 Amazon EC2 `DescribeInstances` 작업에 대한 자세한 도움말을 표시합니다. 도움말에는 입력 파라미터, 사용 가능한 필터, 출력으로 포함되는 항목에 대한 설명이 포함됩니다. 해당 명령의 일반적인 변형을 입력하는 방법을 보여주는 예제도 포함되어 있습니다.

```
$ aws ec2 describe-instances help
```

버전 `2.31.0` 이후 `help` 명령에 대한 표시는 `cli_help_output` 설정에 의해 구성되며 다음 값을 갖습니다.
+  **(기본값)** `terminal` - 터미널에서 맨 페이지를 엽니다.
+ `browser` ‐ 기본 브라우저에서 로컬 HTML 파일로 맨 페이지를 엽니다. 기본 브라우저를 열면 터미널에 알림이 인쇄되고 AWS CLI가 브라우저를 열 수 없는 경우 오류 메시지가 표시됩니다.
+ `url` ‐ 설치한 AWS CLI 버전의 온라인 AWS CLI 참조 가이드에 URL을 인쇄합니다. `AWS_PAGER` 환경 변수와 같은 클라이언트 측 페이징에 대한 설정이 준수됩니다.

각 명령에 대한 도움말 콘텐츠는 다음과 같은 6개 섹션으로 나뉩니다.

이름  
명령의 이름입니다.  

```
NAME
       describe-instances -
```

설명  
명령이 호출하는 API 작업에 대한 설명입니다.  

```
DESCRIPTION
       Describes one or more of your instances.

       If you specify one or more instance IDs, Amazon EC2 returns information
       for those instances. If you do not specify  instance  IDs,  Amazon  EC2
       returns  information  for  all  relevant  instances.  If you specify an
       instance ID that is not valid, an error is returned. If you specify  an
       instance  that  you  do  not  own,  it  is not included in the returned
       results.
...
```

시놉시스  
명령 및 옵션 사용을 위한 기본 구문입니다. 옵션을 대괄호로 표시할 경우 선택적인 옵션이거나, 기본값을 가지거나, 사용할 수 있는 대체 옵션을 갖고 있습니다.  

```
SYNOPSIS
            describe-instances
          [--dry-run | --no-dry-run]
          [--instance-ids <value>]
          [--filters <value>]
          [--cli-input-json <value>]
          [--starting-token <value>]
          [--page-size <value>]
          [--max-items <value>]
          [--generate-cli-skeleton]
```
예를 들어 `describe-instances`에는 현재 계정 및 AWS 리전의 ***모든*** 인스턴스를 설명하는 기본 동작이 있습니다. 1개 이상의 인스턴스를 설명할 `instance-ids` 목록을 선택적으로 지정할 수 있습니다. `dry-run`은 값을 가지지 않는 선택 사항인 부울 플래그입니다. 부울 플래그를 사용하려면 표시된 값을 지정합니다. 이 경우 `--dry-run` 또는 `--no-dry-run`입니다. 마찬가지로 `--generate-cli-skeleton`도 값을 갖고 있지 않습니다. 옵션 사용 시 조건이 있는 경우 해당 조건을 `OPTIONS` 섹션에서 설명하거나 예제에 표시합니다.

옵션  
개요에 표시된 각 옵션에 대한 설명입니다.  

```
OPTIONS
       --dry-run | --no-dry-run (boolean)
          Checks whether you have the required  permissions  for  the  action,
          without actually making the request, and provides an error response.
          If you have the required permissions, the error response is  DryRun-
          Operation . Otherwise, it is UnauthorizedOperation .

       --instance-ids (list)
          One or more instance IDs.

          Default: Describes all your instances.
...
```

예제:  
명령 및 해당 옵션의 사용을 보여 주는 예제입니다. 필요한 명령 또는 사용 사례에 대해 사용 가능한 예제가 없는 경우 이 페이지의 피드백 링크를 사용하여 요청하거나 명령의 도움말 페이지에 있는 AWS CLI 명령 참조에서 요청할 수 있습니다.  

```
    EXAMPLES
    To describe an Amazon EC2 instance

    Command:
    
    aws ec2 describe-instances --instance-ids i-5203422c
    
    To describe all instances with the instance type m1.small
    
    Command:
    
    aws ec2 describe-instances --filters "Name=instance-type,Values=m1.small"
    
    To describe all instances with an Owner tag
    
    Command:
    
    aws ec2 describe-instances --filters "Name=tag-key,Values=Owner"
...
```

출력  
의 응답에 포함되는 각 필드 및 데이터 형식에 대한 설명입니다AWS  
`describe-instances`의 경우 출력은 예약 객체의 목록이며, 각 객체에는 연관된 인스턴스에 대한 정보를 포함하는 여러 필드 및 객체가 포함됩니다. 이 정보는 Amazon EC2에 사용된 [예약 데이터 형식에 대한 API 설명서](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Reservation.html)에서 가져오는 것입니다.  

```
OUTPUT
       Reservations -> (list)
          One or more reservations.

          (structure)
              Describes a reservation.

              ReservationId -> (string)
                 The ID of the reservation.

              OwnerId -> (string)
                 The ID of the AWS account that owns the reservation.

              RequesterId -> (string)
                 The ID of the requester that launched the instances  on  your
                 behalf (for example, AWS Management Console or Auto Scaling).

              Groups -> (list)
                 One or more security groups.

                 (structure)
                     Describes a security group.

                     GroupName -> (string)
                        The name of the security group.

                     GroupId -> (string)
                        The ID of the security group.

              Instances -> (list)
                 One or more instances.

                 (structure)
                     Describes an instance.

                     InstanceId -> (string)
                        The ID of the instance.

                     ImageId -> (string)
                        The ID of the AMI used to launch the instance.

                     State -> (structure)
                        The current state of the instance.

                        Code -> (integer)
                            The  low  byte represents the state. The high byte
                            is an opaque internal value and should be ignored.
...
```
AWS CLI가 출력을 JSON으로 렌더링하는 경우 다음 샘플과 유사한 예약 객체의 배열이 됩니다.  

```
{
    "Reservations": [
        {
            "OwnerId": "012345678901",
            "ReservationId": "r-4c58f8a0",
            "Groups": [],
            "RequesterId": "012345678901",
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "ec2-52-74-16-12.us-west-2.compute.amazonaws.com",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
...
```
각 예약 객체에는 예약을 설명하는 필드와 인스턴스 객체의 배열이 포함됩니다. 각 배열에는 고유한 필드(예: `PublicDnsName`) 및 이를 설명하는 객체(예: `State`)가 있습니다.  
**Windows 사용자**  
도움말 파일을 한 번에 한 페이지씩 보기 위해 help 명령의 출력을 `more` 명령에 *파이프* (\$1)할 수 있습니다. 문서를 더 보려면 스페이스바 또는 **PgDn** 키를 누르고, 중지하려면 **q**를 누릅니다.  

```
C:\> aws ec2 describe-instances help | more
```

## AWS CLI 참조 안내서
<a name="cli-reference"></a>

도움말 파일에는 명령줄에서 탐색하거나 볼 수 없는 링크가 포함됩니다. 온라인 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 사용하여 이러한 링크를 보고 상호 작용할 수 있습니다. 참조 가이드에는 모든 AWS CLI 명령에 대한 도움말 콘텐츠도 포함되어 있습니다. 이 설명은 쉽게 탐색하고 모바일, 태블릿 또는 데스크톱 화면에서 볼 수 있도록 제공됩니다.

## API 설명서
<a name="api-reference"></a>

AWS CLI의 모든 명령은 AWS 서비스의 퍼블릭 API에 대해 이루어진 요청에 해당합니다. 퍼블릭 API를 사용하는 각 서비스에는 [AWS 설명서 웹사이트](https://docs.aws.amazon.com/)의 해당 서비스 홈페이지에서 찾을 수 있는 API 참조가 있습니다. API 참조 콘텐츠는 API 구성 방법 및 사용되는 프로토콜에 따라 다릅니다. 일반적으로 API 참조에는 API에서 지원하는 작업에 대한 세부 정보, 서비스와 주고 받은 데이터 및 서비스에서 보고할 수 있는 오류 조건이 포함됩니다.

**API 설명서 섹션**
+  **작업** - 각 작업과 해당 파라미터에 대한 세부 정보(길이 또는 콘텐츠에 대한 제약, 기본값 등)입니다. 이 작업에 발생할 수 있는 오류를 나열합니다. 각 작업은 AWS CLI의 하위 명령에 해당합니다.
+  **데이터 유형** - 명령이 파라미터로 요구하거나 요청에 대한 응답으로 반환할 수 있는 구조에 대한 자세한 정보입니다.
+  **범용 파라미터** - 서비스의 모든 작업에서 공유하는 파라미터에 대한 세부 정보입니다.
+  **범용 오류** - 모든 서비스 작업에서 반환할 수 있는 오류에 대한 세부 정보입니다.

각 섹션의 이름 및 가용성은 서비스에 따라 다를 수 있습니다.

**서비스별 CLI**  
모든 서비스에서 작동하는 단일 AWS CLI가 작성되기 전에 일부 서비스에 별도의 CLI가 있습니다. 이 서비스별 CLI에는 해당 서비스의 설명서 페이지에서 링크되는 별도의 설명서가 있습니다. 서비스별 CLI에 대한 문서는 AWS CLI에 적용되지 않습니다.

## 오류 해결
<a name="help-tshoot"></a>

AWS CLI 오류의 진단 및 수정에 대한 자세한 내용은 [AWS CLI에 대한 오류 문제 해결](cli-chap-troubleshooting.md) 섹션을 참조하세요.

## 추가 도움말
<a name="help-additional"></a>

AWS CLI 문제에 추가적인 도움이 필요하면 *GitHub*의 [AWS CLI커뮤니티](https://github.com/aws/aws-cli/issues)를 방문하세요.

# AWS CLI의 명령 구조
<a name="cli-usage-commandstructure"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI) 명령을 구성하는 방법과 wait 명령을 사용하는 방법에 대해 설명합니다.

**Topics**
+ [명령 구조](#cli-usage-commandstructure-structure.title)
+ [wait 명령](#cli-usage-commandstructure-wait)

## 명령 구조
<a name="cli-usage-commandstructure-structure.title"></a>

AWS CLI는 다음 순서로 지정되어야 하는 명령줄에서 멀티파트 구조를 사용합니다.

1. `aws` 프로그램에 대한 기본 호출.

1. 최상위 *명령*: 일반적으로 AWS에서 지원하는 AWS CLI 서비스에 해당합니다.

1. 어떤 작업을 수행할지 지정하는 *하위 명령* 입니다.

1. 작업에 필요한 일반 AWS CLI 옵션 또는 파라미터입니다. 처음 세 개 파트를 따르기만 하면 어떤 순서로든 지정할 수 있습니다. 독점적인 파라미터를 여러 번 지정하면 *마지막 값*만 적용됩니다.

```
$ aws <command> <subcommand> [options and parameters]
```

파라미터는 숫자, 문자열, 목록, 맵, JSON 구조와 같은 다양한 유형의 입력 값을 가져올 수 있습니다. 무엇이 지원되는지는 지정하는 명령 및 하위 명령에 따라 달라집니다.

### 예시
<a name="cli-usage-commandstructure-structure-example"></a>

**Amazon S3**

다음 예제에서는 모든 Amazon S3 버킷을 나열합니다.

```
$ aws s3 ls
2018-12-11 17:08:50 amzn-s3-demo-bucket1
2018-12-14 14:55:44 amzn-s3-demo-bucket2
```

Amazon S3 명령에 대한 자세한 내용은 *AWS CLI 명령 참조*에서 [https://docs.aws.amazon.com/cli/latest/reference/s3/index.html](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) 섹션을 참조하세요.

**AWS CloudFormation**

다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html)명령 예제에서는 cloudformation 스택 이름을 *my-change-set*로 변경합니다.

```
$ aws cloudformation create-change-set --stack-name my-stack --change-set-name my-change-set
```

AWS CloudFormation 명령에 대한 자세한 내용은 *AWS CLI 명령 참조*의 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/index.html) 섹션을 참조하세요.

## wait 명령
<a name="cli-usage-commandstructure-wait"></a>

일부 AWS 서비스에는 사용 가능한 `wait` 명령이 있습니다. `aws wait`를 사용하는 명령은 일반적으로 명령이 완료될 때까지 기다린 후 다음 단계로 넘어갑니다. 이는 wait 명령이 실패할 경우 후속 단계로 이동하지 않도록 wait 명령을 사용할 수 있으므로 멀티파트 명령 또는 스크립팅에 특히 유용합니다.

AWS CLI는 다음 순서로 지정되어야 하는 `wait` 명령의 경우 명령줄에서 멀티파트 구조를 사용합니다.

1. `aws` 프로그램에 대한 기본 호출.

1. 최상위 *명령*: 일반적으로 AWS에서 지원하는 AWS CLI 서비스에 해당합니다.

1. `wait` 명령.

1. 어떤 작업을 수행할지 지정하는 *하위 명령* 입니다.

1. 작업에 필요한 일반 CLI 옵션 또는 파라미터입니다. 처음 세 개 파트를 따르기만 하면 어떤 순서로든 지정할 수 있습니다. 독점적인 파라미터를 여러 번 지정하면 *마지막 값*만 적용됩니다.

```
$ aws <command> wait <subcommand> [options and parameters]
```

파라미터는 숫자, 문자열, 목록, 맵, JSON 구조와 같은 다양한 유형의 입력 값을 가져올 수 있습니다. 무엇이 지원되는지는 지정하는 명령 및 하위 명령에 따라 달라집니다.

**참고**  
모든 AWS 서비스가 `wait` 명령을 지원하는 것은 아닙니다. 서비스가 `wait` 명령을 지원하는지 확인하려면 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

### 예시
<a name="cli-usage-commandstructure-wait-example"></a>

**AWS CloudFormation**

다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/change-set-create-complete.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/change-set-create-complete.html) 명령 예제는 *my-stack* 스택의 *my-change-set* 변경 세트가 실행될 준비가 되었음을 확인한 후에만 일시 중지하고 다시 시작합니다.

```
$ aws cloudformation wait change-set-create-complete --stack-name my-stack --change-set-name my-change-set
```

AWS CloudFormation `wait` 명령에 대한 자세한 내용은 *AWS CLI 명령 참조*의 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/index.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/index.html) 단원을 참조하세요.

**AWS CodeDeploy**

다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/change-set-create-complete.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/change-set-create-complete.html) 명령 예제는 *d-A1B2C3111* 배포가 성공적으로 완료될 때까지 일시 중지합니다.

```
$ aws deploy wait deployment-successful --deployment-id d-A1B2C3111
```

AWS CodeDeploy `wait` 명령에 대한 자세한 내용은 *AWS CLI 명령 참조*의 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/index.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/wait/index.html) 섹션을 참조하세요.

# AWS CLI에서 파라미터 값 지정
<a name="cli-usage-parameters"></a>

AWS Command Line Interface(AWS CLI)에 사용되는 대부분의 파라미터는 간단한 문자열 또는 숫자 값입니다(예: 다음 `aws ec2 create-key-pair` 예제의 `my-key-pair` 키 페어 이름).

```
$ aws ec2 create-key-pair --key-name my-key-pair
```

명령의 형식은 터미널마다 다를 수 있습니다. 예를 들어, 대부분의 터미널은 대소문자를 구분하지만 PowerShell은 대소문자를 구분하지 않습니다. 즉, 다음 두 명령 예시는 대소문자를 구분하는 터미널에서 서로 다른 결과를 얻습니다. `MyFile*.txt`와 `myfile*.txt`가 서로 **다른** 파라미터로 간주되기 때문입니다.

그러나 PowerShell에서는 `MyFile*.txt`와 `myfile*.txt`가 **동일한** 파라미터로 간주되므로 두 요청이 동일하게 처리됩니다. 다음 명령 예제는 `aws s3 cp` 명령을 사용하여 이러한 파라미터들을 보여줍니다.

```
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --include "MyFile*.txt"
$ aws s3 cp . s3://amzn-s3-demo-bucket/path --include "myfile*.txt"
```

PowerShell의 대소문자 구분에 대한 자세한 내용은 **PowerShell 설명서에서 [about\$1Case-Sensitivity](https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_case-sensitivity)를 참조하세요.

특수 문자나 공백 문자가 포함된 문자열을 따옴표 또는 리터럴로 묶어야 하는 경우가 있습니다. 이 형식에 대한 규칙도 터미널마다 다를 수 있습니다. 복잡한 파라미터를 따옴표로 묶는 방법에 대한 자세한 내용은 [AWS CLI에서 문자열에 따옴표와 리터럴 사용](cli-usage-parameters-quoting-strings.md) 섹션을 참조하세요.

이러한 토픽에서는 가장 일반적인 터미널 형식 지정 규칙을 다룹니다. 터미널에서 파라미터 값을 인식하는 데 문제가 있는 경우 이 섹션의 토픽을 검토하고 터미널의 문서에서 특정 구문 규칙을 확인해야 합니다.

**Topics**
+ [AWS CLI에서 공통 파라미터 유형](cli-usage-parameters-types.md)
+ [AWS CLI에서 문자열에 따옴표와 리터럴 사용](cli-usage-parameters-quoting-strings.md)
+ [AWS CLI에서 파일의 파라미터 로드](cli-usage-parameters-file.md)
+ [AWS CLI에서 AWS CLI 스켈레톤 및 입력 파일](cli-usage-skeleton.md)
+ [AWS CLI에서 간편 구문 사용](cli-usage-shorthand.md)

# AWS CLI에서 공통 파라미터 유형
<a name="cli-usage-parameters-types"></a>

이 섹션에서는 몇 가지 공통 파라미터 유형과 일반적으로 필요한 형식에 대해 설명합니다.

특정 명령에 대한 파라미터의 형식 지정에 문제가 있는 경우, 명령 이름 다음에 **help**를 입력하여 도움말을 검토합니다. 각 하위 명령에 대한 도움말에는 옵션의 이름과 설명이 포함되어 있습니다. 옵션의 파라미터 유형이 괄호 안에 나열됩니다. 도움말 보기에 대한 자세한 내용은 [AWS CLI에 대한 도움말 및 리소스 액세스](cli-usage-help.md) 섹션을 참조하세요.

**Topics**
+ [문자열](#parameter-type-string)
+ [타임스탬프](#parameter-type-timestamp)
+ [List](#parameter-type-list)
+ [부울](#parameter-type-boolean)
+ [Integer](#parameter-type-integer)
+ [이진/blob(이진 대용량 객체) 및 스트리밍 blob](#parameter-type-blobs)
+ [맵](#parameter-type-map)
+ [문서](#parameter-type-document)

## 문자열
<a name="parameter-type-string"></a>

문자열 파라미터에는 영숫자 문자, 기호 및 [ASCII](https://wikipedia.org/wiki/ASCII) 문자 세트의 공백이 포함될 수 있습니다. 공백이 포함된 문자열은 인용 부호로 묶어야 합니다. 표준 공백 문자 이외의 기호 또는 공백은 사용하지 않고 예기치 않은 결과를 방지하기 위해 터미널의 [인용 규칙](cli-usage-parameters-quoting-strings.md)을 준수하는 것이 좋습니다.

일부 문자열 파라미터는 파일의 이진 데이터를 허용할 수 있습니다. 예제는 [이진 파일](cli-usage-parameters-file.md#cli-usage-parameters-file-binary) 섹션을 참조하세요.

## 타임스탬프
<a name="parameter-type-timestamp"></a>

타임스탬프는 [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html) 표준에 따른 형식입니다. 흔히 ‘`DateTime`’ 또는 ‘`Date`’ 파라미터라고 합니다.

```
$ aws ec2 describe-spot-price-history --start-time 2014-10-13T19:00:00Z
```

허용 가능한 형식은 다음과 같습니다.
+ *YYYY*-*MM*-*DD*T*hh*:*mm*:*ss.sss**TZD (UTC)*, 예: 2014-10-01T20:30:00.000Z
+ *YYYY*-*MM*-*DD*T*hh*:*mm*:*ss.sss**TZD(오프셋 포함)*, 예: 2014-10-01T12:30:00.000-08:00
+ *YYYY*-*MM*-*DD*, 예: 2014-10-01
+ 초 단위의 Unix 시간, 예: 1412195400 경우에 따라 [Unix Epoch 시간](https://wikipedia.org/wiki/Unix_time)이라고도 하며 1970년 1월 1일 자정 UTC 이후 경과된 초 수를 나타냅니다.

기본적으로 AWS CLI 버전 2는 모든 ***응답*** DateTime 값을 ISO 8601 형식으로 변환합니다.

`cli\$1timestamp\$1format` 파일 설정을 사용하여 타임스탬프 형식을 설정할 수 있습니다.

## List
<a name="parameter-type-list"></a>

공백으로 구분된 하나 이상의 문자열입니다. 문자열 항목에 공백이 포함되어 있으면 해당 항목 앞뒤에 인용 부호를 사용해야 합니다. 예기치 않은 결과를 방지하기 위해 터미널의 [인용 규칙](cli-usage-parameters-quoting-strings.md)을 준수합니다.

```
$ aws ec2 describe-spot-price-history --instance-types m1.xlarge m1.medium
```

## 부울
<a name="parameter-type-boolean"></a>

옵션을 켜거나 끄는 이진 플래그입니다. 예를 들어, `ec2 describe-spot-price-history`에는 지정할 경우 실제 쿼리는 실행하지 않고 서비스에 대해 쿼리를 검증하는 부울 `--dry-run` 파라미터가 있습니다.

```
$ aws ec2 describe-spot-price-history --dry-run
```

출력은 명령이 제대로 구성되었는지 여부를 나타냅니다. 또한 이 명령에는 명령을 정상적으로 실행해야 함을 명시적으로 표시하는 데 사용할 수 있는 `--no-dry-run` 버전의 파라미터도 포함됩니다. 기본 동작이기 때문에 반드시 포함할 필요는 없습니다.

## Integer
<a name="parameter-type-integer"></a>

부호가 없는 정수입니다.

```
$ aws ec2 describe-spot-price-history --max-items 5
```

## 이진/blob(이진 대용량 객체) 및 스트리밍 blob
<a name="parameter-type-blobs"></a>

AWS CLI에서는 명령줄에서 직접 문자열로 이진 값을 전달할 수 있습니다. 다음과 같은 두 가지 유형의 Blob이 있습니다.
+ [Blob](#parameter-type-blob)
+ [스트리밍 Blob](#parameter-type-streaming-blob)

### Blob
<a name="parameter-type-blob"></a>

`blob` 유형의 파라미터에 값을 전달하려면 `fileb://` 접두사를 사용하여 이진 데이터가 포함된 로컬 파일의 경로를 지정해야 합니다. `fileb://` 접두사를 사용하여 참조된 파일은 항상 인코딩되지 않은 원시 이진 값으로 처리됩니다. 지정된 경로는 현재 작업 디렉터리를 기준으로 하는 것으로 해석됩니다. 예를 들어 `--plaintext`의 `aws kms encrypt` 파라미터는 BLOB입니다.

```
$ aws kms encrypt \
    --key-id 1234abcd-12ab-34cd-56ef-1234567890ab \
    --plaintext fileb://ExamplePlaintextFile \
    --output text \
    --query CiphertextBlob | base64 \
    --decode > ExampleEncryptedFile
```

**참고**  
이전 버전과의 호환성을 위해 `file://` 접두사를 사용할 수 있습니다. 파일 설정 `cli\$1binary\$1format` 또는`--cli-binary-format` 명령줄 옵션에 따라 두 가지 형식이 사용됩니다.  
AWS CLI 버전 2의 기본값입니다. 설정 값이 `base64`이면 `file://` 접두사를 사용하여 참조된 파일이 base64 인코딩 텍스트로 처리됩니다.
AWS CLI 버전 1의 기본값입니다. 설정 값이 `raw-in-base64-out`이면 `file://` 접두사를 사용하여 참조된 파일이 텍스트로 읽히고 AWS CLI에서 이진수로 인코딩을 시도합니다.
자세한 내용은 파일 설정 `cli\$1binary\$1format` 또는 `--cli-binary-format` 명령줄 옵션을 참조하세요.

### 스트리밍 Blob
<a name="parameter-type-streaming-blob"></a>

`aws cloudsearchdomain upload-documents` 등의 스트리밍 Blob은 접두사를 사용하지 않습니다. 대신 스트리밍 blob 파라미터는 직접 파일 경로를 사용하여 형식이 지정됩니다. 다음 예제에서는 `aws cloudsearchdomain upload-documents` 명령에 직접 파일 경로 `document-batch.json`을 사용합니다.

```
$ aws cloudsearchdomain upload-documents \
    --endpoint-url https://doc-my-domain.us-west-1.cloudsearch.amazonaws.com \
    --content-type application/json \
    --documents document-batch.json
```

## 맵
<a name="parameter-type-map"></a>

JSON 또는 CLI의 [간편 구문](cli-usage-shorthand.md)으로 지정된 키-값 페어 집합입니다. 다음 JSON 예제에서는 `--key` 맵 파라미터가 포함된 *my-table*이라는 Amazon DynamoDB 테이블에서 항목을 읽습니다. 파라미터는 중첩된 JSON 구조로 *1* 숫자 값을 가진 *id*라는 기본 키를 지정합니다.

명령줄에서 고급 JSON을 사용하려면 명령줄 JSON 프로세서(예: `jq`)를 사용하여 JSON 문자열을 생성하는 것이 좋습니다. `jq`에 대한 자세한 내용은 *GitHub*에서 [jq 리포지토리](http://stedolan.github.io/jq/)를 참조하세요.

```
$ aws dynamodb get-item --table-name my-table --key '{"id": {"N":"1"}}'

{
    "Item": {
        "name": {
            "S": "John"
        },
        "id": {
            "N": "1"
        }
    }
}
```

## 문서
<a name="parameter-type-document"></a>

**참고**  
[약식 구문](cli-usage-shorthand.md)은 문서 유형과 호환되지 않습니다.

문서 유형은 문자열 내에 JSON을 포함할 필요 없이 데이터를 전송하는 데 사용됩니다. 문서 유형을 사용하면 서비스에서 보다 유연한 데이터 유형을 사용할 수 있도록 임의의 스키마를 제공할 수 있습니다.

이를 통해 값을 이스케이프 처리하지 않고도 JSON 데이터를 전송할 수 있습니다. 예를 들어 다음과 같은 이스케이프된 JSON 입력을 사용하는 대신

```
{"document": "{\"key\":true}"}
```

다음 문서 유형을 사용할 수 있습니다.

```
{"document": {"key": true}}
```

### 문서 유형에 유효한 값
<a name="parameter-type-document-valid"></a>

문서 유형의 유연한 특성으로 인해 유효한 값 유형이 여러 개 있습니다. 유효한 값은 다음과 같습니다.

**문자열**  

```
--option '"value"'
```

**숫자**  

```
--option 123
--option 123.456
```

**부울**  

```
--option true
```

**Null**  

```
--option null
```

**배열**  

```
--option '["value1", "value2", "value3"]'
--option '["value", 1, true, null, ["key1", 2.34], {"key2": "value2"}]'
```

**객체**  

```
--option '{"key": "value"}'
--option '{"key1": "value1", "key2": 123, "key3": true, "key4": null, "key5": ["value3", "value4"], "key6": {"value5": "value6"}'
```

# AWS CLI에서 문자열에 따옴표와 리터럴 사용
<a name="cli-usage-parameters-quoting-strings"></a>

AWS CLI에는 주로 두 가지 방법으로 작은따옴표와 큰따옴표가 사용됩니다.
+ [공백이 포함된 문자열 주위에 따옴표 사용](#cli-usage-parameters-quoting-strings-around)
+ [문자열 안에 따옴표 사용](#cli-usage-parameters-quoting-strings-containing)

## 공백이 포함된 문자열 주위에 따옴표 사용
<a name="cli-usage-parameters-quoting-strings-around"></a>

파라미터 이름과 그 값은 명령줄에서 공백으로 구분됩니다. 문자열 값에 공백이 있는 경우, AWS CLI에서 그 공백을 값과 다음 파라미터 이름 사이의 구분자로 잘못 해석하지 않도록 전체 문자열을 따옴표로 묶어야 합니다. 사용하는 따옴표 유형은 AWS CLI를 실행 중인 운영 체제에 따라 다릅니다.

------
#### [ Linux and macOS ]

작은따옴표(`' '`)를 사용합니다.

```
$ aws ec2 create-key-pair --key-name 'my key pair'
```

따옴표 사용에 대한 자세한 내용은 권장 셸에 대한 사용 설명서를 참조하십시오.

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

**작은따옴표(권장)**

작은따옴표 `' '`는 `verbatim` 문자열이라고 합니다. 문자열은 입력한 그대로 명령에 전달됩니다. 즉, PowerShell 변수는 전달되지 않습니다.

```
PS C:\> aws ec2 create-key-pair --key-name 'my key pair'
```

**큰따옴표**

큰따옴표 `" "`는 `expandable` 문자열이라고 합니다. 변수는 확장 가능한 문자열로 전달될 수 있습니다.

```
PS C:\> aws ec2 create-key-pair --key-name "my key pair"
```

따옴표 사용에 대한 자세한 내용은 *Microsoft PowerShell 문서*에서 [인용 규칙 정보](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7)를 참조하십시오.

------
#### [ Windows command prompt ]

큰따옴표(`" "`)를 사용합니다.

```
C:\> aws ec2 create-key-pair --key-name "my key pair"
```

------

선택적으로, 공백 대신에 등호(`=`)를 사용하여 파라미터 이름을 값에서 분리할 수 있습니다. 일반적으로 파라미터 값이 하이픈으로 시작되는 경우에만 필요합니다.

```
$ aws ec2 delete-key-pair --key-name=-mykey
```

## 문자열 안에 따옴표 사용
<a name="cli-usage-parameters-quoting-strings-containing"></a>

문자열에는 따옴표가 포함될 수 있으며 셸이 제대로 작동하려면 따옴표를 이스케이프 처리해야 할 수 있습니다. 일반적인 파라미터 값 유형 중 하나는 JSON 문자열입니다. JSON 구조의 각 요소 이름과 값 주위에 공백과 큰따옴표(`" "`)가 포함되어 있기 때문에 복잡합니다. JSON 형식의 파라미터를 명령줄에 입력하는 방법은 운영 체제에 따라 다릅니다.

명령줄에서 고급 JSON을 사용하려면 명령줄 JSON 프로세서(예: `jq`)를 사용하여 JSON 문자열을 생성하는 것이 좋습니다. `jq`에 대한 자세한 내용은 *GitHub*에서 [jq 리포지토리](http://stedolan.github.io/jq/)를 참조하세요.

------
#### [ Linux and macOS ]

Linux 및 macOS가 문자열을 문자 그대로 해석하는 경우 다음 예제와 같이 작은따옴표(`' '`)를 사용하여 JSON 데이터 구조를 묶습니다. 문자 그대로 처리되므로 JSON 문자열에 포함 된 큰따옴표를 이스케이프 처리할 필요가 없습니다. JSON은 작은따옴표로 묶여 있으므로 문자열의 모든 작은따옴표를 이스케이프 처리해야 합니다. 일반적으로 작은따옴표(`\'`) 앞에 백슬래시를 사용하여 수행됩니다.

```
$ aws ec2 run-instances \
    --image-id ami-12345678 \
    --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":20,"DeleteOnTermination":false,"VolumeType":"standard"}}]'
```

따옴표 사용에 대한 자세한 내용은 권장 셸에 대한 사용 설명서를 참조하세요.

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

작은따옴표(`' '`) 또는 큰따옴표(`" "`)를 사용합니다.

**작은따옴표(권장)**

작은따옴표 `' '`는 `verbatim` 문자열이라고 합니다. 문자열은 입력한 그대로 명령에 전달됩니다. 즉, PowerShell 변수는 전달되지 않습니다.

JSON 데이터 구조에는 큰따옴표가 포함되어 있으므로 **작은따옴표(`' '`)**로 묶는 것이 좋습니다. **작은따옴표**를 사용하는 경우 JSON 문자열에 포함된 **큰따옴표**를 이스케이프 처리할 필요가 없습니다. 그러나 JSON 구조 내에서 각 **작은따옴표**를 백틱(```)으로 이스케이프 처리해야 합니다.

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings '[{"DeviceName":"/dev/sdb","Ebs":{"VolumeSize":20,"DeleteOnTermination":false,"VolumeType":"standard"}}]'
```

**큰따옴표**

큰따옴표 `" "`는 `expandable` 문자열이라고 합니다. 변수는 확장 가능한 문자열로 전달될 수 있습니다.

**큰따옴표**를 사용하는 경우 JSON 문자열에 포함된 **작은따옴표**를 이스케이프 처리할 필요가 없습니다. 그러나 다음 예제와 같이 JSON 구조 내에서 각 **큰따옴표**를 백틱(```)으로 이스케이프 처리해야 합니다.

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings "[{`"DeviceName`":`"/dev/sdb`",`"Ebs`":{`"VolumeSize`":20,`"DeleteOnTermination`":false,`"VolumeType`":`"standard`"}}]"
```

따옴표 사용에 대한 자세한 내용은 *Microsoft PowerShell 문서*에서 [인용 규칙 정보](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_quoting_rules?view=powershell-7)를 참조하세요.

**주의**  
PowerShell은 AWS CLI에 명령을 보내기 전에 일반적인 PowerShell 또는 `CommandLineToArgvW` 따옴표 넣기 규칙을 사용하여 명령을 해석할지 결정합니다. PowerShell이 `CommandLineToArgvW`를 사용하여 처리하는 경우 백슬래시(`\`)로 문자를 이스케이프 처리해야 합니다.  
PowerShell의 `CommandLineToArgvW`에 대한 자세한 내용은 *Microsoft DevBlogs*의 [What's up with the strange treatment of quotation marks and backslashes by CommandLineToArgvW](https://devblogs.microsoft.com/oldnewthing/20100917-00/?p=12833), *Microsoft Docs Blog*의 [Everyone quotes command line arguments the wrong way](https://docs.microsoft.com/en-us/archive/blogs/twistylittlepassagesallalike/everyone-quotes-command-line-arguments-the-wrong-way) 및 *Microsoft Docs*의 [CommandLineToArgvW 함수](https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-commandlinetoargvw#remarks)를 참조하세요.  
**작은따옴표**  
작은따옴표 `' '`는 `verbatim` 문자열이라고 합니다. 문자열은 입력한 그대로 명령에 전달됩니다. 즉, PowerShell 변수는 전달되지 않습니다. 백슬래시(`\`)로 문자를 이스케이프 처리합니다.  

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings '[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]'
```
**큰따옴표**  
큰따옴표 `" "`는 `expandable` 문자열이라고 합니다. 변수는 `expandable` 문자열로 전달될 수 있습니다. 큰 따옴표로 묶인 문자열의 경우 백틱만 사용하는 대신 각 따옴표에 대해 *'\$1*를 사용하여 두 번 이스케이프 처리해야 합니다. 백틱은 백슬래시를 이스케이프하며, 백슬래시는 `CommandLineToArgvW` 프로세스의 이스케이프 문자로 사용됩니다.  

```
PS C:\> aws ec2 run-instances `
    --image-id ami-12345678 `
    --block-device-mappings "[{`\"DeviceName`\":`\"/dev/sdb`\",`\"Ebs`\":{`\"VolumeSize`\":20,`\"DeleteOnTermination`\":false,`\"VolumeType`\":`\"standard`\"}}]"
```
**Blob(권장)**  
JSON 데이터 입력에 대한 PowerShell 따옴표 넣기 규칙을 무시하려면 Blob을 사용하여 JSON 데이터를 AWS CLI에 직접 전달합니다. Blob에 대한 자세한 내용은 [Blob](cli-usage-parameters-types.md#parameter-type-blob) 섹션을 참조하세요.

------
#### [ Windows command prompt ]

Windows 명령 프롬프트에서는 JSON 데이터 구조를 묶을 큰따옴표(`" "`)가 필요합니다. 또한 명령 프로세서가 JSON에 포함된 큰따옴표를 잘못 해석하지 않도록 다음 예제와 같이 JSON 데이터 구조 자체에서도 각각의 큰따옴표(`\`)를 이스케이프 처리해야 합니다(앞에 백슬래시[`"`] 문자 추가).

```
C:\> aws ec2 run-instances ^
    --image-id ami-12345678 ^
    --block-device-mappings "[{\"DeviceName\":\"/dev/sdb\",\"Ebs\":{\"VolumeSize\":20,\"DeleteOnTermination\":false,\"VolumeType\":\"standard\"}}]"
```

가장 바깥쪽 큰따옴표만 이스케이프되지 않습니다.

------

# AWS CLI에서 파일의 파라미터 로드
<a name="cli-usage-parameters-file"></a>

어떤 파라미터는 파일 이름을 인수로 예상하며 AWS CLI가 데이터를 로드합니다. 다른 어떤 파라미터는 파라미터 값을 명령줄에 입력된 텍스트 또는 파일에서 읽은 텍스트로 지정할 수 있습니다. 파일이 필수인지 또는 선택 사항인지에 관계없이 AWS CLI에서 파일을 이해할 수 있도록 파일을 올바르게 인코딩해야 합니다. 파일의 인코딩은 읽는 시스템의 기본 로캘과 일치해야 합니다. Python `locale.getpreferredencoding()` 메서드를 사용하여 이를 확인할 수 있습니다.

이 방법은 단일 파라미터에 대한 파일을 로드하기 위한 것입니다. 단일 파일로 여러 파라미터를 로드하는 방법에 대한 자세한 내용은 [AWS CLI에서 AWS CLI 스켈레톤 및 입력 파일](cli-usage-skeleton.md) 섹션을 참조하세요.

**참고**  
기본적으로 Windows PowerShell은 텍스트를 UTF-16으로 출력하며, 이는 JSON 파일과 여러 Linux 시스템에서 사용하는 UTF-8 인코딩과 충돌합니다. `-Encoding ascii`에서 결과 파일을 읽을 수 있도록 PowerShell `Out-File` 명령과 함께 AWS CLI를 사용하는 것이 좋습니다.

**Topics**
+ [파일에서 파라미터를 로드하는 방법](#cli-usage-parameters-file-how)
+ [이진 파일](#cli-usage-parameters-file-binary)
+ [파일을 간편 구문 값으로 로드](#cli-usage-parameters-file-shorthand)

## 파일에서 파라미터를 로드하는 방법
<a name="cli-usage-parameters-file-how"></a>

모두 명령줄 파라미터 값으로 입력하려고 하는 것보다 파일에서 파라미터 값을 가져오는 것이 편리할 때가 있습니다(예: 파라미터가 복잡한 JSON 문자열일 때). 값을 포함하는 파일을 지정하려면 파일 URL을 다음 형식으로 지정합니다.

```
file://complete/path/to/file
```
+ 처음 두 개의 슬래시 '/' 문자는 사양의 일부입니다. 필수 경로가 '/'로 시작하면 결과는 슬래시 문자 세 개(`file:///folder/file`)입니다.
+ URL은 실제 파라미터 내용이 포함된 파일로의 경로를 제공합니다.
+ 공백이나 특수 문자가 있는 파일을 사용하는 경우 터미널의 [인용 및 이스케이프 규칙](cli-usage-parameters-quoting-strings.md)을 따릅니다.

다음 예제의 파일 경로는 현재 작업 디렉터리를 기준으로 해석됩니다.

------
#### [ Linux or macOS ]

```
// Read from a file in the current directory
$ aws ec2 describe-instances --filters file://filter.json

// Read from a file in /tmp
$ aws ec2 describe-instances --filters file:///tmp/filter.json

// Read from a file with a filename with whitespaces
$ aws ec2 describe-instances --filters 'file://filter content.json'
```

------
#### [ Windows command prompt ]

```
// Read from a file in C:\temp
C:\> aws ec2 describe-instances --filters file://C:\temp\filter.json

// Read from a file with a filename with whitespaces
C:\> aws ec2 describe-instances --filters "file://C:\temp\filter content.json"
```

------

`file://` 접두사 옵션은 "`~/`", "`./`", "`../`"를 포함한 Unix 스타일의 확장을 지원합니다. Windows에서는 "`~/`" 표현식이 `%USERPROFILE%` 환경 변수에 저장된 사용자 디렉터리로 확장합니다. 예를 들어, Windows 10은 일반적으로 `%USERPROFILE%` 아래에 사용자 디렉터리가 있습니다.

다른 JSON 문서 값으로 포함되는 JSON 문서는 계속 이스케이프해야 합니다.

```
$ aws sqs create-queue --queue-name my-queue --attributes file://attributes.json
```

**attributes.json**

```
{
  "RedrivePolicy": "{\"deadLetterTargetArn\":\"arn:aws:sqs:us-west-2:0123456789012:deadletter\", \"maxReceiveCount\":\"5\"}"
}
```

## 이진 파일
<a name="cli-usage-parameters-file-binary"></a>

이진 데이터를 파라미터로 갖고 있는 명령의 경우 `fileb://` 접두사를 사용하여 데이터가 이진 콘텐츠임을 지정합니다. 이진 데이터를 수락하는 명령은 다음과 같습니다.
+  **`aws ec2 run-instances:`** `--user-data` 파라미터.
+  **`aws s3api put-object:`** `--sse-customer-key` 파라미터.
+  **`aws kms decrypt:`** `--ciphertext-blob` 파라미터.

다음 예제에서는 Linux 명령줄 도구를 사용하여 이진 256비트 AES 키를 생성한 다음, 이를 Amazon S3에 제공하여 업로드된 파일 서버측을 암호화합니다.

```
$ dd if=/dev/urandom bs=1 count=32 > sse.key
32+0 records in
32+0 records out
32 bytes (32 B) copied, 0.000164441 s, 195 kB/s
$ aws s3api put-object \
    --bucket amzn-s3-demo-bucket \
    --key test.txt \
    --body test.txt \
    --sse-customer-key fileb://sse.key \
    --sse-customer-algorithm AES256
{
    "SSECustomerKeyMD5": "iVg8oWa8sy714+FjtesrJg==",
    "SSECustomerAlgorithm": "AES256",
    "ETag": "\"a6118e84b76cf98bf04bbe14b6045c6c\""
}
```

JSON 형식의 파라미터를 포함하는 파일을 참조하는 다른 예제는 [사용자에게 IAM 관리형 정책 연결](cli-services-iam.md#cli-services-iam-policy) 섹션을 참조하세요.

## 파일을 간편 구문 값으로 로드
<a name="cli-usage-parameters-file-shorthand"></a>

값이 크거나 복잡한 간편 구문을 사용하는 경우 파일에 값으로 로드하는 것이 더 쉬운 경우가 많습니다. 파일을 간편 구문 값으로 로드하려면 형식이 약간 변경됩니다. `key=value` 대신 `=` 연산자 대신 `@=` 연산자를 사용합니다. `@=`는 AWS CLI에 값을 문자열이 아닌 파일 경로로 읽어야 함을 보여줍니다. 다음 예제에서는 해당 값에 대한 파일을 로드하는 키-값 페어를 보여줍니다.

------
#### [ Linux or macOS ]

```
--option key@=file://template.txt
```

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

```
--option "key1@=file://template.txt"
```

------

다음 예제에서는 `aws rolesanywhere create-trust-anchor` 명령에 대한 인증서 파일을 로드하는 방법을 보여줍니다.

```
$ aws rolesanywhere create-trust-anchor --name TrustAnchor \
    --source sourceData={x509CertificateData@=file://root-ca.crt},sourceType="CERTIFICATE_BUNDLE"  \ 
    --enabled
```

간편 구문에 대한 자세한 내용은 [AWS CLI에서 간편 구문 사용](cli-usage-shorthand.md) 섹션을 참조하세요.

# AWS CLI에서 AWS CLI 스켈레톤 및 입력 파일
<a name="cli-usage-skeleton"></a>

대부분의 AWS CLI 명령은 파일의 모든 파라미터 입력 가져오기를 허용합니다. 이러한 템플릿은 `generate-cli-skeleton` 옵션을 사용하여 생성한 다음 `--cli-input-json` 및 `--cli-input-yaml` 파라미터를 사용하여 가져올 수 있습니다.

**Topics**
+ [AWS CLI 스켈레톤 및 입력 파일 정보](#cli-usage-skeleton-about)
+ [명령 스켈레톤 생성 및 가져오기](#cli-usage-skeleton-generate)
+ [입력 파일과 명령줄 파라미터 결합](#cli-usage-skeleton-combine)

## AWS CLI 스켈레톤 및 입력 파일 정보
<a name="cli-usage-skeleton-about"></a>

대부분의 AWS Command Line Interface(AWS CLI) 명령은 `--cli-input-json` 및 `--cli-input-yaml` 파라미터를 사용하여 파일에서 파라미터 입력을 허용하는 기능을 지원합니다.

이러한 명령은 `--generate-cli-skeleton` 파라미터를 사용하므로 모든 파라미터를 편집하거나 입력할 수 있는 JSON 또는 YAML 형식의 파일을 만들 수 있습니다. 그러면 `--cli-input-json` 또는 `--cli-input-yaml` 파라미터를 사용하여 명령을 실행하고 입력된 파일을 가리킬 수 있습니다.

**중요**  
[`aws s3` 명령](https://docs.aws.amazon.com/cli/latest/reference/s3/index.html) 같은 사용자 지정 AWS CLI 명령은 이 주제에서 다루는 `--generate-cli-skeleton` 또는 `--cli-input-json` 및 `--cli-input-yaml` 파라미터를 지원하지 않습니다. 특정 명령이 이러한 파라미터를 지원하는지 확인하려면 사용하려는 명령에 대한 [`help` 명령](cli-usage-help.md#cli-usage-help-command)을 실행하거나 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

`--generate-cli-skeleton`은 명령에서 사용자 지정하고 입력으로 사용할 수 있는 파라미터 템플릿을 생성하고 표시합니다. 생성된 템플릿에는 명령이 지원하는 모든 파라미터가 포함됩니다.

`--generate-cli-skeleton` 파라미터는 다음 값 중 하나를 허용합니다.
+ `input` - 생성된 템플릿에 JSON 형식의 모든 입력 파라미터가 포함됩니다. 이것이 기본값입니다.
+ `yaml-input` - 생성된 템플릿에 YAML 형식의 모든 입력 파라미터가 포함됩니다.
+ `output` - 생성된 템플릿에 JSON 형식의 모든 출력 파라미터가 포함됩니다. 현재 출력 파라미터를 YAML로 요청할 수 없습니다.

AWS CLI는 본질적으로 서비스의 API를 둘러싼 "래퍼"이므로, 스켈레톤 파일은 사용자가 모든 파라미터를 기본 API 파라미터 이름으로 참조할 것이라고 예상합니다. 이는 AWS CLI 파라미터 이름과 다를 수 있습니다. 예를 들어 이름이 AWS CLI인 `user-name` 파라미터는 이름이 AWS인 `UserName` 서비스의 API 파라미터에 매핑될 수 있습니다(변경된 대소문자 표시와 누락된 대시에 유의). 실수를 방지하려면 `--generate-cli-skeleton` 옵션을 사용하여 “정확한” 파라미터 이름으로 템플릿을 생성하는 것이 좋습니다. 서비스 API 참조 안내서를 참조하여 예상되는 파라미터 이름을 확인할 수도 있습니다. 템플릿에서 필요하지 않아 값을 지정하지 않을 파라미터를 모두 삭제할 수 있습니다.

예를 들어, 다음 명령을 실행하면 Amazon Elastic Compute Cloud(Amazon EC2) 명령 **run-instances**에 대한 파라미터 템플릿이 생성됩니다.

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

다음 예제에서는 `input` 파라미터에 기본값(`--generate-cli-skeleton`)을 사용하여 JSON 형식의 템플릿을 생성하는 방법을 보여줍니다.

```
$ aws ec2 run-instances --generate-cli-skeleton
```

```
{
    "DryRun": true,
    "ImageId": "",
    "MinCount": 0,
    "MaxCount": 0,
    "KeyName": "",
    "SecurityGroups": [
        ""
    ],
    "SecurityGroupIds": [
        ""
    ],
    "UserData": "",
    "InstanceType": "",
    "Placement": {
        "AvailabilityZone": "",
        "GroupName": "",
        "Tenancy": ""
    },
    "KernelId": "",
    "RamdiskId": "",
    "BlockDeviceMappings": [
        {
            "VirtualName": "",
            "DeviceName": "",
            "Ebs": {
                "SnapshotId": "",
                "VolumeSize": 0,
                "DeleteOnTermination": true,
                "VolumeType": "",
                "Iops": 0,
                "Encrypted": true
            },
            "NoDevice": ""
        }
    ],
    "Monitoring": {
        "Enabled": true
    },
    "SubnetId": "",
    "DisableApiTermination": true,
    "InstanceInitiatedShutdownBehavior": "",
    "PrivateIpAddress": "",
    "ClientToken": "",
    "AdditionalInfo": "",
    "NetworkInterfaces": [
        {
            "NetworkInterfaceId": "",
            "DeviceIndex": 0,
            "SubnetId": "",
            "Description": "",
            "PrivateIpAddress": "",
            "Groups": [
                ""
            ],
            "DeleteOnTermination": true,
            "PrivateIpAddresses": [
                {
                    "PrivateIpAddress": "",
                    "Primary": true
                }
            ],
            "SecondaryPrivateIpAddressCount": 0,
            "AssociatePublicIpAddress": true
        }
    ],
    "IamInstanceProfile": {
        "Arn": "",
        "Name": ""
    },
    "EbsOptimized": true
}
```

------
#### [ YAML ]

다음 예제에서는 `yaml-input` 파라미터에 값 `--generate-cli-skeleton`을 사용하여 YAML 형식의 템플릿을 생성하는 방법을 보여줍니다.

```
$ aws ec2 run-instances --generate-cli-skeleton yaml-input
```

```
BlockDeviceMappings:  # The block device mapping entries.
- DeviceName: ''  # The device name (for example, /dev/sdh or xvdh).
  VirtualName: '' # The virtual device name (ephemeralN).
  Ebs: # Parameters used to automatically set up Amazon EBS volumes when the instance is launched.
    DeleteOnTermination: true  # Indicates whether the EBS volume is deleted on instance termination.
    Iops: 0 # The number of I/O operations per second (IOPS) that the volume supports.
    SnapshotId: '' # The ID of the snapshot.
    VolumeSize: 0 # The size of the volume, in GiB.
    VolumeType: st1 # The volume type. Valid values are: standard, io1, gp2, sc1, st1.
    Encrypted: true # Indicates whether the encryption state of an EBS volume is changed while being restored from a backing snapshot.
    KmsKeyId: '' # Identifier (key ID, key alias, ID ARN, or alias ARN) for a customer managed KMS key under which the EBS volume is encrypted.
  NoDevice: '' # Suppresses the specified device included in the block device mapping of the AMI.
ImageId: '' # The ID of the AMI.
InstanceType: c4.4xlarge # The instance type. Valid values are: t1.micro, t2.nano, t2.micro, t2.small, t2.medium, t2.large, t2.xlarge, t2.2xlarge, t3.nano, t3.micro, t3.small, t3.medium, t3.large, t3.xlarge, t3.2xlarge, t3a.nano, t3a.micro, t3a.small, t3a.medium, t3a.large, t3a.xlarge, t3a.2xlarge, m1.small, m1.medium, m1.large, m1.xlarge, m3.medium, m3.large, m3.xlarge, m3.2xlarge, m4.large, m4.xlarge, m4.2xlarge, m4.4xlarge, m4.10xlarge, m4.16xlarge, m2.xlarge, m2.2xlarge, m2.4xlarge, cr1.8xlarge, r3.large, r3.xlarge, r3.2xlarge, r3.4xlarge, r3.8xlarge, r4.large, r4.xlarge, r4.2xlarge, r4.4xlarge, r4.8xlarge, r4.16xlarge, r5.large, r5.xlarge, r5.2xlarge, r5.4xlarge, r5.8xlarge, r5.12xlarge, r5.16xlarge, r5.24xlarge, r5.metal, r5a.large, r5a.xlarge, r5a.2xlarge, r5a.4xlarge, r5a.8xlarge, r5a.12xlarge, r5a.16xlarge, r5a.24xlarge, r5d.large, r5d.xlarge, r5d.2xlarge, r5d.4xlarge, r5d.8xlarge, r5d.12xlarge, r5d.16xlarge, r5d.24xlarge, r5d.metal, r5ad.large, r5ad.xlarge, r5ad.2xlarge, r5ad.4xlarge, r5ad.8xlarge, r5ad.12xlarge, r5ad.16xlarge, r5ad.24xlarge, x1.16xlarge, x1.32xlarge, x1e.xlarge, x1e.2xlarge, x1e.4xlarge, x1e.8xlarge, x1e.16xlarge, x1e.32xlarge, i2.xlarge, i2.2xlarge, i2.4xlarge, i2.8xlarge, i3.large, i3.xlarge, i3.2xlarge, i3.4xlarge, i3.8xlarge, i3.16xlarge, i3.metal, i3en.large, i3en.xlarge, i3en.2xlarge, i3en.3xlarge, i3en.6xlarge, i3en.12xlarge, i3en.24xlarge, i3en.metal, hi1.4xlarge, hs1.8xlarge, c1.medium, c1.xlarge, c3.large, c3.xlarge, c3.2xlarge, c3.4xlarge, c3.8xlarge, c4.large, c4.xlarge, c4.2xlarge, c4.4xlarge, c4.8xlarge, c5.large, c5.xlarge, c5.2xlarge, c5.4xlarge, c5.9xlarge, c5.12xlarge, c5.18xlarge, c5.24xlarge, c5.metal, c5d.large, c5d.xlarge, c5d.2xlarge, c5d.4xlarge, c5d.9xlarge, c5d.18xlarge, c5n.large, c5n.xlarge, c5n.2xlarge, c5n.4xlarge, c5n.9xlarge, c5n.18xlarge, cc1.4xlarge, cc2.8xlarge, g2.2xlarge, g2.8xlarge, g3.4xlarge, g3.8xlarge, g3.16xlarge, g3s.xlarge, g4dn.xlarge, g4dn.2xlarge, g4dn.4xlarge, g4dn.8xlarge, g4dn.12xlarge, g4dn.16xlarge, cg1.4xlarge, p2.xlarge, p2.8xlarge, p2.16xlarge, p3.2xlarge, p3.8xlarge, p3.16xlarge, p3dn.24xlarge, d2.xlarge, d2.2xlarge, d2.4xlarge, d2.8xlarge, f1.2xlarge, f1.4xlarge, f1.16xlarge, m5.large, m5.xlarge, m5.2xlarge, m5.4xlarge, m5.8xlarge, m5.12xlarge, m5.16xlarge, m5.24xlarge, m5.metal, m5a.large, m5a.xlarge, m5a.2xlarge, m5a.4xlarge, m5a.8xlarge, m5a.12xlarge, m5a.16xlarge, m5a.24xlarge, m5d.large, m5d.xlarge, m5d.2xlarge, m5d.4xlarge, m5d.8xlarge, m5d.12xlarge, m5d.16xlarge, m5d.24xlarge, m5d.metal, m5ad.large, m5ad.xlarge, m5ad.2xlarge, m5ad.4xlarge, m5ad.8xlarge, m5ad.12xlarge, m5ad.16xlarge, m5ad.24xlarge, h1.2xlarge, h1.4xlarge, h1.8xlarge, h1.16xlarge, z1d.large, z1d.xlarge, z1d.2xlarge, z1d.3xlarge, z1d.6xlarge, z1d.12xlarge, z1d.metal, u-6tb1.metal, u-9tb1.metal, u-12tb1.metal, u-18tb1.metal, u-24tb1.metal, a1.medium, a1.large, a1.xlarge, a1.2xlarge, a1.4xlarge, a1.metal, m5dn.large, m5dn.xlarge, m5dn.2xlarge, m5dn.4xlarge, m5dn.8xlarge, m5dn.12xlarge, m5dn.16xlarge, m5dn.24xlarge, m5n.large, m5n.xlarge, m5n.2xlarge, m5n.4xlarge, m5n.8xlarge, m5n.12xlarge, m5n.16xlarge, m5n.24xlarge, r5dn.large, r5dn.xlarge, r5dn.2xlarge, r5dn.4xlarge, r5dn.8xlarge, r5dn.12xlarge, r5dn.16xlarge, r5dn.24xlarge, r5n.large, r5n.xlarge, r5n.2xlarge, r5n.4xlarge, r5n.8xlarge, r5n.12xlarge, r5n.16xlarge, r5n.24xlarge.
Ipv6AddressCount: 0 # [EC2-VPC] The number of IPv6 addresses to associate with the primary network interface.
Ipv6Addresses: # [EC2-VPC] The IPv6 addresses from the range of the subnet to associate with the primary network interface.
- Ipv6Address: ''  # The IPv6 address.
KernelId: '' # The ID of the kernel.
KeyName: '' # The name of the key pair.
MaxCount: 0 # [REQUIRED] The maximum number of instances to launch.
MinCount: 0 # [REQUIRED] The minimum number of instances to launch.
Monitoring: # Specifies whether detailed monitoring is enabled for the instance.
  Enabled: true  # [REQUIRED] Indicates whether detailed monitoring is enabled.
Placement: # The placement for the instance.
  AvailabilityZone: ''  # The Availability Zone of the instance.
  Affinity: '' # The affinity setting for the instance on the Dedicated Host.
  GroupName: '' # The name of the placement group the instance is in.
  PartitionNumber: 0 # The number of the partition the instance is in.
  HostId: '' # The ID of the Dedicated Host on which the instance resides.
  Tenancy: dedicated # The tenancy of the instance (if the instance is running in a VPC). Valid values are: default, dedicated, host.
  SpreadDomain: '' # Reserved for future use.
RamdiskId: '' # The ID of the RAM disk to select.
SecurityGroupIds: # The IDs of the security groups.
- ''
SecurityGroups: # [default VPC] The names of the security groups.
- ''
SubnetId: '' # [EC2-VPC] The ID of the subnet to launch the instance into.
UserData: '' # The user data to make available to the instance.
AdditionalInfo: '' # Reserved.
ClientToken: '' # Unique, case-sensitive identifier you provide to ensure the idempotency of the request.
DisableApiTermination: true # If you set this parameter to true, you can't terminate the instance using the Amazon EC2 console, CLI, or API; otherwise, you can.
DryRun: true # Checks whether you have the required permissions for the action, without actually making the request, and provides an error response.
EbsOptimized: true # Indicates whether the instance is optimized for Amazon EBS I/O.
IamInstanceProfile: # The IAM instance profile.
  Arn: ''  # The Amazon Resource Name (ARN) of the instance profile.
  Name: '' # The name of the instance profile.
InstanceInitiatedShutdownBehavior: stop # Indicates whether an instance stops or terminates when you initiate shutdown from the instance (using the operating system command for system shutdown). Valid values are: stop, terminate.
NetworkInterfaces: # The network interfaces to associate with the instance.
- AssociatePublicIpAddress: true  # Indicates whether to assign a public IPv4 address to an instance you launch in a VPC.
  DeleteOnTermination: true # If set to true, the interface is deleted when the instance is terminated.
  Description: '' # The description of the network interface.
  DeviceIndex: 0 # The position of the network interface in the attachment order.
  Groups: # The IDs of the security groups for the network interface.
  - ''
  Ipv6AddressCount: 0 # A number of IPv6 addresses to assign to the network interface.
  Ipv6Addresses: # One or more IPv6 addresses to assign to the network interface.
  - Ipv6Address: ''  # The IPv6 address.
  NetworkInterfaceId: '' # The ID of the network interface.
  PrivateIpAddress: '' # The private IPv4 address of the network interface.
  PrivateIpAddresses: # One or more private IPv4 addresses to assign to the network interface.
  - Primary: true  # Indicates whether the private IPv4 address is the primary private IPv4 address.
    PrivateIpAddress: '' # The private IPv4 addresses.
  SecondaryPrivateIpAddressCount: 0 # The number of secondary private IPv4 addresses.
  SubnetId: '' # The ID of the subnet associated with the network interface.
  InterfaceType: '' # The type of network interface.
PrivateIpAddress: '' # [EC2-VPC] The primary IPv4 address.
ElasticGpuSpecification: # An elastic GPU to associate with the instance.
- Type: ''  # [REQUIRED] The type of Elastic Graphics accelerator.
ElasticInferenceAccelerators: # An elastic inference accelerator to associate with the instance.
- Type: ''  # [REQUIRED]  The type of elastic inference accelerator.
TagSpecifications: # The tags to apply to the resources during launch.
- ResourceType: network-interface  # The type of resource to tag. Valid values are: client-vpn-endpoint, customer-gateway, dedicated-host, dhcp-options, elastic-ip, fleet, fpga-image, host-reservation, image, instance, internet-gateway, launch-template, natgateway, network-acl, network-interface, reserved-instances, route-table, security-group, snapshot, spot-instances-request, subnet, traffic-mirror-filter, traffic-mirror-session, traffic-mirror-target, transit-gateway, transit-gateway-attachment, transit-gateway-route-table, volume, vpc, vpc-peering-connection, vpn-connection, vpn-gateway.
  Tags: # The tags to apply to the resource.
  - Key: ''  # The key of the tag.
    Value: '' # The value of the tag.
LaunchTemplate: # The launch template to use to launch the instances.
  LaunchTemplateId: ''  # The ID of the launch template.
  LaunchTemplateName: '' # The name of the launch template.
  Version: '' # The version number of the launch template.
InstanceMarketOptions: # The market (purchasing) option for the instances.
  MarketType: spot  # The market type. Valid values are: spot.
  SpotOptions: # The options for Spot Instances.
    MaxPrice: ''  # The maximum hourly price you're willing to pay for the Spot Instances.
    SpotInstanceType: one-time # The Spot Instance request type. Valid values are: one-time, persistent.
    BlockDurationMinutes: 0 # The required duration for the Spot Instances (also known as Spot blocks), in minutes.
    ValidUntil: 1970-01-01 00:00:00 # The end date of the request.
    InstanceInterruptionBehavior: terminate # The behavior when a Spot Instance is interrupted. Valid values are: hibernate, stop, terminate.
CreditSpecification: # The credit option for CPU usage of the T2 or T3 instance.
  CpuCredits: ''  # [REQUIRED] The credit option for CPU usage of a T2 or T3 instance.
CpuOptions: # The CPU options for the instance.
  CoreCount: 0  # The number of CPU cores for the instance.
  ThreadsPerCore: 0 # The number of threads per CPU core.
CapacityReservationSpecification: # Information about the Capacity Reservation targeting option.
  CapacityReservationPreference: none  # Indicates the instance's Capacity Reservation preferences. Valid values are: open, none.
  CapacityReservationTarget: # Information about the target Capacity Reservation.
    CapacityReservationId: ''  # The ID of the Capacity Reservation.
HibernationOptions: # Indicates whether an instance is enabled for hibernation.
  Configured: true  # If you set this parameter to true, your instance is enabled for hibernation.
LicenseSpecifications: # The license configurations.
- LicenseConfigurationArn: ''  # The Amazon Resource Name (ARN) of the license configuration.
```

------

## 명령 스켈레톤 생성 및 가져오기
<a name="cli-usage-skeleton-generate"></a>

**파라미터 스켈레톤 파일을 생성하고 사용하려면**

1. `--generate-cli-skeleton` 파라미터와 함께 명령을 실행하여JSON 또는 YAML을 생성하고 출력을 파일로 전송하여 저장합니다.

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

   ```
   $ aws ec2 run-instances --generate-cli-skeleton input > ec2runinst.json
   ```

------
#### [ YAML ]

   ```
   $ aws ec2 run-instances --generate-cli-skeleton yaml-input > ec2runinst.yaml
   ```

------

1. 텍스트 편집기에서 파라미터 스켈레톤 파일을 열고 필요하지 않은 파라미터를 제거합니다. 예를 들어, 템플릿을 다음과 같이 줄일 수 있습니다. 불필요한 요소를 제거한 후에도 파일이 여전히 유효한 JSON 또는 YAML인지 확인합니다.

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

   ```
   {
       "DryRun": true,
       "ImageId": "",
       "KeyName": "",
       "SecurityGroups": [
           ""
       ],
       "InstanceType": "",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------
#### [ YAML ]

   ```
   DryRun: true
   ImageId: ''
   KeyName: ''
   SecurityGroups:
   - ''
   InstanceType:
   Monitoring: 
     Enabled: true
   ```

------

   이 예제에서는 Amazon EC2 테스트 실행 기능을 사용하도록 `DryRun` 파라미터를 `true`로 설정된 상태로 유지합니다. 이 기능을 사용하면 실제로 리소스를 생성하거나 수정하지 않고도 명령을 안전하게 테스트할 수 있습니다.

1. 나머지 값을 시나리오에 적합한 값으로 채우세요. 이 예제에서는 사용할 Amazon Machine Image(AMI)의 인스턴스 유형, 키 이름, 보안 그룹 및 식별자를 제공합니다. 이 예제에서는 기본 AWS 리전을 가정합니다. `ami-dfc39aef` AMI는 `us-west-2` 리전에서 호스팅되는 64비트 Amazon Linux 이미지입니다. 다른 리전을 사용하는 경우 [사용할 정확한 AMI ID를 찾아야](https://aws.amazon.com/amazon-linux-ami/) 합니다.

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

   ```
   {
       "DryRun": true,
       "ImageId": "ami-dfc39aef",
       "KeyName": "mykey",
       "SecurityGroups": [
           "my-sg"
       ],
       "InstanceType": "t2.micro",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------
#### [ YAML ]

   ```
   DryRun: true
   ImageId: 'ami-dfc39aef'
   KeyName: 'mykey'
   SecurityGroups:
   - 'my-sg'
   InstanceType: 't2.micro'
   Monitoring: 
     Enabled: true
   ```

------

1. `file://` 접두사를 사용해 완료된 템플릿 파일을 `--cli-input-json` 또는 --`cli-input-yaml` 파라미터로 전달하여 완료된 파라미터로 명령을 실행합니다. AWS CLI는 경로가 현재 작업 디렉터리를 기준으로 하는 것으로 해석합니다. 다음 예제에서 AWS CLI는 현재 작업 디렉터리에서 파일을 찾습니다.

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

   ```
   $ aws ec2 run-instances --cli-input-json file://ec2runinst.json
   ```

   ```
   A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
   ```

------
#### [ YAML ]

   ```
   $ aws ec2 run-instances --cli-input-yaml file://ec2runinst.yaml
   ```

   ```
   A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
   ```

------

   테스트 실행 오류는 JSON 또는 YAML이 올바르게 구성되었으며 파라미터 값이 유효함을 나타냅니다. 출력에 다른 문제가 보고되면 문제를 해결하고 "`Request would have succeeded`" 메시지가 표시될 때까지 이전 단계를 반복합니다.

1. 이제 테스트 실행을 비활성화하기 위해 `DryRun` 파라미터를 `false`로 설정할 수 있습니다.

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

   ```
   {
       "DryRun": false,
       "ImageId": "ami-dfc39aef",
       "KeyName": "mykey",
       "SecurityGroups": [
           "my-sg"
       ],
       "InstanceType": "t2.micro",
       "Monitoring": {
           "Enabled": true
       }
   }
   ```

------
#### [ YAML ]

   ```
   DryRun: false
   ImageId: 'ami-dfc39aef'
   KeyName: 'mykey'
   SecurityGroups:
   - 'my-sg'
   InstanceType: 't2.micro'
   Monitoring: 
     Enabled: true
   ```

------

1. 명령을 실행하면 `run-instances`가 실제로 Amazon EC2 인스턴스를 실행하고 성공적인 실행으로 생성된 세부 정보를 표시합니다. 출력 형식은 입력 파라미터 템플릿의 형식과 별도로 `--output` 파라미터에 의해 제어됩니다.

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

   ```
   $ aws ec2 run-instances --cli-input-json file://ec2runinst.json --output json
   ```

   ```
   {
       "OwnerId": "123456789012",
       "ReservationId": "r-d94a2b1",
       "Groups": [],
       "Instances": [
   ...
   ```

------
#### [ YAML ]

   ```
   $ aws ec2 run-instances --cli-input-yaml file://ec2runinst.yaml --output yaml
   ```

   ```
   OwnerId: '123456789012'
   ReservationId: 'r-d94a2b1',
   Groups":
   - ''
   Instances:
   ...
   ```

------

## 입력 파일과 명령줄 파라미터 결합
<a name="cli-usage-skeleton-combine"></a>

입력 파일은 모든 파라미터에 사용하거나 AWS CLI에 지정된 파라미터와 결합할 수 있습니다. 명령 자체에 개별 설정을 유지하면서 입력 파일에서 자주 재사용하는 설정에이 기능을 사용할 수 있습니다.

다음 `aws ec2 run-instances` 예제에서는 입력 파일과 파라미터의 사용을 결합합니다. 사용할 Amazon Machine Image(AMI)의 인스턴스 유형, 키 이름, 보안 그룹 및 식별자가 제공되고 기본 AWS 리전을 가정합니다. `ami-dfc39aef` AMI는 `us-west-2` 리전에서 호스팅되는 64비트 Amazon Linux 이미지입니다. 다른 리전을 사용하는 경우 [사용할 정확한 AMI ID를 찾아야](https://aws.amazon.com/amazon-linux-ami/) 합니다.

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

JSON 파일의 콘텐츠:

```
{
    "ImageId": "ami-dfc39aef",
    "KeyName": "mykey",
    "SecurityGroups": [
        "my-sg"
    ],
    "InstanceType": "t2.micro",
    "Monitoring": {
        "Enabled": true
    }
}
```

------
#### [ YAML ]

YAML 파일의 콘텐츠:

```
ImageId: 'ami-dfc39aef'
KeyName: 'mykey'
SecurityGroups:
- 'my-sg'
InstanceType: 't2.micro'
Monitoring: 
  Enabled: true
```

------

다음 예제에서는 입력 파일을 `--dry-run` 파라미터와 함께 사용하여 명령의 드라이런을 수행하여 필요한 권한이 있고 파일을 유효한 값으로 입력했는지 확인합니다.

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

```
$ aws ec2 run-instances --cli-input-json file://ec2runinst.json --dry-run
```

```
A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
```

------
#### [ YAML ]

```
$ aws ec2 run-instances --cli-input-yaml file://ec2runinst.yaml --dry-run
```

```
A client error (DryRunOperation) occurred when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
```

------

다음 예제에서는 동일한 입력 파일을 사용하지만 `--no-dry-run` 파라미터와 함께 명령을 전체로 수행합니다.

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

```
$ aws ec2 run-instances --cli-input-json file://ec2runinst.json --no-dry-run --output json
```

```
{
    "OwnerId": "123456789012",
    "ReservationId": "r-d94a2b1",
    "Groups": [],
    "Instances": [
...
```

------
#### [ YAML ]

```
$ aws ec2 run-instances --cli-input-yaml file://ec2runinst.yaml --no-dry-run --output yaml
```

```
OwnerId: '123456789012'
ReservationId: 'r-d94a2b1',
Groups":
- ''
Instances:
...
```

------

# AWS CLI에서 간편 구문 사용
<a name="cli-usage-shorthand"></a>

AWS Command Line Interface(AWS CLI)는 JSON 형식으로 많은 옵션 파라미터를 허용할 수 있습니다. 그러나 긴 JSON 목록이나 구조를 명령줄에 입력하려면 지루할 수 있습니다. 입력을 쉽게 하기 위해 AWS CLI는 전체 JSON 형식을 사용하는 것보다 더 간단하게 옵션 파라미터를 표시할 수 있는 간편 구문도 지원합니다.

**Topics**
+ [키-값 페어가 있는 구조 파라미터](#shorthand-structure-parameters)
+ [파일을 간편 구문 값으로 로드](#shorthand-files)
+ [AWS CLI에서 간편 구문 사용](#shorthand-list-parameters)

## 키-값 페어가 있는 구조 파라미터
<a name="shorthand-structure-parameters"></a>

AWS CLI에서 간편 구문을 사용하면 사용자가 플랫(중첩되지 않은 구조) 파라미터를 더 쉽게 입력할 수 있습니다. 형식은 쉼표로 구분된 키 값 페어 목록입니다. 간편 구문은 문자열이므로 해당 터미널에 적용되는 [인용](cli-usage-parameters-quoting-strings.md) 및 이스케이프 규칙을 사용해야 합니다.

------
#### [ Linux or macOS ]

```
--option key1=value1,key2=value2,key3=value3
```

JSON 형식의 다음 예와 동등합니다.

```
--option '{"key1":"value1","key2":"value2","key3":"value3"}'
```

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

```
--option "key1=value1,key2=value2,key3=value3"
```

JSON 형식의 다음 예와 동등합니다.

```
--option '{"key1":"value1","key2":"value2","key3":"value3"}'
```

------

쉼표로 구분된 각 키 값 페어 사이에 공백이 없어야 합니다. 다음은 `update-table` 옵션이 간편 방식으로 지정되어 있는 Amazon DynamoDB `--provisioned-throughput` 명령입니다.

```
$ aws dynamodb update-table \
    --provisioned-throughput ReadCapacityUnits=15,WriteCapacityUnits=10 \
    --table-name MyDDBTable
```

이 구문은 JSON 형식의 다음 예와 동등합니다.

```
$ aws dynamodb update-table \
    --provisioned-throughput '{"ReadCapacityUnits":15,"WriteCapacityUnits":10}' \
    --table-name MyDDBTable
```

## 파일을 간편 구문 값으로 로드
<a name="shorthand-files"></a>

값이 크거나 복잡한 경우 값으로 로드하는 것이 더 쉬운 경우가 많습니다. 파일을 간편 구문 값으로 로드하려면 형식이 약간 변경됩니다. `key=value` 대신 `=` 연산자 대신 `@=` 연산자를 사용합니다. `@=`는 AWS CLI에 값을 문자열이 아닌 파일 경로로 읽어야 함을 보여줍니다. 파일을 간편 구문으로 로드할 때는 일반적인 [AWS CLI 파일 형식 지정 규칙이 적용](cli-usage-parameters-file.md)됩니다. 다음 예제에서는 해당 값에 대한 파일을 로드하는 키-값 페어를 보여줍니다.

------
#### [ Linux or macOS ]

```
--option key@=file://template.txt
```

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

```
--option "key1@=file://template.txt"
```

------

다음 예제에서는 `aws rolesanywhere create-trust-anchor` 명령에 대한 인증서 파일을 로드하는 방법을 보여줍니다.

```
$ aws rolesanywhere create-trust-anchor --name TrustAnchor \
    --source sourceData={x509CertificateData@=file://root-ca.crt},sourceType="CERTIFICATE_BUNDLE"  \ 
    --enabled
```

## AWS CLI에서 간편 구문 사용
<a name="shorthand-list-parameters"></a>

목록 형식의 입력 파라미터는 JSON 또는 간편 구문이라는 두 가지 방법으로 지정할 수 있습니다. AWS CLI의 간편 구문은 숫자, 문자열 또는 비중첩 구조가 있는 목록을 더 쉽게 입력할 수 있도록 하기 위해 설계되었습니다.

기본 형식은 여기에 표시됩니다. 여기서 목록의 값은 단일 공백으로 구분됩니다.

```
--option value1 value2 value3
```

이 구문은 JSON 형식의 다음 예와 동등합니다.

```
--option '[value1,value2,value3]'
```

앞에서 언급한 바와 같이, 숫자 목록, 문자열 목록 또는 비중첩 구조 목록을 간편 방식으로 지정할 수 있습니다. 다음은 Amazon Elastic Compute Cloud(Amazon EC2)에 대한 `stop-instances` 명령의 예입니다. 여기서 `--instance-ids` 옵션에 대한 입력 파라미터(문자열 목록)는 간편 방식으로 지정됩니다.

```
$ aws ec2 stop-instances \
    --instance-ids i-1486157a i-1286157c i-ec3a7e87
```

이 구문은 JSON 형식의 다음 예와 동등합니다.

```
$ aws ec2 stop-instances \
    --instance-ids '["i-1486157a","i-1286157c","i-ec3a7e87"]'
```

다음 예제는 Amazon EC2 `create-tags` 명령을 보여줍니다. 이 명령은 `--tags` 옵션에 대한 비중첩 구조 목록을 가져옵니다. `--resources` 옵션은 태깅할 인스턴스의 ID를 지정합니다.

```
$ aws ec2 create-tags \
    --resources i-1286157c \
    --tags Key=My1stTag,Value=Value1 Key=My2ndTag,Value=Value2 Key=My3rdTag,Value=Value3
```

이 구문은 JSON 형식의 다음 예와 동등합니다. JSON 파라미터는 쉽게 읽을 수 있도록 여러 줄로 작성됩니다.

```
$ aws ec2 create-tags \
    --resources i-1286157c \
    --tags '[
        {"Key": "My1stTag", "Value": "Value1"},
        {"Key": "My2ndTag", "Value": "Value2"},
        {"Key": "My3rdTag", "Value": "Value3"}
    ]'
```

# AWS CLI에서 명령 프롬프트 활성화 및 사용
<a name="cli-usage-parameters-prompting"></a>

`aws` 명령을 실행할 때 명령, 파라미터 및 리소스에 대한 AWS CLI 버전 2 프롬프트를 사용할 수 있습니다.

**Topics**
+ [작동 방식](#cli-usage-auto-prompt-about)
+ [자동 프롬프트 기능](#cli-usage-auto-prompt-features)
+ [자동 프롬프트 모드](#cli-usage-auto-prompt-modes)
+ [자동 프롬프트 구성](#cli-usage-auto-prompt-configure)

## 작동 방식
<a name="cli-usage-auto-prompt-about"></a>

활성화하면 자동 프롬프트를 통해 **ENTER** 키를 사용하여 부분적으로 입력된 명령을 완성할 수 있습니다. **ENTER** 키를 누르면 계속 입력하는 내용에 따라 명령, 파라미터 및 리소스가 제안됩니다. 제안 사항의 왼쪽에는 명령, 파라미터 또는 리소스의 이름이 나열되고 오른쪽에는 설명이 나열됩니다. 제안을 선택하고 사용하려면 화살표 키를 사용하여 행을 강조 표시한 다음 **SPACE** 키를 누릅니다. 명령 입력을 마치면 **ENTER** 키를 눌러 명령을 사용합니다. 다음 예제에서는 자동 프롬프트에서 제안된 목록을 보여줍니다.

```
$ aws
> aws a
       accessanalyzer                Access Analyzer
       acm                           AWS Certificate Manager
       acm-pca                       AWS Certificate Manager Private Certificate Authority
       alexaforbusiness              Alexa For Business
       amplify                       AWS Amplify
```

## 자동 프롬프트 기능
<a name="cli-usage-auto-prompt-features"></a>

자동 프롬프트에는 다음과 같은 유용한 기능이 포함되어 있습니다.

**설명서 패널**  
현재 명령에 대한 도움말 설명서를 제공합니다. 설명서를 열려면 **F3** 키를 누릅니다.

**명령 완성**  
사용할 `aws` 명령을 제안합니다. 목록을 보려면 명령을 부분적으로 입력합니다. 다음 예제에서는 `a` 문자로 시작하는 서비스를 검색합니다.  

```
$ aws
> aws a
       accessanalyzer                Access Analyzer
       acm                           AWS Certificate Manager
       acm-pca                       AWS Certificate Manager Private Certificate Authority
       alexaforbusiness              Alexa For Business
       amplify                       AWS Amplify
```

**파라미터 완성**  
명령을 입력하면 자동 프롬프트가 파라미터를 제안하기 시작합니다. 파라미터에 대한 설명에는 값 유형 및 파라미터에 대한 설명이 포함됩니다. 필수 파라미터가 먼저 나열되고 필요에 따라 레이블이 지정됩니다. 다음 예제에서는 `aws dynamodb describe-table`에 대한 파라미터의 자동 프롬프트 목록을 보여줍니다.  

```
$ aws dynamodb describe-table
> aws dynamodb describe-table 
                              --table-name (required)  [string] The name of the table to describe.
                               --cli-input-json         [string] Reads arguments from the JSON string provided. The JSON string follows the format provide...
                               --cli-input-yaml         [string] Reads arguments from the YAML string provided. The YAML string follows the format provide...
                               --generate-cli-skeleton  [string] Prints a JSON skeleton to standard output without sending an API request. If provided wit...
```

**리소스 완성**  
자동 프롬프트는 사용 가능한 AWS 리소스 속성을 사용하여 AWS API를 호출함으로써 리소스 값을 제안합니다. 이를 통해 자동 프롬프트는 사용자가 파라미터를 입력할 때 소유한 리소스 중에서 가능한 리소스를 제안합니다. 다음 예제에서는 `--table-name` 명령의 `aws dynamodb describe-table` 파라미터를 채울 때 자동 프롬프트가 테이블 이름을 나열합니다.  

```
$ aws dynamodb describe-table
> aws dynamodb describe-table --table-name 
                                            Table1
                                            Table2
                                            Table3
```

**단축 완성**  
자동 프롬프트는 단축 구문을 사용하는 파라미터에 사용할 수 있는 값을 제안합니다. 다음 예제에서 자동 프롬프트는 `--placement` 명령의 `aws ec2 run-instances` 파라미터에 대한 단축 구문 값을 나열합니다.  

```
$ aws ec2 run-instances
> aws ec2 run-instances --placement 
 AvailabilityZone=      [string] The Availability Zone of the instance. If not specified, an Availability Zone wil...
 Affinity=              [string] The affinity setting for the instance on the Dedicated Host. This parameter is no...
 GroupName=             [string] The name of the placement group the instance is in.
 PartitionNumber=       [integer] The number of the partition the instance is in. Valid only if the placement grou...
```

**파일 완성**  
`aws` 명령에서 파라미터를 채울 때 접두사 `file://` 또는 `fileb://`를 사용하면 자동 완성이 로컬 파일 이름을 제안합니다. 다음 예제에서는 `--item file://` 명령에 대해 `aws ec2 run-instances`을 입력한 후 자동 프롬프트가 로컬 파일을 제안합니다.  

```
$ aws ec2 run-instances
> aws ec2 run-instances --item file:// 
                         item1.txt
                         file1.json
                         file2.json
```

**리전 완성**  
글로벌 파라미터 `--region`을 사용하는 경우 자동 프롬프트는 선택할 수 있는 리전을 나열합니다. 다음 예제에서는 `--region` 명령에 대해 `aws dynamodb list-tables`을 입력한 후 자동 프롬프트가 알파벳 순서로 리전을 제안합니다.  

```
$ aws dynamodb list-tables
> aws dynamodb list-tables --region 
                                     af-south-1
                                     ap-east-1
                                     ap-northeast-1
                                     ap-northeast-2
```

**프로필 완성**  
글로벌 파라미터 `--profile`을 사용하는 경우 자동 프롬프트는 프로필을 나열합니다. 다음 예제에서는 `--profile` 명령에 대해 `aws dynamodb list-tables`을 입력한 후 자동 프롬프트가 프로파일을 제안합니다.  

```
$ aws dynamodb list-tables
> aws dynamodb list-tables --profile 
                                     profile1
                                     profile2
                                     profile3
```

**퍼지 검색**  
특정 문자 세트를 포함하는 명령 및 값을 완성합니다. 다음 예제에서는 `eu` 명령에 대해 `--region eu`을 입력한 후 자동 프롬프트가 `aws dynamodb list-tables`가 포함된 리전을 제안합니다.  

```
$ aws dynamodb list-tables
> aws dynamodb list-tables --region west
                                         eu-west-1
                                         eu-west-2
                                         eu-west-3
                                         us-west-1
```

**기록**  
이전에 사용한 명령을 자동 프롬프트 모드에서 보고 실행하려면 **CTRL \$1 R**을 누릅니다. 기록은 화살표 키를 사용하여 선택할 수 있는 이전 명령을 나열합니다. 다음 예제에는 자동 프롬프트 모드 기록이 표시되어 있습니다.  

```
$ aws
> aws 
        dynamodb list-tables
        s3 ls
```

## 자동 프롬프트 모드
<a name="cli-usage-auto-prompt-modes"></a>

AWS CLI 버전 2에 대한 자동 프롬프트에는 두 가지 모드를 구성할 수 있습니다.
+ **전체 모드:** `aws` 파라미터를 사용하여 호출하든 영구적으로 활성화하든 `--cli-auto-prompt` 명령을 실행할 때마다 자동 프롬프트를 사용합니다. 여기에는 전체 명령 또는 불완전한 명령 다음에 **Enter** 키를 누르는 것이 포함됩니다.
+ **부분 모드:** 명령이 불완전하거나 클라이언트 측 유효성 검사 오류로 인해 실행할 수 없는 경우 자동 프롬프트를 사용합니다. 이 모드는 기존 스크립트 또는 Runbook이 있거나, 모든 명령에 대한 프롬프트가 아니라 익숙하지 않은 명령에 대해서만 자동 프롬프트를 사용하려는 경우 특히 유용합니다.

## 자동 프롬프트 구성
<a name="cli-usage-auto-prompt-configure"></a>

자동 프롬프트를 구성하려면 우선 순위에 따라 다음 방법을 사용할 수 있습니다.
+ **명령줄 옵션**으로 단일 명령에 대해 자동 프롬프트를 사용하거나 사용하지 않도록 설정합니다. 자동 프롬프트를 호출하려면 `--cli-auto-prompt`를 사용하고 자동 프롬프트를 비활성화하려면 `--no-cli-auto-prompt`를 사용합니다.
+ **환경 변수**에는 `aws\$1cli\$1auto\$1prompt` 변수를 사용합니다.
+ **공유 구성 파일**에는 `cli\$1auto\$1prompt` 설정을 사용합니다.

# AWS CLI에서 명령 출력 제어
<a name="cli-usage-output"></a>

이 섹션에서는 AWS Command Line Interface(AWS CLI)의 출력을 제어하는 다양한 방법에 대해 설명합니다. 터미널에서 AWS CLI 출력을 사용자 지정하면 가독성을 개선하고 스크립팅 자동화를 간소화하며 대규모 데이터세트를 더 쉽게 탐색할 수 있습니다.

AWS CLI는 [`json`](cli-usage-output-format.md#json-output), [`text`](cli-usage-output-format.md#text-output), [`yaml`](cli-usage-output-format.md#yaml-output), [`off`](cli-usage-output-format.md#off-output) 및 [`table`](cli-usage-output-format.md#table-output)을 비롯한 다양한 [출력 형식](cli-usage-output-format.md)을 지원합니다. 일부 서비스에는 데이터에 대한 서버 측 [페이지 매김](cli-usage-pagination.md)이 있으며, AWS CLI는 추가 페이지 매김 옵션을 위한 자체적인 클라이언트 측 기능을 제공합니다.

AWS CLI에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 [서버 측 필터링과 클라이언트 측 필터링](cli-usage-filter.md)이 둘 다 있습니다.

**Topics**
+ [민감한 출력](#cli-usage-output-sensitive)
+ [서버 측 출력 옵션과 클라이언트 측 출력 옵션 비교](#cli-usage-output-server-client)
+ [AWS CLI의 출력 형식 설정](cli-usage-output-format.md)
+ [AWS CLI의 구조화된 오류 출력](cli-usage-error-format.md)
+ [AWS CLI의 페이지 매김 옵션 사용](cli-usage-pagination.md)
+ [AWS CLI에서 출력 필터링](cli-usage-filter.md)

## 민감한 출력
<a name="cli-usage-output-sensitive"></a>

AWS CLI의 일부 작업은 환경 변수의 정보를 포함하여 민감한 것으로 간주될 수 있는 정보를 반환할 수 있습니다. 이러한 정보의 노출은 특정 시나리오에서 보안 위험을 나타낼 수 있습니다. 예를 들어, 이러한 정보는 지속적 통합 및 지속적 배포(CI/CD) 로그에 포함될 수 있습니다. 따라서 이러한 출력을 언제 로그의 일부로 포함할지 검토하고 필요하지 않은 경우 출력을 억제하는 것이 중요합니다.

민감한 데이터 보호에 대한 자세한 내용은 [AWS CLI에서 데이터 보호](data-protection.md)를 참조하세요.

다음 모범 사례를 고려하세요.
+ AWS Secrets Manager와 같은 암호 저장소에서 프로그래밍 방식으로 암호를 검색하는 것을 좋습니다.
+ 빌드 로그의 내용을 검토하여 민감한 정보가 포함되어 있지 않은지 확인합니다. `/dev/null`로 파이핑하거나 출력을 bash 또는 PowerShell 변수로 캡처하여 명령 출력을 억제하는 등의 접근 방식을 고려합니다.

  다음은 오류가 아닌 출력을 `/dev/null`로 리디렉션하는 bash 예제입니다.

  ```
  $ aws s3 ls > /dev/null
  ```

  터미널의 출력을 억제하는 방법에 대한 자세한 내용은 사용 중인 터미널의 사용 설명서를 참조하세요.
+ 로그의 액세스 권한을 고려하여 사용 사례에 맞게 액세스 범위를 적절히 설정하세요.

## 서버 측 출력 옵션과 클라이언트 측 출력 옵션 비교
<a name="cli-usage-output-server-client"></a>

AWS CLI에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 [서버 측 필터링과 클라이언트 측 필터링](cli-usage-filter.md)이 둘 다 있습니다. 서버 측 필터링이 먼저 처리되고 클라이언트 측 필터링에 대한 출력을 반환합니다. 서버 측 필터링은 서비스 API에서 지원됩니다. 클라이언트 측 필터링은 AWS CLI 매개 변수를 사용하여 `--query` 클라이언트에서 지원됩니다.

**서버 측** 출력 옵션은 AWS 서비스 API에서 직접 지원합니다. 필터링되거나 페이징된 데이터는 클라이언트로 전송되지 않으므로 HTTP 응답 시간이 빨라지고 대규모 데이터세트의 대역폭을 개선할 수 있습니다.

**클라이언트 측** 출력 옵션은 AWS CLI에서 만든 기능입니다. 모든 데이터가 클라이언트로 전송되면 AWS CLI가 표시되는 콘텐츠를 필터링하거나 페이지를 매깁니다. 클라이언트 측 작업으로는 대규모 데이터세트의 속도나 대역폭이 절약되지 않습니다.

서버 측 옵션과 클라이언트 측 옵션을 함께 사용하면 서버 측 작업이 먼저 완료된 후 클라이언트로 전송되어 클라이언트 측 작업이 진행됩니다. 이를 통해 서버 측 옵션의 잠재적인 속도 및 대역폭 절감 효과를 활용하는 동시에 추가 AWS CLI 기능을 사용하여 원하는 결과를 얻을 수 있습니다.

# AWS CLI의 출력 형식 설정
<a name="cli-usage-output-format"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 다양한 출력 형식에 대해 설명합니다. AWS CLI은(는) 다음 출력 형식을 지원합니다.
+ **[`json`](#json-output)** - 출력은 [JSON](https://json.org/) 문자열로 형식이 지정됩니다.
+  **[`yaml`](#yaml-output)** - 출력은 [YAML](https://yaml.org/) 문자열로 형식이 지정됩니다.
+ **[`yaml-stream`](#yaml-stream-output)** - 출력은 스트리밍되고 [YAML](https://yaml.org/) 문자열로 형식이 지정됩니다. 스트리밍을 통해 대용량 데이터 유형을 빠르게 처리할 수 있습니다.
+ **[`text`](#text-output)** - 출력은 여러 줄의 탭으로 구분된 문자열 값으로 형식이 지정됩니다. 출력을 `grep`, `sed` 또는 `awk`와 같은 텍스트 프로세서로 전달하는 데 사용할 수 있습니다.
+ **[`table`](#table-output)** - 출력은 셀 테두리를 형성하기 위해 \$1\$1- 문자를 사용하여 표로 형식이 지정됩니다. 일반적으로 읽기는 쉽지만 프로그래밍 방식으로는 유용하지 않은 ‘인간 친화적’ 형식으로 정보를 표시합니다.
+ **[`off`](#off-output)** - 명령의 모든 표준 출력(stdout)을 숨깁니다. 이는 출력을 처리하지 않고 명령의 종료 코드만 확인하면 되는 자동화 스크립트 및 CI/CD 파이프라인에서 유용합니다.

## 출력 형식을 선택하는 방법
<a name="cli-usage-output-format-how"></a>

[구성](cli-chap-configure.md) 주제의 설명과 같이, 다음 세 가지 방법으로 출력 형식을 지정할 수 있습니다.
+ **`output` 파일의 명명된 프로파일에서 `config` 옵션 사용** - 다음 예제에서는 기본 출력 형식을 `text`로 설정합니다.

  ```
  [default]
  output=text
  ```
+ **`AWS_DEFAULT_OUTPUT` 환경 변수 사용** - 다음 출력은 변수가 변경되거나 세션이 끝날 때까지 이 명령줄 세션의 명령 형식을 `table`로 지정합니다. 이 환경 변수를 사용하면 `config` 파일에 설정된 값을 재정의합니다.

  ```
  $ export AWS_DEFAULT_OUTPUT="table"
  ```
+ **명령줄에서 `--output` 옵션 사용** - 다음 예제에서는 이 명령의 출력만 `json`으로 설정합니다. 명령에 이 옵션을 사용하면 현재 설정된 환경 변수 또는 `config` 파일의 값을 재정의합니다.

  ```
  $ aws swf list-domains --registration-status REGISTERED --output json
  ```

**중요**  
지정한 출력 유형에 따라 `--query` 옵션 작동 방식이 변경됩니다.  
`--output text`를 지정하면 `--query` 필터를 적용하기 *전에* 해당 출력이 페이지 매김되며, AWS CLI는 해당 출력의 *각 페이지*에서 해당 쿼리를 한 번 실행합니다. 이로 인해, 쿼리에는 예상치 못한 추가 출력이 발생할 수 있는 각 페이지의 첫 번째 일치하는 요소가 포함됩니다. 출력을 추가로 필터링하려면 `head` 또는 `tail` 등 다른 명령줄 도구를 사용할 수 있습니다.
`--output json`, `--output yaml` 또는 `--output yaml-stream`을 지정하면 해당 출력을 하나의 네이티브 구조로 완전히 처리한 뒤에 `--query` 필터를 적용합니다. AWS CLI은(는) 전체 구조에 대해 한 번만 쿼리를 실행하여 필터링된 결과를 생성한 다음 출력합니다.

## JSON 출력 형식
<a name="json-output"></a>

[JSON](https://json.org)은 AWS CLI의 기본 출력 형식입니다. 대부분의 프로그래밍 언어는 기본 제공된 기능 또는 공개적으로 사용 가능한 라이브러리를 사용하여 JSON 문자열을 쉽게 디코딩할 수 있습니다. JSON 출력을 강력한 방법으로 [--query 옵션](cli-usage-filter.md)과 결합하여 AWS CLI JSON 형식의 출력을 필터링하고 서식을 지정할 수 있습니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 JSON 프로세서인 `jq`를 고려할 수 있습니다. [http://stedolan.github.io/jq/](http://stedolan.github.io/jq/)에서 이 처리기를 다운로드하고 공식 자습서를 찾아볼 수 있습니다.

다음은 JSON 출력의 예제입니다.

```
$ aws iam list-users --output json
```

```
{
    "Users": [
        {
            "Path": "/",
            "UserName": "Admin",
            "UserId": "AIDA1111111111EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/Admin",
            "CreateDate": "2014-10-16T16:03:09+00:00",
            "PasswordLastUsed": "2016-06-03T18:37:29+00:00"
        },
        {
            "Path": "/backup/",
            "UserName": "backup-user",
            "UserId": "AIDA2222222222EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/backup/backup-user",
            "CreateDate": "2019-09-17T19:30:40+00:00"
        },
        {
            "Path": "/",
            "UserName": "cli-user",
            "UserId": "AIDA3333333333EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:user/cli-user",
            "CreateDate": "2019-09-17T19:11:39+00:00"
        }
    ]
}
```

## YAML 출력 형식
<a name="yaml-output"></a>

[YAML](https://yaml.org)은 [YAML](https://yaml.org) 형식의 문자열을 출력하거나 소비하는 CloudFormation 같은 서비스 및 도구와 [YAML 형식의 템플릿](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-formats.html) 지원을 이용하여 프로그래밍 방식으로 출력을 처리하는 데 적합합니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 YAML 프로세서인 `yq`를 고려할 수 있습니다. *GitHub*의 [yq 리포지토리](https://github.com/mikefarah/yq)에서 `yq`를 다운로드할 수 있습니다.

다음은 YAML 출력의 예제입니다.

```
$ aws iam list-users --output yaml
```

```
Users:
- Arn: arn:aws:iam::123456789012:user/Admin
  CreateDate: '2014-10-16T16:03:09+00:00'
  PasswordLastUsed: '2016-06-03T18:37:29+00:00'
  Path: /
  UserId: AIDA1111111111EXAMPLE
  UserName: Admin
- Arn: arn:aws:iam::123456789012:user/backup/backup-user
  CreateDate: '2019-09-17T19:30:40+00:00'
  Path: /backup/
  UserId: AIDA2222222222EXAMPLE
  UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
- Arn: arn:aws:iam::123456789012:user/cli-user
  CreateDate: '2019-09-17T19:30:40+00:00'
  Path: /
  UserId: AIDA3333333333EXAMPLE
  UserName: cli-user
```

## YAML 스트림 출력 형식
<a name="yaml-stream-output"></a>

`yaml-stream` 형식을 사용하면 [YAML](https://yaml.org) 형식을 활용하는 동시에 데이터를 스트리밍하여 대용량 데이터세트를 더 응답성이 우수하고 빠르게 볼 수 있습니다. 전체 쿼리가 다운로드되기 전에 YAML 데이터를 보고 사용할 수 있습니다.

`--query`로 수행할 수 없는 고급 필터링의 경우 명령줄 YAML 프로세서인 `yq`를 고려할 수 있습니다. *GitHub*의 [yq 리포지토리](https://github.com/mikefarah/yq)에서 `yq`를 다운로드할 수 있습니다.

다음은 `yaml-stream` 출력의 예제입니다.

```
$ aws iam list-users --output yaml-stream
```

```
- IsTruncated: false
  Users:
  - Arn: arn:aws:iam::123456789012:user/Admin
    CreateDate: '2014-10-16T16:03:09+00:00'
    PasswordLastUsed: '2016-06-03T18:37:29+00:00'
    Path: /
    UserId: AIDA1111111111EXAMPLE
    UserName: Admin
  - Arn: arn:aws:iam::123456789012:user/backup/backup-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /backup/
    UserId: AIDA2222222222EXAMPLE
    UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
  - Arn: arn:aws:iam::123456789012:user/cli-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /
    UserId: AIDA3333333333EXAMPLE
    UserName: cli-user
```

다음은 `yaml-stream` 파라미터를 사용하여 스트리밍된 YAML 콘텐츠의 페이지 매김과 함께 `--page-size` 출력의 예입니다.

```
$ aws iam list-users --output yaml-stream --page-size 2
```

```
- IsTruncated: true
  Marker: ab1234cdef5ghi67jk8lmo9p/q012rs3t445uv6789w0x1y2z/345a6b78c9d00/1efgh234ij56klmno78pqrstu90vwxyx  
  Users:
  - Arn: arn:aws:iam::123456789012:user/Admin
    CreateDate: '2014-10-16T16:03:09+00:00'
    PasswordLastUsed: '2016-06-03T18:37:29+00:00'
    Path: /
    UserId: AIDA1111111111EXAMPLE
    UserName: Admin
  - Arn: arn:aws:iam::123456789012:user/backup/backup-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /backup/
    UserId: AIDA2222222222EXAMPLE
    UserName: arq-45EFD6D1-CE56-459B-B39F-F9C1F78FBE19
- IsTruncated: false
  Users:
  - Arn: arn:aws:iam::123456789012:user/cli-user
    CreateDate: '2019-09-17T19:30:40+00:00'
    Path: /
    UserId: AIDA3333333333EXAMPLE
    UserName: cli-user
```

## 텍스트 출력 형식
<a name="text-output"></a>

`text` 형식은 AWS CLI 출력을 탭으로 구분된 줄로 구성합니다. `grep`, `sed` 및 `awk`와 같은 기존 Unix 텍스트 도구 및 PowerShell에서 수행하는 텍스트 처리에 효과적입니다.

`text` 출력 형식은 아래와 같은 기본 구조를 따릅니다. 열은 기본 JSON 객체의 해당 키 이름을 기준으로 알파벳 순서로 정렬됩니다.

```
IDENTIFIER  sorted-column1 sorted-column2
IDENTIFIER2 sorted-column1 sorted-column2
```

다음은 `text` 출력의 예제입니다. 각 필드는 다른 항목과 구분된 탭이며 빈 필드가 있는 추가 탭이 있습니다.

```
$ aws iam list-users --output text
```

```
USERS   arn:aws:iam::123456789012:user/Admin                2014-10-16T16:03:09+00:00   2016-06-03T18:37:29+00:00   /          AIDA1111111111EXAMPLE   Admin
USERS   arn:aws:iam::123456789012:user/backup/backup-user   2019-09-17T19:30:40+00:00                               /backup/   AIDA2222222222EXAMPLE   backup-user
USERS   arn:aws:iam::123456789012:user/cli-user             2019-09-17T19:11:39+00:00                               /          AIDA3333333333EXAMPLE   cli-user
```

네 번째 열은 `PasswordLastUsed` 필드이며, 해당 사용자가 AWS Management Console 콘솔에 로그인하지 않기 때문에 마지막 두 항목은 비어 있습니다.

**중요**  
*`text` 출력을 지정하는 경우 일관된 동작을 보장하기 위해 항상 [`--query`](cli-usage-filter.md) 옵션도 사용하는 것이 좋습니다.*  
텍스트 형식이 출력 열을 AWS 서비스에서 반환하는 기본 JSON 객체의 키 이름에 따라 알파벳 순서로 정렬하고, 유사한 리소스에 항상 동일한 키 이름이 있는 것은 아니기 때문입니다. 예를 들어 Linux 기반 Amazon EC2 인스턴스의 JSON 표시에는 Windows 기반 인스턴스의 JSON 표시에 없는 요소가 있을 수 있으며 반대의 경우도 마찬가지입니다. 또한 리소스에는 향후 업데이트에서 추가되거나 제거되어 열 순서를 변경하는 키-값 요소가 있을 수 있습니다. 이러한 경우 `--query`를 사용하면 출력 형식을 완전히 제어할 수 있도록 `text` 출력의 기능이 향상됩니다.  
다음 예제에서 명령은 표시할 요소를 지정하고 목록 표기법 `[key1, key2, ...]`를 사용하여 열의 *순서를 정의*합니다. 이렇게 하면 예상 열에 올바른 키 값이 항상 표시된다는 완전한 확신을 사용자에게 제공할 수 있습니다. 마지막으로 AWS CLI에서 존재하지 않는 키 값으로 `None`을 출력하는 방식을 살펴보세요.  

```
$ aws iam list-users --output text --query 'Users[*].[UserName,Arn,CreateDate,PasswordLastUsed,UserId]'
```

```
Admin         arn:aws:iam::123456789012:user/Admin         2014-10-16T16:03:09+00:00   2016-06-03T18:37:29+00:00   AIDA1111111111EXAMPLE
backup-user   arn:aws:iam::123456789012:user/backup-user   2019-09-17T19:30:40+00:00   None                        AIDA2222222222EXAMPLE
cli-user      arn:aws:iam::123456789012:user/cli-backup    2019-09-17T19:11:39+00:00   None                        AIDA3333333333EXAMPLE
```

다음 예제는 `grep` 명령의 `awk` 출력에 `text` 및 `aws ec2 describe-instances`를 사용하는 방법을 보여줍니다. 첫 번째 명령은 `text` 출력에 각 인스턴스의 가용 영역, 현재 상태 및 인스턴스 ID를 표시합니다. 두 번째 명령은 `us-west-2a` 가용 영역에서 실행 중인 모든 인스턴스의 인스턴스 ID만 표시하는 출력을 처리합니다.

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text
```

```
us-west-2a      running i-4b41a37c
us-west-2a      stopped i-a071c394
us-west-2b      stopped i-97a217a0
us-west-2a      running i-3045b007
us-west-2a      running i-6fc67758
```

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text | grep us-west-2a | grep running | awk '{print $3}'
```

```
i-4b41a37c
i-3045b007
i-6fc67758
```

다음 예제는 한 단계 더 나아가 출력을 필터링하는 방법뿐만 아니라 출력을 사용하여 중지된 각 인스턴스의 인스턴스 유형 변경을 자동화하는 방법을 보여줍니다.

```
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[State.Name, InstanceId]' --output text |
> grep stopped |
> awk '{print $2}' |
> while read line;
> do aws ec2 modify-instance-attribute --instance-id $line --instance-type '{"Value": "m1.medium"}';
> done
```

`text` 출력은 PowerShell에서도 유용할 수 있습니다. `text` 출력의 열은 탭으로 구분되어 있으므로 PowerShell의 ``t` 구분 기호를 사용하여 출력을 배열로 쉽게 분할할 수 있습니다. 다음 명령은 첫 번째 열(`InstanceId`)이 `AvailabilityZone` 문자열과 일치할 경우 세 번째 열(`us-west-2a`)의 값을 표시합니다.

```
PS C:\>aws ec2 describe-instances --query 'Reservations[*].Instances[*].[Placement.AvailabilityZone, State.Name, InstanceId]' --output text |
%{if ($_.split("`t")[0] -match "us-west-2a") { $_.split("`t")[2]; } }
```

```
-4b41a37c
i-a071c394
i-3045b007
i-6fc67758
```

이전 예제에서 `--query` 파라미터를 사용하여 기본 JSON 객체를 구문 분석하고 원하는 열을 추출하는 방법을 알아보았지만, 교차 플랫폼 호환성이 문제가 되지 않을 경우 PowerShell 자체 기능으로 JSON을 처리할 수 있습니다. 대부분의 명령 셸에서 요구하듯이 출력을 텍스트로 처리하는 대신, PowerShell에서는 `ConvertFrom-JSON` cmdlet을 사용하여 계층적으로 구조화된 객체를 생성할 수 있습니다. 그런 다음 해당 객체에서 직접 원하는 멤버에 액세스할 수 있습니다.

```
(aws ec2 describe-instances --output json | ConvertFrom-Json).Reservations.Instances.InstanceId
```

**작은 정보**  
텍스트를 출력하고 `--query` 파라미터를 사용하여 단일 필드로 필터링하는 경우, 탭으로 구분된 값이 한 줄로 출력됩니다. 각 값을 별개의 줄로 가져오려면 다음 예제에 표시된 대로 출력 필드를 괄호 안에 넣으면 됩니다.  
탭으로 구분되어 한 줄로 출력:  

```
$ aws iam list-groups-for-user --user-name susan  --output text --query "Groups[].GroupName"
```

```
HRDepartment    Developers      SpreadsheetUsers  LocalAdmins
```
`[GroupName]`을 괄호 안에 넣어서 각 값을 자체의 줄에 출력:  

```
$ aws iam list-groups-for-user --user-name susan  --output text --query "Groups[].[GroupName]"
```

```
HRDepartment
Developers
SpreadsheetUsers
LocalAdmins
```

## 테이블 출력 형식
<a name="table-output"></a>

`table` 형식은 사람이 읽을 수 있는 복잡한 AWS CLI 출력 표시를 표 형식으로 생성합니다.

```
$ aws iam list-users --output table
```

```
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                                 ListUsers                                                                     |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
||                                                                                  Users                                                                      ||
|+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+|
||                         Arn                        |       CreateDate          |    PasswordLastUsed       |   Path   |        UserId         |   UserName  ||
|+----------------------------------------------------+---------------------------+---------------------------+----------+-----------------------+-------------+|
||  arn:aws:iam::123456789012:user/Admin              | 2014-10-16T16:03:09+00:00 | 2016-06-03T18:37:29+00:00 | /        | AIDA1111111111EXAMPLE | Admin       ||
||  arn:aws:iam::123456789012:user/backup/backup-user | 2019-09-17T19:30:40+00:00 |                           | /backup/ | AIDA2222222222EXAMPLE | backup-user ||
||  arn:aws:iam::123456789012:user/cli-user           | 2019-09-17T19:11:39+00:00 |                           | /        | AIDA3333333333EXAMPLE | cli-user    ||
+---------------------------------------------------------------------------------------------------------------------------------------------------------------+
```

`--query` 옵션을 `table` 형식과 결합하여 원시 출력에서 미리 선택한 요소 집합을 표시할 수 있습니다. 사전 표기법과 목록 표기법의 출력 차이에 주의하세요. 첫 번째 예제에서는 열 이름이 알파벳 순서로 정렬되고 두 번째 예제에서는 이름 없는 열이 사용자가 정의한 방식으로 정렬됩니다. `--query` 옵션에 대한 자세한 내용은 [AWS CLI에서 출력 필터링](cli-usage-filter.md) 섹션을 참조하세요.

```
$ aws ec2 describe-volumes --query 'Volumes[*].{ID:VolumeId,InstanceId:Attachments[0].InstanceId,AZ:AvailabilityZone,Size:Size}' --output table
```

```
------------------------------------------------------
|                   DescribeVolumes                  | 
+------------+----------------+--------------+-------+
|     AZ     |      ID        | InstanceId   | Size  |
+------------+----------------+--------------+-------+
|  us-west-2a|  vol-e11a5288  |  i-a071c394  |  30   |
|  us-west-2a|  vol-2e410a47  |  i-4b41a37c  |  8    |
+------------+----------------+--------------+-------+
```

```
$ aws ec2 describe-volumes --query 'Volumes[*].[VolumeId,Attachments[0].InstanceId,AvailabilityZone,Size]' --output table
```

```
----------------------------------------------------
|                  DescribeVolumes                 |
+--------------+--------------+--------------+-----+
|  vol-e11a5288|  i-a071c394  |  us-west-2a  |  30 |
|  vol-2e410a47|  i-4b41a37c  |  us-west-2a  |  8  |
+--------------+--------------+--------------+-----+
```

## Off 출력 형식
<a name="off-output"></a>

`off` 형식은 명령의 모든 표준 출력(stdout)을 숨깁니다. 이는 출력을 처리하지 않고 명령의 종료 코드만 확인하면 되는 자동화 스크립트 및 CI/CD 파이프라인에서 유용합니다. 오류 메시지는 여전히 stderr에 표시됩니다.

다음 예제에서는 `off` 형식이 어떻게 성공적인 출력을 숨기는지 보여줍니다. 종료 코드를 확인하여 성공 여부를 파악할 수 있습니다.

```
$ aws s3api list-buckets --output off
$ echo $?
0
```

이는 출력을 캡처하지 않고 리소스가 존재하는지 확인하려는 쉘 스크립트에서 특히 유용합니다.

```
#!/bin/bash
if aws s3api head-bucket --bucket my-bucket --output off 2>/dev/null; then
    echo "Bucket exists"
else
    echo "Bucket does not exist"
fi
```

**참고**  
`off` 형식은 stdout만 숨깁니다. 오류는 여전히 stderr에 기록됩니다.

# AWS CLI의 구조화된 오류 출력
<a name="cli-usage-error-format"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 구조화된 오류 출력 형식에 대해 설명합니다. CLI는 stderr에 오류를 기록하며 다음 형식을 지원합니다.
+ **[`enhanced`](#cli-error-format-enhanced)**(기본값) - 추가 세부 정보가 인라인으로 표시된 오류 메시지입니다. 사람이 읽을 수 있는 디버깅을 위해 사용합니다.
+ **[`json`](#cli-error-format-json)** - 출력은 모든 오류 필드를 포함하며 [JSON](https://json.org/) 문자열 형식입니다. 자동화 및 스크립팅을 위해 사용합니다.
+ **[`yaml`](#cli-error-format-yaml)** - 출력은 모든 오류 필드를 포함하며 [JSON](https://yaml.org/) 문자열입니다. 자동화 및 스크립팅을 위해 사용합니다.
+ **[`text`](#cli-error-format-text)** - 텍스트 포맷터를 사용하여 오류를 표시합니다. 빠른 시각적 검토를 위해 사용합니다.
+ **[`table`](#cli-error-format-table)** - 테이블 포맷터를 사용하여 오류를 표시합니다. 빠른 시각적 검토를 위해 사용합니다.
+ **[`legacy`](#cli-error-format-legacy)** - 구조화된 세부 정보가 없는 원래 오류 형식입니다. 이전 버전과의 호환성을 위해 사용합니다.

## 오류 형식 구성
<a name="cli-error-format-configuring"></a>

다음 방법 중 하나를 사용하여 오류 형식을 구성할 수 있습니다.

명령줄 플래그  

```
$ aws <command> --cli-error-format json
```

구성 파일(`~/.aws/config`)  

```
[default]
cli_error_format = json
```

환경 변수  

```
$ export AWS_CLI_ERROR_FORMAT=yaml
```

## 오류 출력 형식
<a name="cli-error-output-formats"></a>

다음 섹션에서 각 형식에 대해 설명합니다.

### 향상된 형식(기본값)
<a name="cli-error-format-enhanced"></a>

향상된 형식은 단순한 값에 대한 추가 세부 정보를 인라인으로 포함하여 오류 메시지를 표시합니다. 복잡한 구조의 경우 이 형식은 JSON 또는 YAML을 사용하라는 힌트를 제공합니다.

**예: 리전 구성 누락**

```
aws: [ERROR]: An error occurred (NoRegion): You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷에 추가 필드가 포함되어 있음**

```
aws: [ERROR]: An error occurred (NoSuchBucket) when calling the GetObject operation: The specified bucket does not exist

Additional error details:
BucketName: amzn-s3-demo-bucket
```

**예: 복잡한 오류 필드**

```
An error occurred (TransactionCanceledException) when calling the TransactWriteItems operation: Transaction cancelled, please refer cancellation reasons for specific reasons [ConditionalCheckFailed, None]

Additional error details:
CancellationReasons: <complex value>
Use "--cli-error-format json" or another error format to see the full details.
```

### JSON 형식
<a name="cli-error-format-json"></a>

JSON 형식은 모든 오류 필드가 포함된 구조화된 표현을 제공합니다.

**예: 리전 구성 누락**

```
{
    "Code": "NoRegion",
    "Message": "You must specify a region. You can also configure your region by running \"aws configure\"."
}
```

**예: 존재하지 않는 S3 버킷**

```
{
    "Code": "NoSuchBucket",
    "Message": "The specified bucket does not exist",
    "BucketName": "amzn-s3-demo-bucket"
}
```

### YAML 형식
<a name="cli-error-format-yaml"></a>

YAML 형식은 모든 오류 필드가 포함된 구조화된 표현을 제공합니다.

**예: 리전 구성 누락**

```
Code: NoRegion
Message: You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷**

```
Code: NoSuchBucket
Message: The specified bucket does not exist
BucketName: amzn-s3-demo-bucket
```

### 날짜 형식
<a name="cli-error-format-text"></a>

텍스트 형식은 성공적인 명령 출력과 동일한 포맷터를 사용합니다.

**예: 존재하지 않는 S3 버킷**

```
amzn-s3-demo-bucket  NoSuchBucket    The specified bucket does not exist
```

### 테이블 형식
<a name="cli-error-format-table"></a>

테이블 형식은 성공적인 명령 출력과 동일한 포맷터를 사용합니다.

**예: 존재하지 않는 S3 버킷**

```
-------------------------------------------------------------------------------------|
|                                       error                                        |
+---------------------------+---------------+----------------------------------------+
|        BucketName         |     Code      |                Message                 |
+---------------------------+---------------+----------------------------------------+
|  amzn-s3-demo-bucket      |  NoSuchBucket |  The specified bucket does not exist   |
+---------------------------+---------------+----------------------------------------+
```

### 레거시 형식
<a name="cli-error-format-legacy"></a>

레거시 형식은 구조화된 세부 정보 없이 원래 오류 형식을 제공합니다. 이 형식에는 CLI 예외에 대한 "오류 발생(ErrorCode):" 접두사가 포함되지 않습니다.

**예: 리전 구성 누락**

```
aws: [ERROR]: You must specify a region. You can also configure your region by running "aws configure".
```

**예: 존재하지 않는 S3 버킷**

```
An error occurred (NoSuchBucket) when calling the GetObject operation: The specified bucket does not exist
```

**참고**  
이제 오류에 CLI 예외의 `aws: [ERROR]:` 접두사가 일관되게 포함됩니다. 이전 버전에서는 경우에 따라 이 접두사가 포함되지 않았습니다.  
다음 예외는 구성된 오류 형식에 관계없이 항상 레거시 형식을 사용합니다.  
`UnknownArgumentError` - 사용 정보를 표시합니다.
키보드 인터럽트(`KeyboardInterrupt`)

## 전체 예제
<a name="cli-error-format-example"></a>

다음 예제에서는 JSON 오류 형식을 사용한 명령을 보여줍니다.

```
$ aws s3api get-object \
    --bucket amzn-s3-demo-bucket \
    --key file.txt out.txt \
    --cli-error-format json
```

출력(stderr):

```
{
    "Code": "NoSuchBucket",
    "Message": "The specified bucket does not exist",
    "BucketName": "amzn-s3-demo-bucket"
}
```

`BucketName` 필드는 Amazon S3 서비스에서 반환하는 모델링된 오류 멤버입니다.

# AWS CLI의 페이지 매김 옵션 사용
<a name="cli-usage-pagination"></a>

이 주제에서는 AWS Command Line Interface(AWS CLI)의 출력에 페이지 번호를 매기는 다양한 방법에 대해 설명합니다.

에서 페이지 매김을 제어하는 방법이 크게 2가지 있습니다AWS CLI
+ [서버 측 페이지 매김 파라미터 사용.](#cli-usage-pagination-serverside)
+ [기본 출력 클라이언트 측 페이징 프로그램 사용](#cli-usage-pagination-clientside).

서버 측 페이지 매김 파라미터가 먼저 처리되고 모든 출력은 클라이언트 측 페이지 매김으로 전송됩니다.

## 서버 측 페이지 매김
<a name="cli-usage-pagination-serverside"></a>

많은 항목 목록을 반환하는 대부분의 명령의 경우, AWS CLI에는 AWS CLI에서 서비스의 API를 호출하여 목록을 채울 때 출력에 포함되는 항목의 수를 제어할 수 있는 여러 옵션이 있습니다. AWS CLI의 서버 측 페이지 매김은 AWS 서비스 API에서 활성화되므로 이러한 옵션은 서비스 API에서 활성화한 경우에만 작동합니다.

**Topics**
+ [--no-paginate](#cli-usage-pagination-nopaginate)
+ [--page-size](#cli-usage-pagination-pagesize)
+ [--max-items](#cli-usage-pagination-maxitems)
+ [--starting-token](#cli-usage-pagination-startingtoken)

기본적으로 AWS CLI는 개별 서비스에 의해 결정된 페이지 크기를 사용하고 사용 가능한 모든 항목을 검색합니다. 예를 들어 Amazon S3의 기본 페이지 크기는 1,000입니다. 3,500개 객체를 포함하는 Amazon S3 버킷에서 `aws s3api list-objects`를 실행할 경우 AWS CLI는 백그라운드에서 서비스별 페이지 매김 로직을 처리하고 최종 출력에 3,500개 객체를 모두 반환하면서 Amazon S3에 대한 4개 호출을 자동으로 작성합니다.

특정 명령에 서버 측 페이지 매김이 있는지에 대한 자세한 내용은 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

### --no-paginate 파라미터를 사용하는 방법
<a name="cli-usage-pagination-nopaginate"></a>

`--no-paginate` 옵션은 클라이언트 측에서 다음 페이지 매김 토큰을 사용 중지합니다. 명령을 사용할 때 기본적으로 AWS CLI는 자동으로 여러 번 호출하여 가능한 모든 결과를 반환해서 페이지 매김을 생성합니다. 각 페이지에 대해 한 번 호출합니다. 페이지 매김을 비활성화하면 AWS CLI가 명령 결과의 첫 페이지에 대해 한 번만 호출합니다.

예를 들어 3,500개의 객체가 포함된 Amazon S3 버킷에서 `aws s3api list-objects`를 실행하는 경우 AWS CLI는 Amazon S3에 대한 첫 번째 호출만 실행하여 최종 출력에서 처음 1,000개의 객체만 반환합니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --no-paginate
{
    "Contents": [
...
```

### --page-size 파라미터를 사용하는 방법
<a name="cli-usage-pagination-pagesize"></a>

많은 리소스에서 list 명령을 실행할 때 문제가 발생할 경우, 기본값 페이지 크기가 너무 크기 때문일 수 있습니다. 이 경우 AWS 서비스에 최대 허용 시간을 초과하는 호출이 이루어지고 "시간 초과" 오류가 발생할 수 있습니다. `--page-size` 옵션을 사용하면 AWS CLI가 각 AWS 서비스 호출로부터 더 적은 수의 항목을 요청하도록 지정할 수 있습니다. AWS CLI는 계속 전체 목록을 검색하지만, 백그라운드에서 더 많은 수의 서비스 API 호출을 수행하고 각 호출마다 더 적은 수의 항목을 검색합니다. 그러면 각각의 호출이 시간 초과 없이 성공할 확률이 높아집니다. 페이지 크기를 변경해도 출력에 영향을 주지 않습니다. 출력을 생성하는 데 필요한 API 호출 수에만 영향을 미칩니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --page-size 100
{
    "Contents": [
...
```

### --max-items 파라미터를 사용하는 방법
<a name="cli-usage-pagination-maxitems"></a>

AWS CLI 출력에 한 번에 더 적은 항목을 포함시키려면 `--max-items` 옵션을 사용합니다. AWS CLI는 이전에 설명한 대로 계속 서비스와 함께 페이지 매김을 처리하지만, 사용자가 지정한 항목 수만 한 번에 출력합니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --max-items 100
{
    "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==",
    "Contents": [
...
```

### --starting-token 파라미터를 사용하는 방법
<a name="cli-usage-pagination-startingtoken"></a>

출력 항목 수(`--max-items`)가 기본 API 호출에서 반환하는 전체 항목 수보다 적을 경우 사용자가 다음 항목 세트를 검색하기 위해 후속 명령에 전달할 수 있도록 출력에 `NextToken`이 포함됩니다. 다음 예제를 통해 앞의 예제에서 반환된 `NextToken` 값을 사용하는 방법을 배우고, 두 번째 백 개 항목을 검색할 수 있습니다.

**참고**  
`--starting-token` 파라미터는 null이거나 비어있을 수 없습니다. 이전 명령이 `NextToken` 값을 반환하지 않으면 반환할 더 이상의 항목이 없는 것이기 때문에 명령을 다시 호출할 필요가 없습니다.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --max-items 100 \
    --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxfQ==
{
    "Contents": [
...
```

지정된 AWS 서비스는 호출할 때마다 같은 순서로 항목이 반환되지는 않습니다. `--page-size` 및 `--max-items`에 서로 다른 값을 지정하면 누락되거나 중복된 항목을 포함해 예상치 못한 결과가 발생할 수 있습니다. 이를 방지하려면 `--page-size` 및 `--max-items`에 동일한 번호를 사용하여 AWS CLI의 페이지 매김을 기본 서비스의 페이지 매김과 동기화하세요. 또한 전체 목록을 검색하고 필요한 구문 분석 작업을 로컬에서 수행할 수 있습니다.

## 클라이언트 측 페이저
<a name="cli-usage-pagination-clientside"></a>

AWS CLI 버전 2에서는 출력에 클라이언트 측 페이저 프로그램을 사용할 수 있습니다. 기본적으로 이 기능은 운영 체제의 기본 페이저 프로그램을 통해 모든 출력을 반환합니다.

우선 순위에 따라 다음과 같은 방법으로 출력 페이저를 지정할 수 있습니다.
+ `default` 또는 명명된 프로파일에서 `config` 파일의 `cli_pager` 설정 사용.
+ `AWS_PAGER` 환경 변수 사용.
+ `PAGER` 환경 변수 사용.

우선 순위에 따라 다음과 같은 방법으로 외부 페이징 프로그램의 모든 사용을 비활성화할 수 있습니다.
+ `--no-cli-pager` 명령줄 옵션을 사용하여 단일 명령 사용에 대해 페이저를 비활성화합니다.
+ `cli_pager` 설정 또는 `AWS_PAGER` 변수를 빈 문자열로 설정합니다.

**Topics**
+ [cli\$1pager](#cli-usage-pagination-clipager)
+ [AWS\$1PAGER](#cli-usage-pagination-awspager)
+ [--no-cli-pager](#cli-usage-pagination-noclipager)
+ [페이저 플래그](#cli-usage-pagination-flags)

### cli\$1pager 설정을 사용하는 방법
<a name="cli-usage-pagination-clipager"></a>

AWS CLI에서 유지되는 파일에 자주 사용되는 구성 설정과 자격 증명을 저장할 수 있습니다. 이름 프로파일의 설정은 `default` 프로파일의 설정보다 우선합니다. 구성 설정에 대한 자세한 내용은 [AWS CLI의 구성 및 보안 인증 파일 설정](cli-configure-files.md) 섹션을 참조하세요.

다음 예제에서는 기본 출력 페이저를 `less` 프로그램으로 설정합니다.

```
[default]
cli_pager=less
```

다음 예제에서는 기본값을 설정하여 페이저 사용을 비활성화합니다.

```
[default]
cli_pager=
```



### AWS\$1PAGER 환경 변수를 설정하는 방법
<a name="cli-usage-pagination-awspager"></a>

다음 예제에서는 기본 출력 페이저를 `less` 프로그램으로 설정합니다. 환경 변수에 대한 자세한 내용은 [AWS CLI에 대한 환경 변수 구성](cli-configure-envvars.md) 섹션을 참조하세요.

------
#### [ Linux and macOS ]

```
$ export AWS_PAGER="less"
```

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

```
C:\> setx AWS_PAGER "less"
```

------

### --no-cli-pager 옵션을 사용하는 방법
<a name="cli-usage-pagination-noclipager"></a>

단일 명령에서 페이저 사용을 비활성화하려면 `--no-cli-pager` 옵션을 사용합니다. 명령줄 옵션에 대한 자세한 내용은 [AWS CLI의 명령줄 옵션](cli-configure-options.md) 섹션을 참조하세요.

```
$ aws s3api list-objects \
    --bucket amzn-s3-demo-bucket \
    --no-cli-pager
{
    "Contents": [
...
```

### 페이저 플래그를 사용하는 방법
<a name="cli-usage-pagination-flags"></a>

페이징 프로그램에서 자동으로 사용할 플래그를 지정할 수 있습니다. 플래그는 사용하는 페이징 프로그램에 따라 다릅니다. 아래의 예제는 일반적인 기본값인 `less` 및 `more`에 대한 것입니다.

------
#### [ Linux and macOS ]

별도로 지정하지 않은 경우 AWS CLI 버전 2에는 기본적으로 `less` 페이저가 사용됩니다. `LESS` 환경 변수가 설정되어 있지 않은 경우 AWS CLI 버전 2는 `FRX` 플래그를 사용합니다. AWS CLI 페이저를 설정할 때 플래그를 지정하여 플래그를 결합할 수 있습니다.

다음 예제에서는 `S` 플래그를 사용합니다. 그런 다음 이 플래그는 기본 `FRX` 플래그와 결합하여 최종 `FRXS` 플래그를 생성합니다.

```
$ export AWS_PAGER="less -S"
```

`FRX` 플래그를 원하지 않으면 해당 플래그를 무효화할 수 있습니다. 다음 예제에서는 `F` 플래그를 무효화하여 최종 `RX` 플래그를 생성합니다.

```
$ export AWS_PAGER="less -+F"
```

`less` 플래그에 대한 자세한 내용은 *manpages.org*에서 [less](http://manpages.org/less/1#options)를 참조하세요.

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

별도로 지정하지 않은 경우 AWS CLI 버전 2에는 기본적으로 `more`가 추가 플래그 없이 사용됩니다.

다음 예제에서는 `/c` 파라미터를 사용합니다.

```
C:\> setx AWS_PAGER "more /c"
```

`more` 플래그에 대한 자세한 내용은 *Microsoft Docs*에서 `[more](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/more)`를 참조하세요.

------

# AWS CLI에서 출력 필터링
<a name="cli-usage-filter"></a>

AWS Command Line Interface(AWS CLI)에는 개별적으로 또는 함께 사용하여 AWS CLI 출력을 필터링할 수 있는 서버 측 필터링과 클라이언트 측 필터링이 둘 다 있습니다. 서버 측 필터링이 먼저 처리되고 클라이언트 측 필터링에 대한 출력을 반환합니다.
+ 서버 측 필터링은 API에서 지원되며, 일반적으로 `--filter` 매개 변수를 사용하여 구현합니다. 이 서비스는 대량 데이터세트에 대한 HTTP 응답 시간을 단축할 수 있는 일치하는 결과만 반환합니다.
+ 클라이언트 측 필터링은 AWS CLI 매개 변수를 사용하여 `--query` 클라이언트에서 지원됩니다. 이 파라미터에는 서버 측 필터링에 없을 수 있는 기능이 있습니다.

**Topics**
+ [서버 측 필터링](#cli-usage-filter-server-side)
+ [클라이언트 측 필터링](#cli-usage-filter-client-side)
+ [서버 측 필터링과 클라이언트 측 필터링 결합](#cli-usage-filter-combining)
+ [추가 리소스](#cli-usage-filter-resources)

## 서버 측 필터링
<a name="cli-usage-filter-server-side"></a>

AWS CLI의 서버 측 필터링은 AWS 서비스 API에서 제공됩니다. AWS 서비스는 필터와 일치하는 HTTP 응답의 레코드만 반환하며, 이렇게 되면 대량 데이터세트에 대한 HTTP 응답 시간을 단축할 수 있습니다. 서버 측 필터링은 서비스 API에 의해 정의되므로, 매개 변수 이름과 함수는 서비스마다 달라집니다. 필터링에 사용되는 몇 가지 일반적인 매개 변수 이름은 다음과 같습니다.
+ `--filter`(예: [ses](https://docs.aws.amazon.com/cli/latest/reference/ses/create-receipt-filter.html) 및 [ce](https://docs.aws.amazon.com/cli/latest/reference/ce/get-cost-and-usage.html)).
+ `--filters`(예: [ec2](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-volumes.html), [autoscaling](https://docs.aws.amazon.com/cli/latest/reference/autoscaling/describe-tags.html) 및 [rds](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-instances.html)).
+ `filter`라는 단어로 시작하는 이름입니다(예: [https://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html](https://docs.aws.amazon.com/cli/latest/reference/dynamodb/scan.html) 명령의 경우 `--filter-expression`).

특정 명령에 서버 측 필터링과 필터링 규칙이 있는지에 대한 자세한 내용은 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

## 클라이언트 측 필터링
<a name="cli-usage-filter-client-side"></a>

AWS CLI은(는) `--query` 매개 변수를 사용하는 기본 제공 JSON 기반 클라이언트 측 필터링 기능을 제공합니다. `--query` 매개 변수는 출력의 내용과 스타일을 사용자 지정하는 데 사용할 수 있는 강력한 도구입니다. `--query` 매개 변수는 서버에서 다시 오는 HTTP 응답을 받아, 결과를 필터링한 후에 이를 표시합니다. 필터링하기 전에 전체 HTTP 응답이 클라이언트로 전송되므로, 클라이언트 측 필터링은 대량 데이터세트에 대한 서버 측 필터링보다 느릴 수 있습니다.

쿼리는 [JMESPath 구문](https://jmespath.org/)을 사용하여 출력을 필터링하는 표현식을 만듭니다. JMESPath 구문에 대해 알아보려면 *JMESPath 웹사이트*에서 [자습서](https://jmespath.org/tutorial.html)를 참조하세요.

**중요**  
지정한 출력 유형에 따라 `--query` 옵션 작동 방식이 변경됩니다.  
`--output text`를 지정하면 `--query` 필터를 적용하기 *전에* 해당 출력이 페이지 매김되며, AWS CLI는 해당 출력의 *각 페이지*에서 해당 쿼리를 한 번 실행합니다. 이로 인해, 쿼리에는 예상치 못한 추가 출력이 발생할 수 있는 각 페이지의 첫 번째 일치하는 요소가 포함됩니다. 출력을 추가로 필터링하려면 `head` 또는 `tail` 등 다른 명령줄 도구를 사용할 수 있습니다.
`--output json`, `--output yaml` 또는 `--output yaml-stream`을 지정하면 해당 출력을 하나의 네이티브 구조로 완전히 처리한 뒤에 `--query` 필터를 적용합니다. AWS CLI은(는) 전체 구조에 대해 한 번만 쿼리를 실행하여 필터링된 결과를 생성한 다음 출력합니다.

**Topics**
+ [시작하기 전에](#cli-usage-filter-client-side-output)
+ [식별자](#cli-usage-filter-client-side-identifiers)
+ [목록에서 선택](#cli-usage-filter-client-side-select-list)
+ [중첩된 데이터 필터링](#cli-usage-filter-client-side-nested)
+ [결과 병합](#cli-usage-filter-client-side-specific-flattening)
+ [특정 값에 대한 필터링](#cli-usage-filter-client-side-specific-values)
+ [파이핑 표현식](#cli-usage-filter-client-side-pipe)
+ [여러 식별자 값에 대한 필터링](#cli-usage-filter-client-side-miltiselect-list)
+ [식별자 값에 레이블 추가](#cli-usage-filter-client-side-multiselect-hash)
+ [함수](#cli-usage-filter-client-side-functions)
+ [고급 `--query` 예제](#cli-usage-filter-client-side-advanced)

### 시작하기 전에
<a name="cli-usage-filter-client-side-output"></a>

**참고**  
이러한 필터 표현식 예제는 기본 Linux와 유사한 쉘에 대해 작성되었습니다. 이 예제를 사용할 때는 터미널 셸에 올바른 인용 규칙을 사용해야 합니다. 터미널이 입력을 해석하는 방식은 AWS CLI로 전송되는 항목을 크게 변경할 수 있습니다. 터미널이 작은따옴표(`'`), 큰따옴표(`"`) 또는 백틱(```)을 읽는 방법은 콘텐츠 읽기 방법을 변경할 수 있습니다.  
자세한 내용은 [AWS CLI에서 문자열에 따옴표와 리터럴 사용](cli-usage-parameters-quoting-strings.md) 섹션을 참조하세요.

다음 JSON 출력은 `--query` 매개 변수가 생성할 수 있는 결과물의 예를 보여줍니다. 이 출력은 별도의 Amazon EC2 인스턴스에 연결된 세 가지 Amazon EBS 볼륨을 설명합니다.

#### 출력 예시
<a name="cli-usage-filter-client-side-output-example"></a>

```
$ aws ec2 describe-volumes
{
  "Volumes": [
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-17T00:55:03.000Z",
          "InstanceId": "i-a071c394",
          "VolumeId": "vol-e11a5288",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-e11a5288",
      "State": "in-use",
      "SnapshotId": "snap-f23ec1c8",
      "CreateTime": "2013-09-17T00:55:03.000Z",
      "Size": 30
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-18T20:26:16.000Z",
          "InstanceId": "i-4b41a37c",
          "VolumeId": "vol-2e410a47",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-2e410a47",
      "State": "in-use",
      "SnapshotId": "snap-708e8348",
      "CreateTime": "2013-09-18T20:26:15.000Z",
      "Size": 8
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2020-11-20T19:54:06.000Z",
          "InstanceId": "i-1jd73kv8",
          "VolumeId": "vol-a1b3c7nd",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-a1b3c7nd",
      "State": "in-use",
      "SnapshotId": "snap-234087fb",
      "CreateTime": "2020-11-20T19:54:05.000Z",
      "Size": 15
    }
  ]
}
```

### 식별자
<a name="cli-usage-filter-client-side-identifiers"></a>

식별자는 출력 값의 레이블입니다. 필터를 만들 때 식별자를 사용하여 쿼리 결과 범위를 좁힙니다. 다음 출력 예제에서는 `Volumes`, `AvailabilityZone`, `AttachTime` 등 모든 식별자가 강조 표시됩니다.

```
$ aws ec2 describe-volumes
{
  "Volumes": [
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-17T00:55:03.000Z",
          "InstanceId": "i-a071c394",
          "VolumeId": "vol-e11a5288",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-e11a5288",
      "State": "in-use",
      "SnapshotId": "snap-f23ec1c8",
      "CreateTime": "2013-09-17T00:55:03.000Z",
      "Size": 30
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2013-09-18T20:26:16.000Z",
          "InstanceId": "i-4b41a37c",
          "VolumeId": "vol-2e410a47",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-2e410a47",
      "State": "in-use",
      "SnapshotId": "snap-708e8348",
      "CreateTime": "2013-09-18T20:26:15.000Z",
      "Size": 8
    },
    {
      "AvailabilityZone": "us-west-2a",
      "Attachments": [
        {
          "AttachTime": "2020-11-20T19:54:06.000Z",
          "InstanceId": "i-1jd73kv8",
          "VolumeId": "vol-a1b3c7nd",
          "State": "attached",
          "DeleteOnTermination": true,
          "Device": "/dev/sda1"
        }
      ],
      "VolumeType": "standard",
      "VolumeId": "vol-a1b3c7nd",
      "State": "in-use",
      "SnapshotId": "snap-234087fb",
      "CreateTime": "2020-11-20T19:54:05.000Z",
      "Size": 15
    }
  ]
}
```

자세한 내용은 *JMESPath 웹사이트*의 [식별자](https://jmespath.org/specification.html#identifiers )를 참조하세요.

### 목록에서 선택
<a name="cli-usage-filter-client-side-select-list"></a>

목록 또는 배열은 `[`의 `Volumes` 및 `Attachments` 등 대괄호 “[시작하기 전에](#cli-usage-filter-client-side-output)” 뒤에 오는 식별자입니다.

**구문**:

```
<listName>[ ]
```

배열의 모든 출력을 필터링하려면 와일드 카드 표기법을 사용할 수 있습니다. [와일드카드](http://jmespath.org/specification.html#wildcard-expressions) 표현식은 `*` 표기법을 사용하여 요소를 반환하는 데 사용되는 표현식입니다.

다음 예제에서는 모든 `Volumes` 내용을 쿼리합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  }
]
```

인덱스별로 배열의 특정 볼륨을 보려면 배열 인덱스를 호출합니다. 예를 들어, `Volumes` 배열의 첫 번째 항목은 인덱스가 0이고 `Volumes[0]` 쿼리가 생성됩니다. 배열 인덱스에 대한 자세한 내용은 *JMESPath 웹 사이트*의 [인덱스 표현식](http://jmespath.org/specification.html#index-expressions)을 참조하세요.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[0]'
{
  "AvailabilityZone": "us-west-2a",
  "Attachments": [
    {
      "AttachTime": "2013-09-17T00:55:03.000Z",
      "InstanceId": "i-a071c394",
      "VolumeId": "vol-e11a5288",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  "VolumeType": "standard",
  "VolumeId": "vol-e11a5288",
  "State": "in-use",
  "SnapshotId": "snap-f23ec1c8",
  "CreateTime": "2013-09-17T00:55:03.000Z",
  "Size": 30
}
```

인덱스별로 특정 범위의 볼륨을 보려면 다음 구문과 함께 `slice`를 사용합니다. 여기서 **start**는 시작 배열 인덱스이고, **stop**은 필터가 처리를 중지하는 인덱스이고, **step**은 건너뛰기 간격입니다.

**구문**:

```
<arrayName>[<start>:<stop>:<step>]
```

다음 항목 중 하나라도 슬라이스 표현식에서 생략된 경우, 다음 기본값을 사용합니다.
+ 시작 - 목록의 첫 번째 인덱스, 0.
+ 중지 - 목록의 마지막 인덱스.
+ 단계 - 건너뛰기 단계 없음. 여기서 값은 1입니다.

처음 두 볼륨만 반환하려면 다음 예제와 같이 시작 값 0, 중지 값 2, 단계 값 1을 사용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[0:2:1]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-18T20:26:16.000Z",
        "InstanceId": "i-4b41a37c",
        "VolumeId": "vol-2e410a47",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-2e410a47",
    "State": "in-use",
    "SnapshotId": "snap-708e8348",
    "CreateTime": "2013-09-18T20:26:15.000Z",
    "Size": 8
  }
]
```

이 예제에는 기본값이 포함되어 있으므로 슬라이스를 `Volumes[0:2:1]`에서 `Volumes[:2]`(으)로 줄일 수 있습니다.

다음 예제에서는 기본값을 생략하고 전체 배열에서 두 볼륨마다 반환합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[::2]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  }
]
```

단계는 다음 예제와 같이 배열의 역순으로 필터링하는 음수를 사용할 수도 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[::-2]'
[
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2020-11-20T19:54:06.000Z",
        "InstanceId": "i-1jd73kv8",
        "VolumeId": "vol-a1b3c7nd",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-a1b3c7nd",
    "State": "in-use",
    "SnapshotId": "snap-234087fb",
    "CreateTime": "2020-11-20T19:54:05.000Z",
    "Size": 15
  },
  {
    "AvailabilityZone": "us-west-2a",
    "Attachments": [
      {
        "AttachTime": "2013-09-17T00:55:03.000Z",
        "InstanceId": "i-a071c394",
        "VolumeId": "vol-e11a5288",
        "State": "attached",
        "DeleteOnTermination": true,
        "Device": "/dev/sda1"
      }
    ],
    "VolumeType": "standard",
    "VolumeId": "vol-e11a5288",
    "State": "in-use",
    "SnapshotId": "snap-f23ec1c8",
    "CreateTime": "2013-09-17T00:55:03.000Z",
    "Size": 30
  }
]
```

자세한 내용은 *JMESPath 웹사이트*의 [슬라이스](https://jmespath.org/specification.html#slices)를 참조하세요.

### 중첩된 데이터 필터링
<a name="cli-usage-filter-client-side-nested"></a>

중첩된 값의 `Volumes[*]` 필터링 범위를 좁히려면 마침표 및 필터 기준을 추가하여 하위 표현식을 사용합니다.

**구문**:

```
<expression>.<expression>
```

다음 예제에서는 모든 볼륨에 대한 모든 `Attachments` 정보를 보여줍니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments'
[
  [
    {
      "AttachTime": "2013-09-17T00:55:03.000Z",
      "InstanceId": "i-a071c394",
      "VolumeId": "vol-e11a5288",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  [
    {
      "AttachTime": "2013-09-18T20:26:16.000Z",
      "InstanceId": "i-4b41a37c",
      "VolumeId": "vol-2e410a47",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ],
  [
    {
      "AttachTime": "2020-11-20T19:54:06.000Z",
      "InstanceId": "i-1jd73kv8",
      "VolumeId": "vol-a1b3c7nd",
      "State": "attached",
      "DeleteOnTermination": true,
      "Device": "/dev/sda1"
    }
  ]
]
```

중첩된 값으로 추가로 필터링하려면 중첩된 각 식별자에 대한 표현식을 추가합니다. 다음 예제에서는 모든 `State`에 대한 `Volumes`이(가) 나와 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[*].State'
[
  [
    "attached"
  ],
  [
    "attached"
  ],
  [
    "attached"
  ]
]
```

### 결과 병합
<a name="cli-usage-filter-client-side-specific-flattening"></a>

자세한 내용은 *JMESPath 웹 사이트*의 [하위 표현식](https://jmespath.org/specification.html#subexpressions)을 참조하세요.

와일드카드 표기법을 제거함으로써 `Volumes[*].Attachments[*].State`에 대한 결과를 병합하여 `Volumes[*].Attachments[].State` 쿼리를 생성할 수 있습니다. 병합은 흔히 결과의 가독성을 높이는 데 유용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].State'
[
  "attached",
  "attached",
  "attached"
]
```

자세한 내용은 *JMESPath 웹사이트*의 [병합](https://jmespath.org/specification.html#flatten)을 참조하세요.

### 특정 값에 대한 필터링
<a name="cli-usage-filter-client-side-specific-values"></a>

목록의 특정 값을 필터링하려면 다음 구문과 같이 필터 표현식을 사용합니다.

**구문**:

```
? <expression> <comparator> <expression>]
```

표현식 비교기에는 `==`, `!=`, `<`, `<=`, `>`, `>=`이(가) 포함됩니다. 다음 예제에서는 `VolumeIds``Volumes`의 모든 `Attached`에 대해 `State`을(를) 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[?State==`attached`].VolumeId'
[
  [
    "vol-e11a5288"
  ],
  [
    "vol-2e410a47"
  ],
  [
    "vol-a1b3c7nd"
  ]
]
```

그런 다음 이를 병합하여 다음 예제처럼 되게 할 수 있습니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[?State==`attached`].VolumeId[]'
[
  "vol-e11a5288",
  "vol-2e410a47",
  "vol-a1b3c7nd"
]
```

다음 예제에서는 크기가 20보다 작은 모든 `VolumeIds`의 `Volumes`을(를) 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?Size < `20`].VolumeId'
[
  "vol-2e410a47",
  "vol-a1b3c7nd"
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [필터 표현식](https://jmespath.org/specification.html#filterexpressions)을 참조하세요.

### 파이핑 표현식
<a name="cli-usage-filter-client-side-pipe"></a>

필터 결과를 새 목록으로 파이핑한 후, 다음 구문을 사용하여 다른 표현식으로 결과를 필터링할 수 있습니다.

**구문**:

```
<expression> | <expression>] 
```

다음 예제에서는 `Volumes[*].Attachments[].InstanceId` 표현식의 필터 결과를 가져와 배열의 첫 번째 결과를 출력합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].InstanceId | [0]'
"i-a071c394"
```

이 예제는 먼저 다음 표현식에서 배열을 생작성하여 이 작업을 수행합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Attachments[].InstanceId'
"i-a071c394",
  "i-4b41a37c",
  "i-1jd73kv8"
```

그런 다음 해당 배열의 첫 번째 요소를 반환합니다.

```
"i-a071c394"
```

자세한 내용은 *JMESPath 웹 사이트*의 [파이프 표현식](https://jmespath.org/specification.html#pipe-expressions)을 참조하세요.

### 여러 식별자 값에 대한 필터링
<a name="cli-usage-filter-client-side-miltiselect-list"></a>

여러 식별자를 필터링하려면 다음 구문을 사용하여 다중 선택 목록을 사용합니다.

**구문**:

```
<listName>[].[<expression>, <expression>]
```

다음 예제에서는 `VolumeId` 및 `VolumeType`이(가) `Volumes` 목록에서 필터링되어 다음 표현식이 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType]'
[
  [
    "vol-e11a5288",
    "standard"
  ],
  [
    "vol-2e410a47",
    "standard"
  ],
  [
    "vol-a1b3c7nd",
    "standard"
  ]
]
```

중첩된 데이터를 목록에 추가하려면 다른 다중 선택 목록을 추가합니다. 다음 예제에서는 중첩 `InstanceId` 목록에서 `State` 및 `Attachments`도 필터링하여 이전 예제를 확장합니다. 그러면 다음과 같은 표현식이 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType, Attachments[].[InstanceId, State]]'
[
  [
    "vol-e11a5288",
    "standard",
    [
      [
        "i-a071c394",
        "attached"
      ]
    ]
  ],
  [
    "vol-2e410a47",
    "standard",
    [
      [
        "i-4b41a37c",
        "attached"
      ]
    ]
  ],
  [
    "vol-a1b3c7nd",
    "standard",
    [
      [
        "i-1jd73kv8",
        "attached"
      ]
    ]
  ]
]
```

더 읽기 쉽게 하려면 다음 예제와 같이 표현식을 병합합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].[VolumeId, VolumeType, Attachments[].[InstanceId, State][]][]'
[
  "vol-e11a5288",
  "standard",
  [
    "i-a071c394",
    "attached"
  ],
  "vol-2e410a47",
  "standard",
  [
    "i-4b41a37c",
    "attached"
  ],
  "vol-a1b3c7nd",
  "standard",
  [
    "i-1jd73kv8",
    "attached"
  ]
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [다중 선택 목록](https://jmespath.org/specification.html#multiselectlist)을 참조하세요.

### 식별자 값에 레이블 추가
<a name="cli-usage-filter-client-side-multiselect-hash"></a>

이 출력을 더 읽기 쉽게 하려면 다음 구문을 사용하여 다중 선택 해시를 사용합니다.

**구문**:

```
<listName>[].{<label>: <expression>, <label>: <expression>}
```

식별자 레이블이 식별자 이름과 같을 필요는 없습니다. 다음 예제에서는 `VolumeType` 값에 `VolumeType` 레이블을 사용합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].{VolumeType: VolumeType}'
[
  {
    "VolumeType": "standard",
  },
  {
    "VolumeType": "standard",
  },
  {
    "VolumeType": "standard",
  }
]
```

간단히, 다음 예제에서는 각 레이블의 식별자 이름을 유지하고 모든 볼륨에 대해 `VolumeId`, `VolumeType`, `InstanceId` 및 `State`을(를) 표시합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}'
[
  {
    "VolumeId": "vol-e11a5288",
    "VolumeType": "standard",
    "InstanceId": "i-a071c394",
    "State": "attached"
  },
  {
    "VolumeId": "vol-2e410a47",
    "VolumeType": "standard",
    "InstanceId": "i-4b41a37c",
    "State": "attached"
  },
  {
    "VolumeId": "vol-a1b3c7nd",
    "VolumeType": "standard",
    "InstanceId": "i-1jd73kv8",
    "State": "attached"
  }
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [다중 선택 해시](https://jmespath.org/specification.html#multiselecthash)를 참조하세요.

### 함수
<a name="cli-usage-filter-client-side-functions"></a>

JMESPath 구문에는 쿼리에 사용할 수 있는 많은 함수가 포함되어 있습니다. JMESPath 함수에 대한 자세한 내용은 *JMESPath 웹 사이트*의 [기본 제공 함수](https://jmespath.org/specification.html#built-in-functions)를 참조하세요.

함수를 쿼리에 통합하는 방법을 보여주기 위해 다음 예제에서는 `sort_by` 함수를 사용합니다. `sort_by` 함수는 다음 구문을 사용하여 표현식을 정렬 키로 사용해 배열을 정렬합니다.

**구문**:

```
sort_by(<listName>, <sort expression>)[].<expression>
```

다음 예제에서는 이전의 [다중 선택 해시 예제](#cli-usage-filter-client-side-multiselect-hash)를 사용하고 `VolumeId`(으)로 출력을 정렬합니다.

```
$ aws ec2 describe-volumes \
    --query 'sort_by(Volumes, &VolumeId)[].{VolumeId: VolumeId, VolumeType: VolumeType, InstanceId: Attachments[0].InstanceId, State: Attachments[0].State}'
[
  {
    "VolumeId": "vol-2e410a47",
    "VolumeType": "standard",
    "InstanceId": "i-4b41a37c",
    "State": "attached"
  },
  {
    "VolumeId": "vol-a1b3c7nd",
    "VolumeType": "standard",
    "InstanceId": "i-1jd73kv8",
    "State": "attached"
  },
  {
    "VolumeId": "vol-e11a5288",
    "VolumeType": "standard",
    "InstanceId": "i-a071c394",
    "State": "attached"
  }
]
```

자세한 내용은 *JMESPath 웹 사이트*의 [sort\$1by](https://jmespath.org/specification.html#sort-by)를 참조하세요.

### 고급 `--query` 예제
<a name="cli-usage-filter-client-side-advanced"></a>

**특정 항목에서 정보를 추출하는 방법**

다음 예제에서는 목록에서 특정 항목을 찾은 다음 해당 항목에서 정보를 추출하는 데 `--query` 파라미터를 사용합니다. 이 예제에서는 지정된 서비스 엔드포인트에 연결된 모든 `AvailabilityZones`을(를) 나열합니다. 지정된 `ServiceDetails`을 가진 `ServiceName` 목록에서 해당 항목을 추출한 다음, 선택한 항목에서 `AvailabilityZones` 필드를 출력합니다.

```
$ aws --region us-east-1 ec2 describe-vpc-endpoint-services \
    --query 'ServiceDetails[?ServiceName==`com.amazonaws.us-east-1.ecs`].AvailabilityZones'
[
    [
        "us-east-1a",
        "us-east-1b",
        "us-east-1c",
        "us-east-1d",
        "us-east-1e",
        "us-east-1f"
    ]
]
```

**지정된 생성 날짜 이후 스냅샷을 표시하는 방법**

다음 예제에서는 출력에 사용 가능한 필드를 몇 개만 포함하여 지정된 날짜 이후에 생성된 모든 스냅샷을 나열하는 방법을 보여줍니다.

```
$ aws ec2 describe-snapshots --owner self \
    --output json \
    --query 'Snapshots[?StartTime>=`2018-02-07`].{Id:SnapshotId,VId:VolumeId,Size:VolumeSize}'
[
    {
        "id": "snap-0effb42b7a1b2c3d4",
        "vid": "vol-0be9bb0bf12345678",
        "Size": 8
    }
]
```

**최신 AMI를 표시하는 방법**

다음 예제에서는 가장 최근에 생성된 5개의 Amazon Machine Image(AMI)를 가장 최근부터 가장 오래된 순으로 정렬하여 나열합니다.

```
$ aws ec2 describe-images \
    --owners self \
    --query 'reverse(sort_by(Images,&CreationDate))[:5].{id:ImageId,date:CreationDate}'
[
    {
        "id": "ami-0a1b2c3d4e5f60001",
        "date": "2018-11-28T17:16:38.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60002",
        "date": "2018-09-15T13:51:22.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60003",
        "date": "2018-08-19T10:22:45.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60004",
        "date": "2018-05-03T12:04:02.000Z"
    },
    {
        "id": "ami-0a1b2c3d4e5f60005",
        "date": "2017-12-13T17:16:38.000Z"
    }
]
```

**비정상 Auto Scaling 인스턴스를 표시하려면**

다음 예제에서는 지정된 AutoScaling 그룹의 비정상 인스턴스에 대한 `InstanceId`만 보여줍니다.

```
$ aws autoscaling describe-auto-scaling-groups \
    --auto-scaling-group-name My-AutoScaling-Group-Name \
    --output text \
    --query 'AutoScalingGroups[*].Instances[?HealthStatus==`Unhealthy`].InstanceId'
```

**지정된 태그가 있는 볼륨을 포함하는 방법**

다음 예제에서는 `test` 태그가 있는 모든 인스턴스에 대해 설명합니다. 볼륨에 연결된 `test` 옆에 또 다른 태그가 있으면, 볼륨은 여전히 결과에 반환됩니다.

아래 표현식은 `test` 태그가 있는 모든 태그를 배열에 반환합니다. `test` 태그가 아닌 모든 태그에는 `null` 값이 포함됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Tags[?Value == `test`]'
```

**지정된 태그가 있는 볼륨을 제외하는 방법**

다음 예제에서는 `test` 태그가 없는 모든 인스턴스에 대해 설명합니다. 볼륨에 여러 태그가 있을 수 있으므로 단순 `?Value != `test`` 표현식을 사용하면 볼륨을 제외하지 않습니다. 볼륨에 연결된 `test` 옆에 또 다른 태그가 있으면, 볼륨은 여전히 결과에 반환됩니다.

`test` 태그가 있는 모든 볼륨을 제외하려면 아래 표현식으로 시작하여 `test` 태그가 있는 모든 태그를 배열에 반환합니다. `test` 태그가 아닌 모든 태그에는 `null` 값이 포함됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[*].Tags[?Value == `test`]'
```

그런 다음 `test` 함수를 사용하여 모든 양의 `not_null` 결과를 필터링합니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?!not_null(Tags[?Value == `test`].Value)]'
```

결과를 파이핑하여 결과를 병합하면 다음 쿼리가 생성됩니다.

```
$ aws ec2 describe-volumes \
    --query 'Volumes[?!not_null(Tags[?Value == `test`].Value)] | []'
```

## 서버 측 필터링과 클라이언트 측 필터링 결합
<a name="cli-usage-filter-combining"></a>

서버 측 필터링과 클라이언트 측 필터링을 함께 사용할 수 있습니다. 서버 측 필터링이 먼저 완료되어, `--query` 매개 변수가 필터링하는 데이터를 클라이언트로 보냅니다. 대량 데이터세트를 사용하는 경우, 먼저 서버 측 필터링을 사용하면 클라이언트 측 필터링이 제공하는 강력한 사용자 지정을 유지하면서 각 AWS CLI 호출에 대해 클라이언트로 전송되는 데이터 양을 줄일 수 있습니다.

다음 예제에서는 서버 측 필터링과 클라이언트 측 필터링을 둘 다 사용하는 Amazon EC2 볼륨을 나열합니다. 이 서비스는 `us-west-2a` 가용 영역에서 연결된 모든 볼륨의 목록을 필터링합니다. `--query` 파라미터는 또한 출력을 50보다 큰 `Size` 값을 가진 볼륨으로만 제한하며 사용자 정의 이름으로 지정된 필드만 표시합니다.

```
$ aws ec2 describe-volumes \
    --filters "Name=availability-zone,Values=us-west-2a" "Name=status,Values=attached" \
    --query 'Volumes[?Size > `50`].{Id:VolumeId,Size:Size,Type:VolumeType}'
[
    {
        "Id": "vol-0be9bb0bf12345678",
        "Size": 80,
        "VolumeType": "gp2"
    }
]
```

다음 예제에서는 여러 기준을 충족하는 이미지의 목록을 가져옵니다. 그런 다음 `--query` 파라미터를 사용하여 `CreationDate`를 기준으로 출력을 정렬하고 가장 최근 항목만 선택합니다. 마지막으로 해당 이미지의 `ImageId`를 표시합니다.

```
$ aws ec2 describe-images \
    --owners amazon \
    --filters "Name=name,Values=amzn*gp2" "Name=virtualization-type,Values=hvm" "Name=root-device-type,Values=ebs" \
    --query "sort_by(Images, &CreationDate)[-1].ImageId" \
    --output text
ami-00ced3122871a4921
```

다음 예제에서는 `length`로 목록의 항목 수를 계산하여 1000 IOPS 이상인 사용 가능한 볼륨 수를 표시합니다.

```
$ aws ec2 describe-volumes \
    --filters "Name=status,Values=available" \
    --query 'length(Volumes[?Iops > `1000`])'
3
```

다음 예시에서는 CloudFormation 스택을 사용하는 지정된 AWS 리전에서 시작 구성을 사용하는 Auto Scaling 그룹의 이름을 검색합니다.

```
$ aws autoscaling describe-auto-scaling-groups --region us-west-2 \
  --filters Name=tag-key,Values=aws:cloudformation:stack-name \
  --query 'AutoScalingGroups[?LaunchConfigurationName!=`null`].AutoScalingGroupName'
[
    "group-1",
    "group-2",
    "group-3"
]
```

## 추가 리소스
<a name="cli-usage-filter-resources"></a>

**AWS CLI 자동 프롬프트**  
필터 표현식 사용을 시작할 때 AWS CLI 버전 2에서 자동 프롬프트 기능을 사용할 수 있습니다. 자동 프롬프트 기능은 **F5** 키를 누를 때 미리 보기를 제공합니다. 자세한 내용은 [AWS CLI에서 명령 프롬프트 활성화 및 사용](cli-usage-parameters-prompting.md) 섹션을 참조하세요.

**JMESPath Terminal**  
JMESPath Terminal은 클라이언트 측 필터링에 사용되는 JMESPath 표현식을 실험하는 대화형 터미널 명령입니다. `jpterm` 명령을 사용하면 사용자가 입력할 때 터미널에 즉시 쿼리 결과가 표시됩니다. AWS CLI 출력을 터미널에 직접 파이핑하여 고급 쿼리 실험을 할 수 있습니다.  
다음 예제에서는 `aws ec2 describe-volumes` 출력을 JMESPath Terminal에 직접 파이핑합니다.  

```
$ aws ec2 describe-volumes | jpterm
```
JMESPath Terminal 및 설치 지침에 대한 자세한 내용은 *GitHub*의 [JMESPath Terminal](https://github.com/jmespath/jmespath.terminal)을 참조하세요.

**jq 유틸리티**  
`jq` 유틸리티는 클라이언트 측의 출력을 사용자가 원하는 출력 형식으로 변환하는 방법을 제공합니다. `jq` 및 설치 지침에 대한 자세한 내용은 *GitHub*의 [jq](https://stedolan.github.io/jq/)를 참조하세요.

# AWS CLI의 명령줄 반환 코드
<a name="cli-usage-returncodes"></a>

반환 코드는 대개 명령의 상태를 설명하는 AWS Command Line Interface(AWS CLI) 명령을 실행한 후 전송되는 숨겨진 코드입니다. `echo` 명령을 사용하여 마지막 AWS CLI 명령에서 보낸 코드를 표시하고, 이러한 코드를 사용하여 명령이 성공했는지 또는 실패했는지, 명령에 오류가 있는 이유를 확인할 수 있습니다. 반환 코드 외에도 `--debug` 스위치로 명령을 실행하여 실패에 대한 자세한 정보를 볼 수 있습니다. 이렇게 하면 AWS CLI가 명령을 처리하기 위해 사용하는 단계와 각 단계의 결과가 포함된 세부 보고서가 생성됩니다.

AWS CLI 명령의 반환 코드를 확인하려면 CLI 명령을 실행한 즉시 다음 명령 중 하나를 실행합니다.

------
#### [ Linux and macOS ]

```
$ echo $?
0
```

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

```
PS> echo $lastexitcode
0
```

------
#### [ Windows Command Prompt ]

```
C:\> echo %errorlevel%
0
```

------

다음은 AWS Command Line Interface (AWS CLI) 명령의 실행이 끝났을 때 반환될 수 있는 반환 코드 값입니다.


| 코드 | 의미 | 
| --- | --- | 
| 0 |  서비스가 HTTP 응답 상태 코드 200으로 응답했습니다. 이는 요청이 전송된 AWS CLI 및 AWS 서비스에서 발생한 오류가 없음을 나타냅니다.  | 
| 1 |  하나 이상의 Amazon S3 전송 작업이 실패했습니다. *S3 명령으로 제한됩니다.*  | 
| 2 |  이 반환 코드의 의미는 명령에 따라 달라집니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-usage-returncodes.html)  | 
| 130 |  SIGINT에 의해 명령이 중단되었습니다. 이것은 `Ctrl`\$1`C`로 명령을 취소하기 위해 사용자가 보낸 신호입니다.  | 
| 252 |  명령 구문이 잘못되었거나 알 수 없는 파라미터가 제공되었거나 파라미터 값이 잘못되어 명령이 실행되지 않습니다.  | 
| 253 |  시스템 환경 또는 구성이 잘못되었습니다. 제공된 명령이 구문적으로 유효할 수 있지만 구성 또는 보안 인증 정보가 누락되어 명령이 실행되지 않습니다.  | 
| 254 |  명령이 구문 분석되었고 지정된 서비스에 대한 요청이 생성되었지만 서비스에서 오류를 반환했습니다. 이는 일반적으로 잘못된 API 사용이나 기타 서비스 관련 문제를 나타냅니다.  | 
| 255 |  명령이 실패했습니다. 요청이 전송된 AWS CLI 또는 AWS 서비스에서 오류가 생성되었습니다.  | 

# AWS CLI에서 사용자 지정 마법사를 사용하여 에서 대화형 명령 실행
<a name="cli-usage-wizard"></a>

AWS Command Line Interface(AWS CLI)에서는 일부 명령에 마법사를 사용할 수 있습니다. 사용 가능한 AWS CLI 마법사의 전체 목록을 기고하거나 보려면 GitHub의 [AWS CLI 마법사 폴더](https://github.com/aws/aws-cli/tree/v2/awscli/customizations/wizard/wizards)를 참조하세요.

## 작동 방식
<a name="cli-usage-wizard-how"></a>

AWS 콘솔과 마찬가지로 AWS CLI에도 AWS 리소스 관리를 안내하는 UI 마법사가 있습니다. 마법사를 사용하려면 명령의 서비스 이름 뒤에서 `wizard` 하위 명령과 마법사 이름을 호출합니다. 명령 구조는 다음과 같습니다.

**구문:**

```
$ aws <command> wizard <wizardName>
```

다음 예제에서는 마법사를 호출하여 새 `dynamodb` 테이블을 생성합니다.

```
$ aws dynamodb wizard new-table
```

`aws configure`는 마법사 이름이 없는 유일한 마법사입니다. 마법사를 실행할 때 다음 예제와 같이 `aws configure wizard` 명령을 실행합니다.

```
$ aws configure wizard
```

마법사를 호출하면 셸의 양식이 표시됩니다. 각 파라미터에 대해 선택할 옵션 리스트가 제공되거나 문자열을 입력하라는 메시지가 표시됩니다. 목록에서 선택하려면 위쪽 및 아래쪽 화살표 키를 사용하고 **ENTER**키를 누릅니다. 옵션에 대한 세부 정보를 보려면 오른쪽 화살표 키를 누릅니다. 파라미터 채우기를 마쳤으면 **ENTER** 키를 누릅니다.

```
$ aws configure wizard
What would you like to configure
> Static Credentials
  Assume Role
  Process Provider
  Additional CLI configuration
Enter the name of the profile: 
Enter your Access Key Id: 
Enter your Secret Access Key:
```

이전 프롬프트를 편집하려면 **SHIFT** \$1 **TAB** 키를 사용합니다. 일부 마법사의 경우 모든 프롬프트를 채운 후 정보가 입력된 AWS CloudFormation 템플릿 또는 AWS CLI 명령을 미리 볼 수 있습니다. 이 미리 보기 모드는 AWS CLI 및 서비스 API를 배우고 스크립트용 템플릿을 생성하는 데 유용합니다.

미리 본 후 **ENTER** 키를 누르거나 마지막 프롬프트를 눌러 최종 명령을 실행합니다.

```
$ aws configure wizard
What would you like to configure
Enter the name of the profile: testWizard
Enter your Access Key Id: AB1C2D3EF4GH5I678J90K
Enter your Secret Access Key: ab1c2def34gh5i67j8k90l1mnop2qr3s45tu678v90
<ENTER>
```

# AWS CLI에서 별칭 생성 및 사용
<a name="cli-usage-alias"></a>

별칭은 자주 사용하는 명령이나 스크립트를 단축하기 위해 AWS Command Line Interface(AWS CLI)에서 생성할 수 있는 바로 가기입니다. 구성 폴더에 있는 `alias` 파일에서 별칭을 생성합니다.

**Topics**
+ [사전 조건](#cli-usage-alias-prepreqs)
+ [1단계: 별칭 파일 생성](#cli-usage-alias-create-file)
+ [2단계: 별칭 생성](#cli-usage-alias-create-alias)
+ [3단계: 별칭 호출](#cli-usage-alias-call-alias)
+ [별칭 리포지토리 예제](#cli-usage-alias-examples)
+ [리소스](#cli-usage-alias-references)

## 사전 조건
<a name="cli-usage-alias-prepreqs"></a>

별칭 명령을 사용하려면 다음을 완료해야 합니다.
+ AWS CLI를 설치하고 구성합니다. 자세한 내용은 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 및 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.
+ 최소 AWS CLI 버전 1.11.24 또는 2.0.0을 사용합니다.
+ (선택 사항) AWS CLI 별칭 bash 스크립트를 사용하려면 bash 호환 터미널을 사용해야 합니다.

## 1단계: 별칭 파일 생성
<a name="cli-usage-alias-create-file"></a>

`alias` 파일을 생성하려면 파일 탐색 및 텍스트 편집기를 사용하거나 단계별 절차를 사용하여 원하는 터미널을 사용할 수 있습니다. 별칭 파일을 빠르게 생성하려면 다음 명령 블록을 사용합니다.

------
#### [ Linux and macOS ]

```
$ mkdir -p ~/.aws/cli
$ echo '[toplevel]' > ~/.aws/cli/alias
```

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

```
C:\> md %USERPROFILE%\.aws\cli
C:\> echo [toplevel] > %USERPROFILE%/.aws/cli/alias
```

------

**별칭 파일을 생성하는 방법**

1. AWS CLI 구성 폴더에 이름이 `cli`인 폴더를 생성합니다. 기본적으로 구성 폴더는 `~/.aws/`(Linux 또는 macOS) 및 `%USERPROFILE%\.aws\`(Windows)에 있습니다. 파일 탐색을 통해 또는 다음 명령을 사용하여 생성할 수 있습니다.

------
#### [ Linux and macOS ]

   ```
   $ mkdir -p ~/.aws/cli
   ```

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

   ```
   C:\> md %USERPROFILE%\.aws\cli
   ```

------

   결과로 생성되는 `cli` 폴더의 기본 경로는 `~/.aws/cli/`(Linux 또는 macOS) 및 `%USERPROFILE%\.aws\cli`(Windows)입니다.

1. `cli` 폴더에서 확장자 없이 이름이 `alias`인 텍스트 파일을 생성하고 첫 번째 줄에 `[toplevel]`을 추가합니다. 원하는 텍스트 편집기를 통해 또는 다음 명령을 사용하여 이 파일을 생성할 수 있습니다.

------
#### [ Linux and macOS ]

   ```
   $ echo '[toplevel]' > ~/.aws/cli/alias
   ```

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

   ```
   C:\> echo [toplevel] > %USERPROFILE%/.aws/cli/alias
   ```

------

## 2단계: 별칭 생성
<a name="cli-usage-alias-create-alias"></a>

기본 명령이나 bash 스크립팅을 사용하여 별칭을 생성할 수 있습니다.

### 기본 명령 별명 생성
<a name="cli-usage-alias-create-alias-basic"></a>

이전 단계에서 생성한 `alias` 파일에서 다음 구문을 사용해 명령을 추가하여 별칭을 생성할 수 있습니다.

**구문**:

```
aliasname = command [--options]
```

*aliasname*은 별칭을 말합니다. *command*는 호출할 명령이며, 다른 별칭을 포함할 수 있습니다. 별칭에 옵션 또는 파라미터를 포함하거나 별칭을 호출할 때 추가할 수 있습니다.

다음 예제에서는 [https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html) 명령을 사용하여 이름이 `aws whoami`인 별칭을 생성합니다. 이 별칭은 기존 AWS CLI 명령을 호출하므로 `aws` 접두사 없이 명령을 작성할 수 있습니다.

```
whoami = sts get-caller-identity
```

다음 예제에서는 이전 `whoami` 예제를 사용하여 `Account` 필터 및 텍스트 `output` 옵션을 추가합니다.

```
whoami2 = sts get-caller-identity --query Account --output text
```

### 하위 명령 별칭 만들기
<a name="cli-usage-alias-create-alias-sub-command"></a>

**참고**  
하위 명령 별칭 기능을 사용하려면 최소 AWS CLI 버전 1.11.24 또는 2.0.0이 필요합니다.

이전 단계에서 생성한 `alias` 파일에서 다음 구문을 사용해 명령을 추가하여 하위 명령 별칭을 생성할 수 있습니다.

**구문**:

```
[command commandGroup]
aliasname = command [--options]
```

*CommandGroup*은 명령 네임스페이스입니다. 예를 들어 `aws ec2 describe-regions` 명령은 `ec2` 명령 그룹 아래에 있습니다. *aliasname*은 별칭을 말합니다. *command*는 호출할 명령이며, 다른 별칭을 포함할 수 있습니다. 별칭에 옵션 또는 파라미터를 포함하거나 별칭을 호출할 때 추가할 수 있습니다.

다음 예제에서는 [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-regions.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-regions.html) 명령을 사용하여 이름이 `aws ec2 regions`인 별칭을 생성합니다. 이 별칭은 `ec2` 명령 네임스페이스 아래의 기존 AWS CLI 명령을 호출하므로 `aws ec2` 접두사 없이 명령을 작성할 수 있습니다.

```
[command ec2]
regions = describe-regions --query Regions[].RegionName
```

명령 네임스페이스 외부의 명령에서 별칭을 만들려면 전체 명령 앞에 느낌표를 붙입니다. 다음 예제에서는 [https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html](https://docs.aws.amazon.com/cli/latest/reference/iam/list-instance-profiles.html) 명령을 사용하여 이름이 `aws ec2 instance-profiles`인 별칭을 생성합니다.

```
[command ec2]
instance-profiles = !aws iam list-instance-profiles
```

**참고**  
별칭은 기존 명령 네임스페이스만 사용하며 새 명령 네임스페이스를 만들 수 없습니다. 예를 들어 `johnsmith` 명령 네임스페이스가 이미 존재하지 않으므로 `[command johnsmith]` 섹션을 사용하여 별칭을 만들 수 없습니다.

### bash 스크립팅 별칭 생성
<a name="cli-usage-alias-create-alias-scripting"></a>

**주의**  
AWS CLI 별칭 bash 스크립트를 사용하려면 bash 호환 터미널을 사용해야 합니다.

다음 구문을 사용하여 고급 프로세스에 대한 bash 스크립트를 사용하여 별칭을 생성할 수 있습니다.

**구문**:

```
aliasname = 
    !f() {
        script content
}; f
```

*aliasname*은 별칭을 말하며, *script content*는 별칭을 호출할 때 실행하려는 스크립트입니다.

다음 예제에서는 `opendns`를 사용하여 현재 IP 주소를 출력합니다. 다른 별칭에서 별칭을 사용할 수 있으므로 다음 `myip` 별칭은 다른 별칭 내 IP 주소에 대한 액세스를 허용하거나 취소하는 데 유용합니다.

```
myip =
  !f() {
    dig +short myip.opendns.com @resolver1.opendns.com
  }; f
```

다음 스크립트 예제에서는 이전 `aws myip` 별칭을 호출하여 Amazon EC2 보안 그룹 수신에 대한 IP 주소를 인증합니다.

```
authorize-my-ip =
  !f() {
    ip=$(aws myip)
    aws ec2 authorize-security-group-ingress --group-id ${1} --cidr $ip/32 --protocol tcp --port 22
  }; f
```

bash 스크립팅을 사용하는 별칭을 호출하면 변수는 항상 입력한 순서대로 전달됩니다. bash 스크립팅에서 변수 이름은 고려하지 않고 나타나는 순서만 고려합니다. 다음 `textalert` 별칭 예제에서 `--message` 옵션에 대한 변수는 첫 번째이고 `--phone-number` 옵션은 두 번째입니다.

```
textalert =
  !f() {
    aws sns publish --message "${1}" --phone-number ${2}
  }; f
```

## 3단계: 별칭 호출
<a name="cli-usage-alias-call-alias"></a>

`alias` 파일에서 생성한 별칭을 실행하려면 다음 구문을 사용합니다. 별칭을 호출할 때 추가 옵션을 추가할 수 있습니다.

**구문**:

```
$ aws aliasname
```

다음 예제에서는 `aws whoami` 명령 별칭을 사용합니다.

```
$ aws whoami
{
    "UserId": "A12BCD34E5FGHI6JKLM",
    "Account": "1234567890987",
    "Arn": "arn:aws:iam::1234567890987:user/userName"
}
```

다음 예제에서는 `aws whoami` 별칭을 추가 옵션과 함께 사용하여 `Account` 출력에서 `text` 번호만 반환합니다.

```
$ aws whoami --query Account --output text
1234567890987
```

다음 예제에서는 `aws ec2 regions`[ 하위 명령 별칭](#cli-usage-alias-create-alias-sub-command)을 사용합니다.

```
$ aws ec2 regions
[
    "ap-south-1",
    "eu-north-1",
    "eu-west-3",
    "eu-west-2",
...
```

### bash 스크립팅 변수를 사용하여 별칭 호출
<a name="cli-usage-alias-call-alias-variables"></a>

bash 스크립팅을 사용하는 별칭을 호출하면 변수는 입력한 순서대로 전달됩니다. bash 스크립팅에서 변수 이름은 고려하지 않고 나타나는 순서만 고려합니다. 예를 들어, 다음 `textalert` 별칭에서 `--message` 옵션에 대한 변수는 첫 번째이고 `--phone-number`는 두 번째입니다.

```
textalert =
  !f() {
    aws sns publish --message "${1}" --phone-number ${2}
  }; f
```

`textalert` 별칭을 호출할 때 별칭에서 실행되는 동일한 순서로 변수를 전달해야 합니다. 다음 예제에서는 `$message` 및 `$phone` 변수를 사용합니다. `$message` 변수는 `${1}` 옵션에서 `--message`(으)로 전달되고, `$phone` 변수는 `${2}` 옵션에서 `--phone-number`(으)로 전달됩니다. 이렇게 하면 `textalert` 별칭을 호출하여 메시지를 보낼 수 있습니다.

```
$ aws textalert $message $phone
{
    "MessageId": "1ab2cd3e4-fg56-7h89-i01j-2klmn34567"
}
```

다음 예제에서는 `$phone` 및 `$message`에 대한 별칭을 호출할 때 순서가 전환됩니다. `$phone` 변수는 `${1}` 옵션에서 `--message`(으)로 전달되고, `$message` 변수는 `${2}` 옵션에서 `--phone-number`(으)로 전달됩니다. 변수 순서가 잘못되었으므로 별칭이 변수를 잘못 전달합니다. 이 경우 `$message` 콘텐츠가 `--phone-number` 옵션의 전화번호 형식 요구 사항과 일치하지 않으므로 오류가 발생합니다.

```
$ aws textalert $phone $message
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

Unknown options: text
```

## 별칭 리포지토리 예제
<a name="cli-usage-alias-examples"></a>

*GitHub*의 [AWS CLI 별칭 리포지토리](https://github.com/awslabs/awscli-aliases)에는 AWS CLI 개발자 팀 및 커뮤니티에서 생성한 AWS CLI 별칭 예제가 포함되어 있습니다. 전체 `alias` 파일 예제를 사용하거나 직접 사용할 개별 별칭을 사용할 수 있습니다.

**주의**  
이 섹션의 명령을 실행하면 기존 `alias` 파일이 삭제됩니다. 기존 별칭 파일을 덮어쓰지 않으려면 다운로드 위치를 변경합니다.

**리포지토리에서 별칭을 사용하는 방법**

1. Git를 설치합니다. 설치 지침은 *Git 설명서*에서 [Getting Started - Installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)를 참조하세요.

1. `jp` 명령을 설치합니다. `jp` 명령은 `tostring` 별칭에 사용됩니다. 설치 지침은 *GitHub*에서 [JMESPath (jp) README.md](https://github.com/jmespath/jp)를 참조하세요.

1. `jq` 명령을 설치합니다. `jq` 명령은 `tostring-with-jq` 별칭에 사용됩니다. 설치 지침은 *GitHub*에서 [JSON processor (jq)](https://stedolan.github.io/jq/download/)를 참조하세요.

1. 다음 중 하나를 수행하여 `alias` 파일을 다운로드합니다.
   + 리포지토리에서 다운로드한 다음 명령을 실행하여 `alias` 파일을 구성 폴더에 복사합니다.

------
#### [ Linux and macOS ]

     ```
     $ git clone https://github.com/awslabs/awscli-aliases.git
     $ mkdir -p ~/.aws/cli
     $ cp awscli-aliases/alias ~/.aws/cli/alias
     ```

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

     ```
     C:\> git clone https://github.com/awslabs/awscli-aliases.git
     C:\> md %USERPROFILE%\.aws\cli
     C:\> copy awscli-aliases\alias %USERPROFILE%\.aws\cli
     ```

------
   + 리포지토리에서 직접 다운로드하여 AWS CLI 구성 폴더의 `cli` 폴더에 저장합니다. 기본적으로 구성 폴더는 `~/.aws/`(Linux 또는 macOS) 및 `%USERPROFILE%\.aws\`(Windows)에 있습니다.

1. 별칭이 작동하는지 확인하려면 다음 별칭을 실행합니다.

   ```
   $ aws whoami
   ```

   그러면 `aws sts get-caller-identity` 명령과 동일한 응답이 표시됩니다.

   ```
   {
       "Account": "012345678901",
       "UserId": "AIUAINBADX2VEG2TC6HD6",
       "Arn": "arn:aws:iam::012345678901:user/myuser"
   }
   ```

## 리소스
<a name="cli-usage-alias-references"></a>
+ *GitHub*의 [AWS CLI 별칭 리포지토리](https://github.com/awslabs/awscli-aliases)에는 AWS CLI 개발자 팀 및 AWS CLI 커뮤니티의 기여로 생성된 AWS CLI 별칭 예제가 포함되어 있습니다.
+ *YouTube*의 [AWS re:Invent 2016: The Effective AWS CLI User](https://www.youtube.com/watch?t=1590&v=Xc1dHtWa9-Q)에서 별칭 기능 발표 
+ [https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html](https://docs.aws.amazon.com/cli/latest/reference/sts/get-caller-identity.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html](https://docs.aws.amazon.com/cli/latest/reference/sns/publish.html)

# AWS CLI에 대한 오류 문제 해결
<a name="cli-chap-troubleshooting"></a>

이 섹션에서는 문제를 해결하기 위해 따라야 할 일반적인 오류와 문제 해결 단계를 다룹니다. 먼저 [일반 문제 해결](#tshoot-general)을 따르는 것이 좋습니다.

**Contents**
+ [먼저 시도해야 할 일반적인 문제 해결](#tshoot-general)
  + [AWS CLI 명령 형식 확인](#general-formatting)
  + [AWS CLI 명령이 사용 중인 AWS 리전 확인](#general-region)
  + [최신 버전의 AWS CLI를 실행 중인지 확인합니다.](#general-latest)
  + [`--debug` 옵션 사용](#general-debug)
  + [AWS CLI 명령 기록 로그 활성화 및 검토](#tshoot-general-history)
  + [AWS CLI가 구성되었는지 확인](#tshoot-general-config)
+ [명령을 찾을 수 없음 오류](#tshoot-install-not-found)
+ ['`aws --version`' 명령이 설치한 버전과 다른 버전을 반환함](#tshoot-install-wrong-version)
+ [AWS CLI를 제거한 후 '`aws --version`' 명령이 버전을 반환함](#tshoot-uninstall-1)
+ [AWS CLI에서 불완전한 파라미터 이름을 가진 명령을 처리했습니다.](#tshoot-parameter-abbrev)
+ [액세스 거부 오류](#tshoot-access-denied)
+ [잘못된 보안 인증 정보 및 키 오류](#tshoot-permissions-wrongcreds)
+ [서명 불일치 오류](#tshoot-signature-does-not-match)
+ [SSL 인증서 오류](#tshoot-certificate-verify-failed)
+ [잘못된 JSON 오류](#tshoot-invalid-json)
+ [추가 리소스](#tshoot-resources)

## 먼저 시도해야 할 일반적인 문제 해결
<a name="tshoot-general"></a>

AWS CLI에서 오류 메시지가 표시되거나 문제가 발생할 경우 문제를 해결하는 데 도움이 되는 다음과 같은 일반적인 팁을 따르는 것이 좋습니다.

[맨 위로 이동](#cli-chap-troubleshooting-top)

### AWS CLI 명령 형식 확인
<a name="general-formatting"></a>

명령이 존재하지 않는다는 오류가 발생하거나 명령이 설명서에서 사용 가능하다고 나열된 파라미터(`Parameter validation failed`)를 인식하지 못하는 오류가 발생할 경우 명령 형식이 잘못되었을 수 있습니다. 다음을 확인하는 것이 좋습니다.
+ 명령에서 맞춤법 및 형식 오류가 있는지 확인합니다.
+ 명령에서 [해당 터미널에 적용되는 모든 따옴표와 이스케이프](cli-usage-parameters-quoting-strings.md)가 올바른지 확인합니다.
+ [AWS CLI 스켈레톤](cli-usage-skeleton.md)을 생성하여 명령 구조를 확인합니다.
+ JSON의 경우 추가로 [JSON 값에 대한 문제 해결](#tshoot-invalid-json)을 참조하세요. 터미널 처리 JSON 형식에 문제가 있는 경우 [Blob를 사용하여 JSON 데이터를 AWS CLI에 직접 전달](cli-usage-parameters-types.md#parameter-type-blob)함으로써 터미널의 인용 규칙을 건너뛰는 것이 좋습니다.

특정 명령을 구성하는 방법에 대한 자세한 내용은 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)를 참조하세요.

[맨 위로 이동](#cli-chap-troubleshooting-top)

### AWS CLI 명령이 사용 중인 AWS 리전 확인
<a name="general-region"></a>

**참고**  
AWS CLI를 사용하여 명시적으로 또는 기본 리전을 설정하여 AWS 리전 리전을 지정해야 합니다. 지정할 수 있는 모든 AWS 리전 목록은 **Amazon Web Services 일반 참조의 [AWS 리전 및 엔드포인트](https://docs.aws.amazon.com/general/latest/gr/rande.html)를 참조하세요. AWS CLI에서 사용하는 AWS Management Console 표기는 AWS 리전 URL 및 서비스 엔드포인트에서 사용하는 것과 동일한 이름입니다.

지정한 AWS 리전에서 AWS 서비스를 사용할 수 없거나 리소스가 다른 AWS 리전에 있는 경우 오류 또는 예기치 않은 결과가 발생할 수 있습니다. AWS 리전은 우선 순위에 따라 다음과 같은 방식으로 설정됩니다.
+ `--region` 명령줄 옵션
+ SDK 호환 `AWS\$1REGION` 환경 변수입니다.
+ `AWS\$1DEFAULT\$1REGION` 환경 변수.
+ [`region`](cli-configure-files.md#cli-config-region) 프로파일 설정입니다.

리소스에 대해 올바른 AWS 리전을 사용하고 있는지 확인하세요.

[맨 위로 이동](#cli-chap-troubleshooting-top)

### 최신 버전의 AWS CLI를 실행 중인지 확인합니다.
<a name="general-latest"></a>

명령이 존재하지 않는다는 오류가 발생하거나 명령이 [AWS CLI 버전 2 참조 가이드](https://docs.aws.amazon.com/cli/latest/reference/index.html)에서 사용 가능하다고 나열된 파라미터를 인식하지 못하는 오류가 발생할 경우 먼저 명령 형식이 올바른지 확인합니다. 형식이 올바른 경우 AWS CLI의 최신 버전으로 업그레이드하는 것이 좋습니다. 업데이트된 AWS CLI 버전은 업무일 기준으로 거의 매일 릴리스됩니다. 새로운 AWS 서비스, 기능 및 파라미터가 이러한 새 버전의 AWS CLI에 반영됩니다. 새로운 서비스, 기능 또는 파라미터에 액세스할 수 있는 유일한 방법은 해당 요소가 도입된 이후 릴리스된 버전으로 업그레이드하는 것입니다.

에 설명된 대로 AWS CLI의 버전 업데이트 방법은 원래 설치 방법에 따라 달라집니다..[최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md)

번들 설치 관리자 중 하나를 사용한 경우 운영 체제에 적합한 최신 버전을 다운로드하여 설치하기 전에 기존 설치를 제거해야 할 수 있습니다.

[맨 위로 이동](#cli-chap-troubleshooting-top)

### `--debug` 옵션 사용
<a name="general-debug"></a>

AWS CLI에서 즉시 파악되지 않는 오류를 보고하거나 예상치 못한 결과를 생성하는 경우 `--debug` 옵션과 함께 명령을 다시 실행하여 오류에 대한 자세한 정보를 얻을 수 있습니다. 이 옵션을 사용하면 AWS CLI가 명령을 처리하는 데 필요한 모든 단계에 대한 세부 정보를 출력합니다. 출력에 있는 세부 정보를 통해 오류가 언제 발생했고 어디서 시작되었는지에 대한 단서를 확인할 수 있습니다.

이후 검토를 위해 출력을 텍스트 파일로 보내거나 요청이 있을 때 출력을 AWS Support에 보낼 수 있습니다.

`--debug` 옵션을 포함하면 다음과 같은 세부 정보가 포함됩니다.
+ 보안 인증 검색
+ 제공된 파라미터 구문 분석
+ AWS 서버에 보낸 요청 구성
+ 에 보낸 요청의 내용AWS
+ 원시 응답의 내용
+ 형식이 지정된 출력

다음은 `--debug` 옵션을 사용할 때와 사용하지 않을 때의 명령 실행의 예입니다.

```
$ aws iam list-groups --profile MyTestProfile
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "MyTestGroup",
            "GroupId": "AGPA0123456789EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:group/MyTestGroup",
            "CreateDate": "2019-08-12T19:34:04Z"
        }
    ]
}
```

```
$ aws iam list-groups --profile MyTestProfile --debug
2019-08-12 12:36:18,305 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205
2019-08-12 12:36:18,305 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: ['iam', 'list-groups', '--debug']
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function add_scalar_parsers at 0x7fdf173161e0>
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function register_uri_param_handler at 0x7fdf17dec400>
2019-08-12 12:36:18,305 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function inject_assume_role_provider_cache at 0x7fdf17da9378>
2019-08-12 12:36:18,307 - MainThread - botocore.credentials - DEBUG - Skipping environment variable credential check because profile name was explicitly set.
2019-08-12 12:36:18,307 - MainThread - botocore.hooks - DEBUG - Event session-initialized: calling handler <function attach_history_handler at 0x7fdf173ed9d8>
2019-08-12 12:36:18,308 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/service-2.json
2019-08-12 12:36:18,317 - MainThread - botocore.hooks - DEBUG - Event building-command-table.iam: calling handler <function add_waiters at 0x7fdf1731a840>
2019-08-12 12:36:18,320 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/waiters-2.json
2019-08-12 12:36:18,321 - MainThread - awscli.clidriver - DEBUG - OrderedDict([('path-prefix', <awscli.arguments.CLIArgument object at 0x7fdf171ac780>), ('marker', <awscli.arguments.CLIArgument object at 0x7fdf171b09e8>), ('max-items', <awscli.arguments.CLIArgument object at 0x7fdf171b09b0>)])
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_streaming_output_arg at 0x7fdf17316510>
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_cli_input_json at 0x7fdf17da9d90>
2019-08-12 12:36:18,322 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function unify_paging_params at 0x7fdf17328048>
2019-08-12 12:36:18,326 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/iam/2010-05-08/paginators-1.json
2019-08-12 12:36:18,326 - MainThread - awscli.customizations.paginate - DEBUG - Modifying paging parameters for operation: ListGroups
2019-08-12 12:36:18,326 - MainThread - botocore.hooks - DEBUG - Event building-argument-table.iam.list-groups: calling handler <function add_generate_skeleton at 0x7fdf1737eae8>
2019-08-12 12:36:18,326 - MainThread - botocore.hooks - DEBUG - Event before-building-argument-table-parser.iam.list-groups: calling handler <bound method OverrideRequiredArgsArgument.override_required_args of <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>>
2019-08-12 12:36:18,327 - MainThread - botocore.hooks - DEBUG - Event before-building-argument-table-parser.iam.list-groups: calling handler <bound method GenerateCliSkeletonArgument.override_required_args of <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>>
2019-08-12 12:36:18,327 - MainThread - botocore.hooks - DEBUG - Event operation-args-parsed.iam.list-groups: calling handler functools.partial(<function check_should_enable_pagination at 0x7fdf17328158>, ['marker', 'max-items'], {'max-items': <awscli.arguments.CLIArgument object at 0x7fdf171b09b0>}, OrderedDict([('path-prefix', <awscli.arguments.CLIArgument object at 0x7fdf171ac780>), ('marker', <awscli.arguments.CLIArgument object at 0x7fdf171b09e8>), ('max-items', <awscli.customizations.paginate.PageArgument object at 0x7fdf171c58d0>), ('cli-input-json', <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>), ('starting-token', <awscli.customizations.paginate.PageArgument object at 0x7fdf171b0a20>), ('page-size', <awscli.customizations.paginate.PageArgument object at 0x7fdf171c5828>), ('generate-cli-skeleton', <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>)]))
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.path-prefix: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.marker: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.max-items: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.cli-input-json: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.starting-token: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.page-size: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,328 - MainThread - botocore.hooks - DEBUG - Event load-cli-arg.iam.list-groups.generate-cli-skeleton: calling handler <awscli.paramfile.URIArgumentHandler object at 0x7fdf1725c978>
2019-08-12 12:36:18,329 - MainThread - botocore.hooks - DEBUG - Event calling-command.iam.list-groups: calling handler <bound method CliInputJSONArgument.add_to_call_parameters of <awscli.customizations.cliinputjson.CliInputJSONArgument object at 0x7fdf171b0a58>>
2019-08-12 12:36:18,329 - MainThread - botocore.hooks - DEBUG - Event calling-command.iam.list-groups: calling handler <bound method GenerateCliSkeletonArgument.generate_json_skeleton of <awscli.customizations.generatecliskeleton.GenerateCliSkeletonArgument object at 0x7fdf171c5978>>
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: assume-role-with-web-identity
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - DEBUG - Looking for credentials via: shared-credentials-file
2019-08-12 12:36:18,329 - MainThread - botocore.credentials - INFO - Found credentials in shared credentials file: ~/.aws/credentials
2019-08-12 12:36:18,330 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/endpoints.json
2019-08-12 12:36:18,334 - MainThread - botocore.hooks - DEBUG - Event choose-service-name: calling handler <function handle_service_name_alias at 0x7fdf1898eb70>
2019-08-12 12:36:18,337 - MainThread - botocore.hooks - DEBUG - Event creating-client-class.iam: calling handler <function add_generate_presigned_url at 0x7fdf18a028c8>
2019-08-12 12:36:18,337 - MainThread - botocore.regions - DEBUG - Using partition endpoint for iam, us-west-2: aws-global
2019-08-12 12:36:18,337 - MainThread - botocore.args - DEBUG - The s3 config key is not a dictionary type, ignoring its value of: None
2019-08-12 12:36:18,340 - MainThread - botocore.endpoint - DEBUG - Setting iam timeout as (60, 60)
2019-08-12 12:36:18,341 - MainThread - botocore.loaders - DEBUG - Loading JSON file: /home/ec2-user/venv/lib/python3.7/site-packages/botocore/data/_retry.json
2019-08-12 12:36:18,341 - MainThread - botocore.client - DEBUG - Registering retry handlers for service: iam
2019-08-12 12:36:18,342 - MainThread - botocore.hooks - DEBUG - Event before-parameter-build.iam.ListGroups: calling handler <function generate_idempotent_uuid at 0x7fdf189b10d0>
2019-08-12 12:36:18,342 - MainThread - botocore.hooks - DEBUG - Event before-call.iam.ListGroups: calling handler <function inject_api_version_header_if_needed at 0x7fdf189b2a60>
2019-08-12 12:36:18,343 - MainThread - botocore.endpoint - DEBUG - Making request for OperationModel(name=ListGroups) with params: {'url_path': '/', 'query_string': '', 'method': 'POST', 'headers': {'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': 'aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205'}, 'body': {'Action': 'ListGroups', 'Version': '2010-05-08'}, 'url': 'https://iam.amazonaws.com/', 'context': {'client_region': 'aws-global', 'client_config': <botocore.config.Config object at 0x7fdf16e9a4a8>, 'has_streaming_input': False, 'auth_type': None}}
2019-08-12 12:36:18,343 - MainThread - botocore.hooks - DEBUG - Event request-created.iam.ListGroups: calling handler <bound method RequestSigner.handler of <botocore.signers.RequestSigner object at 0x7fdf16e9a470>>
2019-08-12 12:36:18,343 - MainThread - botocore.hooks - DEBUG - Event choose-signer.iam.ListGroups: calling handler <function set_operation_specific_signer at 0x7fdf18996f28>
2019-08-12 12:36:18,343 - MainThread - botocore.auth - DEBUG - Calculating signature using v4 auth.
2019-08-12 12:36:18,343 - MainThread - botocore.auth - DEBUG - CanonicalRequest:
POST
/

content-type:application/x-www-form-urlencoded; charset=utf-8
host:iam.amazonaws.com
x-amz-date:20190812T193618Z

content-type;host;x-amz-date
5f776d91EXAMPLE9b8cb5eb5d6d4a787a33ae41c8cd6eEXAMPLEca69080e1e1f
2019-08-12 12:36:18,344 - MainThread - botocore.auth - DEBUG - StringToSign:
AWS4-HMAC-SHA256
20190812T193618Z
20190812/us-east-1/iam/aws4_request
ab7e367eEXAMPLE2769f178ea509978cf8bfa054874b3EXAMPLE8d043fab6cc9
2019-08-12 12:36:18,344 - MainThread - botocore.auth - DEBUG - Signature:
d85a0EXAMPLEb40164f2f539cdc76d4f294fe822EXAMPLE18ad1ddf58a1a3ce7
2019-08-12 12:36:18,344 - MainThread - botocore.endpoint - DEBUG - Sending http request: <AWSPreparedRequest stream_output=False, method=POST, url=https://iam.amazonaws.com/, headers={'Content-Type': b'application/x-www-form-urlencoded; charset=utf-8', 'User-Agent': b'aws-cli/1.16.215 Python/3.7.3 Linux/4.14.133-113.105.amzn2.x86_64 botocore/1.12.205', 'X-Amz-Date': b'20190812T193618Z', 'Authorization': b'AWS4-HMAC-SHA256 Credential=AKIA01234567890EXAMPLE-east-1/iam/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=d85a07692aceb401EXAMPLEa1b18ad1ddf58a1a3ce7EXAMPLE', 'Content-Length': '36'}>
2019-08-12 12:36:18,344 - MainThread - urllib3.util.retry - DEBUG - Converted retries value: False -> Retry(total=False, connect=None, read=None, redirect=0, status=None)
2019-08-12 12:36:18,344 - MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): iam.amazonaws.com:443
2019-08-12 12:36:18,664 - MainThread - urllib3.connectionpool - DEBUG - https://iam.amazonaws.com:443 "POST / HTTP/1.1" 200 570
2019-08-12 12:36:18,664 - MainThread - botocore.parsers - DEBUG - Response headers: {'x-amzn-RequestId': '74c11606-bd38-11e9-9c82-559da0adb349', 'Content-Type': 'text/xml', 'Content-Length': '570', 'Date': 'Mon, 12 Aug 2019 19:36:18 GMT'}
2019-08-12 12:36:18,664 - MainThread - botocore.parsers - DEBUG - Response body:
b'<ListGroupsResponse xmlns="https://iam.amazonaws.com/doc/2010-05-08/">\n  <ListGroupsResult>\n    <IsTruncated>false</IsTruncated>\n    <Groups>\n      <member>\n        <Path>/</Path>\n        <GroupName>MyTestGroup</GroupName>\n        <Arn>arn:aws:iam::123456789012:group/MyTestGroup</Arn>\n        <GroupId>AGPA1234567890EXAMPLE</GroupId>\n        <CreateDate>2019-08-12T19:34:04Z</CreateDate>\n      </member>\n    </Groups>\n  </ListGroupsResult>\n  <ResponseMetadata>\n    <RequestId>74c11606-bd38-11e9-9c82-559da0adb349</RequestId>\n  </ResponseMetadata>\n</ListGroupsResponse>\n'
2019-08-12 12:36:18,665 - MainThread - botocore.hooks - DEBUG - Event needs-retry.iam.ListGroups: calling handler <botocore.retryhandler.RetryHandler object at 0x7fdf16e9a780>
2019-08-12 12:36:18,665 - MainThread - botocore.retryhandler - DEBUG - No retry needed.
2019-08-12 12:36:18,665 - MainThread - botocore.hooks - DEBUG - Event after-call.iam.ListGroups: calling handler <function json_decode_policies at 0x7fdf189b1d90>
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "MyTestGroup",
            "GroupId": "AGPA123456789012EXAMPLE",
            "Arn": "arn:aws:iam::123456789012:group/MyTestGroup",
            "CreateDate": "2019-08-12T19:34:04Z"
        }
    ]
}
```

[맨 위로 이동](#cli-chap-troubleshooting-top)

### AWS CLI 명령 기록 로그 활성화 및 검토
<a name="tshoot-general-history"></a>

`cli\$1history` 파일 설정을 사용하여 AWS CLI 명령 기록 로그를 활성화할 수 있습니다. 이 설정을 활성화하면 AWS CLI에서 `aws` 명령 내역을 기록합니다.

이 기록을 나열하려면 `aws history list` 명령을 사용하고 세부 정보를 보려면 `aws history show` 명령에 결과 command\$1ids를 사용할 수 있습니다. 자세한 내용은 *AWS CLI 참조 가이드*의 [https://docs.aws.amazon.com/cli/latest/reference/history/index.html](https://docs.aws.amazon.com/cli/latest/reference/history/index.html) 섹션을 참조하세요.

`--debug` 옵션을 포함하면 다음과 같은 세부 정보가 포함됩니다.
+ botocore에 대한 API 호출
+ 상태 코드
+ HTTP 응답
+ 헤더
+ 반환 코드

이 정보를 사용하여 파라미터 데이터 및 API 호출이 예상대로 작동하는지 확인한 다음, 프로세스의 어느 단계에서 명령이 실패했는지 추론할 수 있습니다.

[맨 위로 이동](#cli-chap-troubleshooting-top)

### AWS CLI가 구성되었는지 확인
<a name="tshoot-general-config"></a>

`config` 및 `credentials` 파일이나 IAM 사용자 또는 역할이 올바르게 구성되지 않은 경우 다양한 오류가 발생할 수 있습니다. `config` 및 `credentials` 파일이나 IAM 사용자 또는 역할과 관련된 오류 해결에 대한 자세한 내용은 [액세스 거부 오류](#tshoot-access-denied) 및 [잘못된 보안 인증 정보 및 키 오류](#tshoot-permissions-wrongcreds) 섹션을 참조하세요.

[맨 위로 이동](#cli-chap-troubleshooting-top)

## 명령을 찾을 수 없음 오류
<a name="tshoot-install-not-found"></a>

이 오류는 운영 체제에서 AWS CLI 명령을 찾을 수 없음을 의미합니다. 설치가 불완전하거나 업데이트가 필요할 수 있습니다.

**가능한 원인: 설치된 버전보다 최신 AWS CLI 기능을 사용하려고 하거나 형식이 잘못됨**  
*오류 텍스트 예:*  

```
$ aws s3 copy
aws: [ERROR]: argument operation: Found invalid choice 'copy'

usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help
```
명령의 형식이 잘못되었거나 기능이 릴리스되기 전의 이전 버전을 사용하는 경우 여러 가지 오류가 발생할 수 있습니다. 이 두 가지 문제를 해결하는 방법에 대한 자세한 내용은 [AWS CLI 명령 형식 확인](#general-formatting) 및 [최신 버전의 AWS CLI를 실행 중인지 확인합니다.](#general-latest) 섹션을 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 설치 후 터미널을 다시 시작해야 함**  
*오류 텍스트 예:*  

```
$ aws --version
command not found: aws
```
AWS CLI를 처음 설치하거나 업데이트한 후 `aws` 명령을 찾을 수 없는 경우 `PATH` 업데이트를 인식하도록 터미널을 다시 시작해야 할 수 있습니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: AWS CLI가 완전히 설치되지 않음**  
*오류 텍스트 예:*  

```
$ aws --version
command not found: aws
```
AWS CLI를 처음 설치하거나 업데이트한 후 `aws` 명령을 찾을 수 없다면 완전히 설치되지 않았을 수 있습니다. 플랫폼에 해당하는 [최신 버전의 AWS CLI 설치 또는 업데이트](getting-started-install.md) 단계에 따라 다시 설치해 봅니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: AWS CLI에 권한이 없음(Linux)**  
Linux에 AWS CLI를 처음 설치하거나 업데이트한 후 `aws` 명령을 찾을 수 없다면 완전히 설치된 폴더에 대한 `execute` 권한이 없기 때문일 수 있습니다. AWS CLI에 `[chmod](https://en.wikipedia.org/wiki/Chmod)` 권한을 제공하려면 AWS CLI 설치에 다음 명령을 `PATH`와 함께 실행합니다.  

```
$ sudo chmod -R 755 /usr/local/aws-cli/
```
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 설치하는 동안 운영 체제 `PATH`가 업데이트되지 않음**  
*오류 텍스트 예:*  

```
$ aws --version
command not found: aws
```
`aws` 실행 파일을 운영 체제의 `PATH` 환경 변수에 추가해야 할 수 있습니다. AWS CLI를 `PATH`에 추가하려면 사용 중인 운영 체제에 따라 다음에 나온 해당 지침을 따릅니다.  

1. 사용자 디렉터리에서 셸의 프로파일 스크립트를 찾습니다. 어떤 셸을 가지고 있는지 잘 모르는 경우 `echo $SHELL`을 실행합니다.

   ```
   $ ls -a ~
   .  ..  .bash_logout  .bash_profile  .bashrc  Desktop  Documents  Downloads
   ```
   + **Bash** – `.bash_profile`, `.profile` 또는 `.bash_login`
   + **Zsh** – `.zshrc`
   + **Tcsh** – `.tcshrc`, `.cshrc` 또는 `.login`

1. 내보내기 명령을 프로필 스크립트에 추가하세요. 다음 명령은 현재 `PATH` 변수에 로컬 bin을 추가합니다.

   ```
   export PATH=/usr/local/bin:$PATH
   ```

1. 현재 세션에 업데이트된 프로파일을 다시 로드합니다.

   ```
   $ source ~/.bash_profile
   ```

1. Windows 명령 프롬프트에서 `where` 명령을 `/R path` 파라미터와 함께 사용하여 `aws` 파일 위치를 찾습니다. `aws`를 포함한 모든 폴더가 반환됩니다.

   ```
   C:\> where /R c:\ aws
   c:\Program Files\Amazon\AWSCLIV2\aws.exe
   ...
   ```

   기본적으로 AWS CLI 버전 2는 다음 위치에 있습니다.

   ```
   c:\Program Files\Amazon\AWSCLIV2\aws.exe
   ```

1. Windows 키를 누르고 **environment variables**를 입력하세요.

1. 제안 목록에서 **Edit environment variables for your account**를 선택합니다.

1. **경로**를 선택한 다음 **편집**을 선택합니다.

1. 첫 번째 단계에서 찾은 경로(예: ***C:\$1Program Files\$1Amazon\$1AWSCLIV2\$1aws.exe***)를 **Variable value** 필드에 추가합니다.

1. **확인**을 두 번 선택하여 새로운 설정을 적용합니다.

1. 실행 중인 명령 프롬프트를 모두 닫았다가 명령 프롬프트 창을 다시 엽니다.

[맨 위로 이동](#cli-chap-troubleshooting-top)

## '`aws --version`' 명령이 설치한 버전과 다른 버전을 반환함
<a name="tshoot-install-wrong-version"></a>

터미널이 AWS CLI에 대해 예상과 다른 `PATH`를 반환할 수 있습니다.

**가능한 원인: 설치 후 터미널을 다시 시작해야 함**  
`aws` 명령에 잘못된 버전이 표시되는 경우 `PATH` 업데이트를 인식하도록 터미널을 다시 시작해야 할 수 있습니다. 활성 터미널뿐만 아니라 열려 있는 모든 터미널을 닫아야 합니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 설치 후 시스템을 다시 시작해야 함**  
`aws` 명령에 잘못된 버전이 표시되고 터미널을 다시 시작해도 문제가 해결되지 않는 경우 `PATH` 업데이트를 인식하도록 시스템을 다시 시작해야 할 수 있습니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 여러 버전의 AWS CLI가 있음**  
AWS CLI를 업데이트하면서 기존 설치와 다른 설치 방법을 사용한 경우 여러 버전이 설치될 수 있습니다. 예를 들어 Linux 또는 macOS에서 현재 설치에 `pip`를 사용했지만 `.pkg` 설치 파일을 사용하여 업데이트를 시도한 경우 특히 이전 버전을 가리키는 `PATH`와 충돌이 발생할 수 있습니다.  
이 문제를 해결하려면 [모든 버전의 AWS CLI를 제거](#tshoot-uninstall-multiple-version)하고 새로 설치를 수행합니다.  
모든 버전을 제거한 후 운영 체제에 해당하는 지침을 따라 [AWS CLI 버전 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 또는 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)의 원하는 버전을 설치합니다.  
기존에 설치된 AWS CLI 버전 1과 함께 AWS CLI 버전 2를 설치한 후 이러한 문제가 발생하는 경우 에 나온 마이그레이션 지침을 따릅니다[AWS CLI 버전 1에서 AWS CLI 버전 2 설치](cliv2-migration-instructions.md).
[맨 위로 이동](#cli-chap-troubleshooting-top)

## AWS CLI를 제거한 후 '`aws --version`' 명령이 버전을 반환함
<a name="tshoot-uninstall-1"></a>

이는 대개 시스템 어딘가에 AWS CLI가 아직 설치되어 있는 경우 발생합니다.

**가능한 원인: 제거 후 터미널을 다시 시작해야 함**  
`aws --version` 명령이 여전히 작동하는 경우 터미널 업데이트를 인식하도록 터미널을 다시 시작해야 할 수 있습니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 시스템에 여러 버전의 AWS CLI가 있거나 원래 AWS CLI를 설치하는 데 사용한 것과 동일한 제거 방법을 사용하지 않음**  
AWS CLI를 설치하는 데 사용한 것과 다른 방법을 사용하여 제거했거나 여러 버전을 설치한 경우 AWS CLI가 올바르게 제거되지 않을 수 있습니다. 예를 들어 현재 설치에 `pip`를 사용한 경우 `pip`를 사용하여 제거해야 합니다. 이 문제를 해결하려면 설치에 사용한 것과 동일한 방법을 사용하여 AWS CLI를 제거합니다.  

1. 운영 체제 및 원래 설치 방법에 해당하는 지침을 따라 [AWS CLI 버전 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 및 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/uninstall.html)를 제거합니다.

1. 열려 있는 터미널을 모두 닫습니다.

1. 원하는 터미널을 열고 다음 명령에 입력한 후 버전이 반환되지 않는지 확인합니다.

   ```
   $ aws --version
   command not found: aws
   ```

   출력에 여전히 버전이 나열되어 있는 경우 AWS CLI가 다른 방법을 사용하여 설치되었거나 여러 버전이 있을 가능성이 큽니다. AWS CLI를 설치하는 데 사용한 방법을 모르는 경우 버전 출력이 표시되지 않을 때까지 운영 체제에 해당하는 [AWS CLI 버전 1](https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-install.html) 및 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/uninstall.html)의 각 제거 방법 지침을 따릅니다.
**참고**  
패키지 관리자를 사용하여 AWS CLI(`pip`, `apt`, `brew` 등)를 설치한 경우 동일한 패키지 관리자를 사용하여 제거해야 합니다. 모든 버전의 패키지를 제거하는 방법에 대해 패키지 관리자가 제공하는 지침을 따르세요.
[맨 위로 이동](#cli-chap-troubleshooting-top)

## AWS CLI에서 불완전한 파라미터 이름을 가진 명령을 처리했습니다.
<a name="tshoot-parameter-abbrev"></a>

**가능한 원인: AWS CLI 파라미터의 알려진 약어를 사용했습니다.**  
AWS CLI는 Python을 사용하여 빌드되었으므로 AWS CLI에서 [https://docs.python.org/3/library/argparse.html#allow-abbrev](https://docs.python.org/3/library/argparse.html#allow-abbrev) 인수를 포함한 Python `argparse` 라이브러리를 사용합니다. 파라미터의 약어는 AWS CLI에 의해 인식되고 처리됩니다.  
다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 명령 예제에서는 CloudFormation 스택 이름을 변경합니다. `--change-set-n` 파라미터는 `--change-set-name`의 약어로 인식되며 AWS CLI에서 명령을 처리합니다.  

```
$ aws cloudformation create-change-set --stack-name my-stack --change-set-n my-change-set
```
약어가 여러 명령일 수 있는 경우 파라미터는 약어로 인식되지 않습니다.  
다음 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-change-set.html) 명령 예제에서는 CloudFormation 스택 이름을 변경합니다. `--change-set-name` 및 `--change-set-type`와 같이 약어가 될 수 있는 여러 파라미터가 있기 때문에 `--change-set-` 파라미터는 약어로 인식되지 **않습니다**. 따라서 AWS CLI에서는 명령을 처리하지 **않습니다**.  

```
$ aws cloudformation create-change-set --stack-name my-stack --change-set- my-change-set
```
의도적으로 파라미터 약어를 사용하지 **마세요**. 신뢰할 수 없으며 이전 버전과도 호환되지 않습니다. 약어를 혼동시키는 새 파라미터가 명령에 추가되면 명령이 손상됩니다.  
또한 파라미터가 단일 값 인수인 경우 명령에서 예상치 못한 동작이 발생할 수 있습니다. 단일 값 인수의 여러 인스턴스가 전달되면 마지막 인스턴스만 실행됩니다. 다음 예에서 `--filters` 파라미터는 단일 값 인수를 사용합니다. `--filters` 및 `--filter` 파라미터는 지정됩니다. `--filter` 파라미터는 `--filters`의 약어입니다. 이로 인해 `--filters`의 두 인스턴스가 적용되고 마지막 `--filter` 인수만 적용됩니다.  

```
$ aws ec2 describe-vpc-peering-connections \
    --filters Name=tag:TagName,Values=VpcPeeringConnection \
    --filter Name=status-code,Values=active
```
명령을 실행하기 전에 올바른 파라미터를 사용하고 있는지 확인하여 예기치 않은 동작을 방지하세요.
[맨 위로 이동](#cli-chap-troubleshooting-top)

## 액세스 거부 오류
<a name="tshoot-access-denied"></a>

**가능한 원인: AWS CLI 프로그램 파일에 '실행' 권한이 없음**  
Linux 또는 macOS에서 `aws` 프로그램이 호출하는 사용자에 대한 실행 권한을 가지고 있는지 확인합니다. 일반적으로 사용 권한은 `755`로 설정됩니다.  
사용자에 대한 실행 권한을 추가하려면 다음 명령을 실행합니다. 이때 *\$1/.local/bin/aws*를 사용자 컴퓨터의 프로그램 경로로 바꾸세요.  

```
$ chmod +x ~/.local/bin/aws
```
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: IAM 보안 인증에 작업을 수행할 수 있는 권한이 없음**  
*오류 텍스트 예:*  

```
$ aws s3 ls
An error occurred (AcessDenied) when calling the ListBuckets operation: Access denied.
```
AWS CLI 명령을 실행할 때 이를 실행하는 사용자를 대신해서 해당 사용자를 IAM 계정 또는 역할과 연결하는 보안 인증 정보를 사용하여 AWS 작업이 수행됩니다. 연결된 정책은 사용자가 AWS CLI에서 실행하는 명령에 해당하는 API 작업을 호출할 수 있는 권한을 부여해야 합니다.  
대부분의 명령은 명령 이름과 일치하는 이름으로 한 가지 작업을 호출합니다. 그러나 `aws s3 sync` 같은 사용자 지정 명령은 여러 API를 호출합니다. `--debug` 옵션으로 명령이 어떤 API를 호출하는지 확인할 수 있습니다.  
사용자 또는 역할에 정책이 할당한 적절한 권한이 있는 경우 필요한 보안 인증 정보를 AWS CLI 명령에서 사용 중인지 확인합니다. 필요한 보안 인증 정보를 AWS CLI에서 사용 중인지 확인하려면 [보안 인증 정보에 대한 다음 섹션](#tshoot-permissions-wrongcreds)을 참조하세요.  
IAM 권한 할당에 대한 자세한 내용은 *IAM 사용 설명서*에서 [액세스 관리 개요: 권한 및 정책](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction_access-management.html)을 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

## 잘못된 보안 인증 정보 및 키 오류
<a name="tshoot-permissions-wrongcreds"></a>

*오류 텍스트 예:*

```
$ aws s3 ls
An error occurred (InvalidAccessKeyId) when calling the ListBuckets operation: The AWS Access Key Id 
you provided does not exist in our records.
```

```
$ aws s3 ls
An error occurred (InvalidClientTokenId) when calling the ListBuckets operation: The security token 
included in the request is invalid.
```

**가능한 원인: AWS CLI가 잘못된 보안 인증 정보 또는 예상과 다른 위치의 보안 인증 정보를 읽습니다.**  
AWS CLI가 예상과 다른 위치에서 보안 인증 정보를 읽고 있거나 키 페어 정보가 올바르지 않을 수 있습니다. `aws configure list`를 실행하여 어떤 보안 인증을 사용하고 있는지 확인할 수 있습니다.  
다음은 기본 프로파일에 사용된 보안 인증을 확인하는 방법을 나타낸 예제입니다.  

```
$ aws configure list
NAME       : VALUE                : TYPE                    : LOCATION
profile    : <not set>            : None                    : None
access_key : ****************ABCD : shared-credentials-file : 
secret_key : ****************ABCD : shared-credentials-file : 
region     : us-west-2            : env                     : AWS_DEFAULT_REGION
```
다음은 명명된 프로파일의 보안 인증을 확인하는 방법을 나타낸 예제입니다.  

```
$ aws configure list --profile dev01
NAME       : VALUE                : TYPE                    : LOCATION
profile    : dev01                : None                    : --profile
access_key : ****************ABCD : shared-credentials-file : 
secret_key : ****************ABCD : shared-credentials-file : 
region     : us-west-2            : config-file             : ~/.aws/config
```
키 페어 세부 정보를 확인하려면 `config` 및 `credentials` 파일을 검토합니다. `config` 및 `credentials` 파일에 대한 자세한 내용은 [AWS CLI의 구성 및 보안 인증 파일 설정](cli-configure-files.md) 섹션을 참조하세요. 보안 인증 정보 우선 순위를 비롯한 인증 및 보안 인증에 대한 자세한 내용은 [AWS CLI에 대한 인증 및 액세스 보안 인증](cli-chap-authentication.md) 섹션을 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 컴퓨터의 클록이 동기화되지 않음**  
유효한 보안 인증 정보를 사용 중이라면 클록이 동기화되지 않았을 수 있습니다. Linux 또는 macOS에서 `date`를 실행하여 시간을 확인합니다.  

```
$ date
```
몇 분 안에 시스템 클록이 정확하지 않으면 `ntpd`를 사용하여 동기화합니다.  

```
$ sudo service ntpd stop
$ sudo ntpdate time.nist.gov
$ sudo service ntpd start
$ ntpstat
```
Windows에서는 제어판의 날짜 및 시간 옵션을 사용하여 시스템 클록을 구성합니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

## 서명 불일치 오류
<a name="tshoot-signature-does-not-match"></a>

*오류 텍스트 예:*

```
$ aws s3 ls
An error occurred (SignatureDoesNotMatch) when calling the ListBuckets operation: The request signature we 
calculated does not match the signature you provided. Check your key and signing method.
```

AWS CLI에서 명령을 실행하면 암호화된 요청을 AWS 서버에 보내 적절한 AWS 서비스 작업을 수행합니다. 보안 인증(액세스 키 및 보안 키)이 암호화에 포함되며 보안 인증을 통해 AWS에서 요청하는 사람을 인증할 수 있습니다. 다음과 같이 이 프로세스의 올바른 작업에 방해가 될 수 있는 요소가 여러 개 있습니다.

**가능한 원인: 클록이 AWS 서버와 동기화되지 않음**  
[재생 공격(Replay Attack)](https://wikipedia.org/wiki/Replay_attack)으로부터 보호하기 위해 암호화/암호 해독 프로세스 동안 현재 시간이 사용될 수 있습니다. 클라이언트 및 서버의 시간이 허용된 시간을 넘는 경우 프로세스가 실패할 수 있으며 요청이 거부됩니다. 이는 클록이 호스트 머신의 클록과 동기화되지 않은 가상 머신에서 명령을 실행할 때에도 발생할 수 있습니다. 한 가지 가능한 원인은 가상 머신이 최대 절전 모드에 있다가 활성화된 후 얼마 뒤 클록을 호스트 머신과 동기화할 때입니다.  
Linux 또는 macOS에서 `date`를 실행하여 시간을 확인합니다.  

```
$ date
```
몇 분 안에 시스템 클록이 정확하지 않으면 `ntpd`를 사용하여 동기화합니다.  

```
$ sudo service ntpd stop
$ sudo ntpdate time.nist.gov
$ sudo service ntpd start
$ ntpstat
```
Windows에서는 제어판의 날짜 및 시간 옵션을 사용하여 시스템 클록을 구성합니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 운영 체제에서 특정 특수 문자가 포함된 AWS 키를 잘못 처리하고 있음**  
AWS 키에 `-`, `+`, `/` 또는 `%`와 같은 특정 특수 문자가 포함되어 있는 경우 일부 운영 체제 변형에서 해당 문자열을 잘못 처리해서 키 문자열이 잘못 해석됩니다.  
보안 인증 파일 생성 중 새 인스턴스에 보안 인증 파일을 작성하는 도구와 같이 다른 도구 또는 스크립트를 사용하여 키를 처리하는 경우, 이러한 도구 및 스크립트를 통해 특수 문자가 AWS에서 더 이상 인식할 수 없는 것으로 변환되도록 특수 문자를 자체적으로 처리할 수도 있습니다.  
문제를 일으키는 특수 문자가 포함되지 않은 비밀 키를 얻으려면 비밀 키를 다시 생성하는 것이 좋습니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

## SSL 인증서 오류
<a name="tshoot-certificate-verify-failed"></a>

**가능한 원인: AWS CLI가 프록시 인증서를 신뢰하지 않음**  
*오류 텍스트 예:*  

```
$ aws s3 ls
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed
```
AWS CLI 명령을 사용하면 `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed` 오류 메시지를 받게 됩니다. 이것은 사용자의 프록시 인증서가 자체 서명되고 회사가 인증 기관(CA)으로 설정된 것과 같은 요인으로 인해 AWS CLI가 프록시의 인증서를 신뢰하지 않기 때문에 발생합니다. 이렇게 하면 AWS CLI에서 로컬 CA 레지스트리의 회사 CA 루트 인증서를 찾지 못하게 됩니다.  
이 문제를 해결하려면 `ca\$1bundle` 구성 파일 설정, **[--ca-bundle](cli-configure-options.md#cli-configure-options-ca-bundle)** 명령줄 옵션 또는 `AWS\$1CA\$1BUNDLE` 환경 변수를 사용해 회사의 `.pem` 파일을 찾을 수 있는 위치를 AWS CLI에 지시합니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 구성이 올바른 CA 루트 인증서 위치를 가리키지 않음**  
*오류 텍스트 예:*  

```
$ aws s3 ls
SSL validation failed for regionname [Errno 2] No such file or directory
```
이것은 AWS CLI에서 인증 기관(CA) 번들 파일 위치가 잘못 구성되었기 때문에 발생합니다. 이 문제를 해결하려면 회사 `.pem` 파일의 위치를 확인하고 `ca\$1bundle` 구성 파일 설정, **[--ca-bundle](cli-configure-options.md#cli-configure-options-ca-bundle)** 명령줄 옵션 또는 `AWS\$1CA\$1BUNDLE` 환경 변수를 사용하여 AWS CLI 구성을 업데이트합니다.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 구성이 올바른 AWS 리전를 사용하지 않음**  
*오류 텍스트 예:*  

```
$ aws s3 ls
[SSL: CERTIFICATE_ VERIFY_FAILED] certificate verify failed
```
지정한 AWS 리전에서 AWS 서비스를 사용할 수 없거나 리소스가 다른 AWS 리전에 있는 경우 오류 또는 예기치 않은 결과가 발생할 수 있습니다. 문제 해결 단계는 [AWS CLI 명령이 사용 중인 AWS 리전 확인](#general-region) 섹션을 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: TLS 버전을 업데이트해야 함 **  
*오류 텍스트 예:*  

```
$ aws s3 ls
[SSL: UNSAFE_LEGACY_RENEGOTIATION_DISABLED] unsafe legacy renegotiation disabled
```
AWS 서비스가 디바이스의 TLS 버전과 호환되지 않는 TLS 버전을 사용합니다. 이 문제를 해결하려면 지원되는 TLS 버전으로 업데이트하세요. 자세한 내용은 [AWS CLI에 최소 버전의 TLS 적용](cli-security-enforcing-tls.md) 섹션을 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

## 잘못된 JSON 오류
<a name="tshoot-invalid-json"></a>

*오류 텍스트 예:*

```
$ aws dynamodb update-table \
    --provisioned-throughput '{"ReadCapacityUnits":15,WriteCapacityUnits":10}' \
    --table-name MyDDBTable
Error parsing parameter '--provisioned-throughput': Invalid JSON: Expecting property name enclosed in 
double quotes: line 1 column 25 (char 24)
JSON received: {"ReadCapacityUnits":15,WriteCapacityUnits":10}
```

AWS CLI 명령을 사용하면 "`Invalid JSON`" 오류 메시지를 받게 됩니다. 이것은 일반적으로 사용자가 예상 JSON 형식으로 명령을 입력했지만 AWS CLI가 JSON을 올바르게 읽을 수 없는 경우 표시되는 오류입니다.

**가능한 원인: AWS CLI에서 사용할 유효한 JSON을 입력하지 않음**  
명령에 유효한 JSON을 입력했는지 확인합니다. 형식 지정에 문제가 있는 JSON에 대해 JSON 검사기를 사용하는 것이 좋습니다.  
명령줄에서 고급 JSON을 사용하려면 명령줄 JSON 프로세서(예: `jq`)를 사용하여 JSON 문자열을 생성하는 것이 좋습니다. `jq`에 대한 자세한 내용은 *GitHub*에서 [jq 리포지토리](http://stedolan.github.io/jq/)를 참조하세요.  
[맨 위로 이동](#cli-chap-troubleshooting-top)

**가능한 원인: 터미널의 인용 규칙으로 인해 유효한 JSON이 AWS CLI로 전송되지 않음**  
AWS CLI가 명령에서 무엇이든 수신하기 전에 터미널은 자체 인용 및 이스케이프 규칙을 사용하여 명령을 처리합니다. 터미널의 형식 지정 규칙으로 인해 명령이 AWS CLI에 전달되기 전에 일부 JSON 콘텐츠가 제거될 수 있습니다. 명령을 공식화할 때 [터미널의 인용 규칙](cli-usage-parameters-quoting-strings.md)을 사용해야 합니다.  
문제를 해결하려면 `echo` 명령을 사용하여 셸에서 파라미터를 처리하는 방법을 확인합니다.  

```
$ echo {"ReadCapacityUnits":15,"WriteCapacityUnits":10}
ReadCapacityUnits:15 WriteCapacityUnits:10
```

```
$ echo '{"ReadCapacityUnits":15,"WriteCapacityUnits":10}'
{"ReadCapacityUnits":15,"WriteCapacityUnits":10}
```
유효한 JSON이 반환될 때까지 명령을 수정합니다.  
보다 심층적인 문제 해결을 위해 `--debug` 파라미터를 사용하여 디버그 로그를 확인합니다. 디버그 로그에는 AWS CLI에 전달된 내용이 정확히 표시되어 있습니다.  

```
$ aws dynamodb update-table \
    --provisioned-throughput '{"ReadCapacityUnits":15,WriteCapacityUnits":10}' \
    --table-name MyDDBTable \
    --debug
2022-07-19 22:25:07,741 - MainThread - awscli.clidriver - DEBUG - CLI version: aws-cli/1.18.147 
Python/2.7.18 Linux/5.4.196-119.356.amzn2int.x86_64 botocore/1.18.6
2022-07-19 22:25:07,741 - MainThread - awscli.clidriver - DEBUG - Arguments entered to CLI: 
['dynamodb', 'update-table', '--provisioned-throughput', '{"ReadCapacityUnits":15,WriteCapacityUnits":10}',
 '--table-name', 'MyDDBTable', '--debug']
```
터미널의 인용 규칙을 사용하여 JSON 입력이 AWS CLI로 전송될 때 발생하는 문제를 해결합니다. 인용 규칙에 대한 자세한 내용은 [AWS CLI에서 문자열에 따옴표와 리터럴 사용](cli-usage-parameters-quoting-strings.md) 섹션을 참조하세요.  
AWS CLI에 유효한 JSON을 가져오는 데 문제가 있는 경우 Blob을 사용하여 JSON 데이터를 AWS CLI에 직접 전달함으로써 JSON 데이터 입력에 대한 터미널의 인용 규칙을 우회하는 것이 좋습니다. Blob에 대한 자세한 내용은 [Blob](cli-usage-parameters-types.md#parameter-type-blob) 섹션을 참조하세요.
[맨 위로 이동](#cli-chap-troubleshooting-top)

## 추가 리소스
<a name="tshoot-resources"></a>

AWS CLI 문제에 추가적인 도움이 필요하면 *GitHub*의 [AWS CLI 커뮤니티](https://github.com/aws/aws-cli/issues) 또는 [AWS re:Post 커뮤니티](https://repost.aws/)를 방문하세요.

[맨 위로 이동](#cli-chap-troubleshooting-top)