AWS CLI에서 1password로 보안 관리하기

이걸 왜 하는 걸까?
AWS CLI을 사용하기 위해서는 ~/.aws/config에 아래와 같이 Access Token, Secret Key가 있어야 합니다.
[default]
region = ap-northeast-2
aws_access_key_id = 373ac86c-26c2-44ac
aws_secret_access_key = 5813087a26134c7fb66c637572c2822f
Local에서 접근 가능하다면 IAM으로 권한 제한을 해 놓겠지만, 그래도 이런 중요한 정보가 평문으로 저장된다는 게 뭔가 찝찝한 건 사실입니다. 이런 상황에서 1password에서 지원하는 기능을 사용하면 Secret을 Local에 저장하지 않고 1password에 있는 걸 사용해 더 안전하고, 만약에 컴퓨터를 바꾼다고 해도 1password에 로그인만 하면 이 정보들이 동기화 되니 더 편리합니다.
CLI에서 직접 aws 사용할 때
우선 1password 없이 CLI에서 직접 aws 명령어를 사용한다면 말씀드렸듯 ~/.aws/config에 Access Key와 Secret이 평문으로 저장됩니다.
이 상태에서 1password CLI를 설치합니다. 이걸 설치하면 말 그대로 CLI에서 1password에 접근할 수 있습니다.
명령줄 도구 다운로드 | 1Password
1Password 명령줄 도구를 다운로드하여 코드 속의 일반 텍스트 시크릿을 제거하고, 관리 작업을 자동화하고, 지문으로 모든 CLI에 로그인하세요.
1password.com
그리고 1password에 access key id, secret access key (정확히 이 단어, 소문자 유지해야 합니다)를 등록합니다.

마지막으로 ~/.aws/config에서 access key와 secret key를 제거하되, 프로필과 region은 유지하면 준비는 끝납니다.
[default]
region = ap-northeast-2
이제 CLI에서 평소처럼 AWS를 쓰면 아래와 같이 1password 허용 팝업이 뜨고, Local에 있는 Credentials가 아닌 1password에 있는 걸 사용합니다!

Script에서 불러와야 할 때
Script에서 AWS CLI 관련 정보를 사용할 때는 직접 1password CLI (op)를 사용해야 합니다. 이것도 어렵지 않습니다. 우선 1password에 있는 정보들을 가져오기 위해서는 아래 명령어를 사용합니다.
op item get "아이템 이름" --field "필드 이름"
아이템 이름과 필드 이름은 1password에서 정보를 만들 때 지정할 수 있습니다.

여기서는 그 전 단계에서 활용한 이름을 그대로 사용하겠습니다. 우리가 해야 할 건 Script가 실행되는 동안 쓸 수 있도록 1password에 있는 정보들을 export 하는 겁니다. AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_DEFAULT_REGION으로 철자를 정확히 지켜서 export 하면 Script가 실행됩니다.
export AWS_ACCESS_KEY_ID=$(op item get "AWS Credentials" --field "aws key id" 2>/dev/null)
export AWS_SECRET_ACCESS_KEY=$(op item get "AWS Credentials" --reveal --field "secret access key" 2>/dev/null)
export AWS_DEFAULT_REGION=$(op item get "AWS Credentials" --field "AWS_DEFAULT_REGION" 2>/dev/null)