AWS cli 세팅하기

http://docs.aws.amazon.com/ko_kr/cli/latest/userguide/installing.html

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/install-cliv2-linux.html

pip나 apt 에서는 aws cli v1 이 나온다. 직접 바이너리를 다운로드 받아서 aws cli v2 를 설치한다.

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
aws --version
rm -rf aws/ awscliv2.zip 

Command Completion 활성화. 다음 내용을 .bashrc 등에 넣어줌.  (https://github.com/aws/aws-cli/tree/v2)

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-configure-completion.html

$ complete -C aws_completer aws

http://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-chap-getting-started.html

$ aws configure

$ cat ~/.aws/config
[default]
region = ap-northeast-2
output = text

$ cat .aws/credentials
[default]
aws_access_key_id = xxxxx
aws_secret_access_key = xxxxxx

profile을 이용하여 여러개 관리할 수 있음.

aws cli named profiles

여러 개의 aws key를 이용할 경우에는 named profiles를 이용하여 여러 개의 profile을 등록해서 쓸 수 있다.

혹시나 실수하는 것을 방지하기 위해서 credentials 파일의 default에는 의미가 없는 값을 넣어두고 각 환경을 prod, staging 등으로 profile 에 설정을 하여 사용하는 것이 좋겠다.

설정하는 방법은 아래 url 참고.

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/cli-multiple-profiles.html

 두 개의 프로필이 있는 자격 증명 파일 설정

$ cat ~/.aws/config
[default]
region=us-west-2
output=json

[profile user2]
region=us-east-1
output=text

$ cat .aws/credentials
[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

AWS CLI에서 프로파일 사용

$ aws ec2 describe-instances --profile user2

AWS_PROFILE 환경 변수를 설정하여 계속 사용하기

$ export AWS_PROFILE=user2

환경 변수를 설정하면 기본 프로필이 변경되어 셸 세션이 종료될 때까지 또는 변수를 다른 값으로 설정할 때까지 유지됩니다. 

aws ec2 describe-instances

http://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html

aws ec2 에서 query를 이용하는 경우 배열이 있으면 약간 더 처리를 해 주어야 한다. 출력화면이 처리하기가 불편하였다. 

명령출력 제어하는 부분은 http://docs.aws.amazon.com/ko_kr/cli/latest/userguide/controlling-output.html 를 참고한다. 

기본 JSON 처리 라이브러리인 JMESPath의 추가 예와 전체 사양은 http://jmespath.org/specification.html을 참조

filters를 이용하여 원하는 조건의 정보를 필터링한 다음 출력할 내용만 query로 조정을 할 수 있다. 

$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*"  \
--query 'Reservations[*].Instances[*].[PublicIpAddress,Tags[?Key==`Name`].Value]' --output json
[
    [
        [
            "52.79.117.197",
            [
                "infra-Elasticsearch-node8"
            ]
        ]
    ],
...

# 두번째 열에 배열이 있어서 하나의 인스턴스 정보가 한줄에 나오지 않음.
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*"  \
--query 'Reservations[*].Instances[*].[PublicIpAddress,Tags[?Key==`Name`].Value]' --output text
52.79.117.197
infra-Elasticsearch-node8
52.78.5.85
infra-vpn-cafe24-zb
52.78.139.124
....

# to_string 으로 type 변경함.
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*"  \
--query 'Reservations[*].Instances[*].[PublicIpAddress,to_string(Tags[?Key==`Name`].Value)]' --output json
[
    [
        [
            "52.79.117.197",
            "[\"infra-Elasticsearch-node8\"]"
        ]
    ],
    [
        [
            "52.78.5.85",
            "[\"infra-vpn-cafe24-zb\"]"
        ]
    ],
.....


$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*" \
--query 'Reservations[*].Instances[*].[PublicIpAddress,to_string(Tags[?Key==`Name`].Value)]' --output text
52.79.117.197   ["infra-Elasticsearch-node8"]
52.78.5.85      ["infra-vpn-cafe24-zb"]
52.78.139.124   ["infra-Elasticsearch-node9"]
52.78.94.43     ["infra-Elasticsearch-node4"]
13.124.244.105  ["infra-swarm-worker2"]
13.124.183.89   ["infra-swarm-worker3"]
13.125.22.34    ["infra-rundeck"]
....

이렇게 나온 결과를 사람이 보기 편하게 편집을 하여 사용을 하면 됨

$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*" \
--query 'Reservations[*].Instances[*].[PublicIpAddress,to_string(Tags[?Key==`Name`].Value)]' --output text \
| tr -d "[" | tr -d "]" | tr -d "\"" | awk '{ print $2" , "$1 }' | sort
adcenter.prod.fe1.admin1 , 52.79.150.2
adcenter.prod.fe2 , 52.79.164.255
adcenter.prod.fe3 , 52.78.9.181
adcenter.prod.fe4 , 52.78.191.111
....


JMESPath 를 사용하지 않고 jq를 이용하는 방법도 있다. filters를 이용하여 원하는 이름의 호스트만 걸러낸 후 jq를 이용하여 json에서 필요한 정보를 가져왔다. 보기 편하게 보려면 python  등으로 짜서 쓰는게 편리할 것 같다.

Tags 가 여러 개 있는 경우 배열의 순서가 없기 때문에   Tags[0] 으로 지정을 하면 원하는  Name Key 정보를 못 가져올 수 있다. Key 가 Name 인 것을 지정해야 한다. 

$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*" | \
jq .Reservations[] | jq '.Instances[] | {ip: .PublicIpAddress, Name: .Tags[0].Value}'

# Tag에서 여러 개의 Key가 있는 경우 랜덤하게 검색이 되어서 나옴.
$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*" | \
jq '.Reservations[].Instances[] | {ip: .PublicIpAddress, Name: .Tags[0].Value}'
{
  "ip": "52.79.117.197",
  "Name": "es-node"
}
{
  "ip": "52.78.5.85",
  "Name": "infra-vpn-cafe24-zb"
}
{
  "ip": "52.78.139.124",
  "Name": "es-node"
}
....

$ aws ec2 describe-instances --filters "Name=tag:Name,Values=infra-*" | \
jq '.Reservations[].Instances[] | [.PublicIpAddress, (.Tags[]|select(.Key=="Name")|.Value)]'
[
  "52.79.117.197",
  "infra-Elasticsearch-node8"
]
[
  "52.78.5.85",
  "infra-vpn-cafe24-zb"
]
[
  "52.78.139.124",
  "infra-Elasticsearch-node9"
]
....

참고 https://stedolan.github.io/jq/tutorial/

https://blog.outsider.ne.kr/1202

Troubleshooting AWS CLI Errors

https://docs.aws.amazon.com/cli/latest/userguide/troubleshooting.html

Error: AWS was not able to validate the provided credentials

awscli 를 사용할 때 사용하는 컴퓨터의 시간이 맞지 않으면 작동이 안된다.  key 정보가 정확한 지 확인하고 시간 동기화를 확인해야 한다.