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 정보가 정확한 지 확인하고 시간 동기화를 확인해야 한다.