재형이의 성장통 일지
  • AWS Profile 전환 자동화하기
    2024년 08월 12일 11시 37분 45초에 업로드 된 글입니다.
    작성자: 재형이
    반응형

     

    1. AWS Profile 개념

    • 기본적으로 aws cli를 사용할 때 aws configure에 등록된 액세스키로 자격 증명이 이루어지게 됩니다
    • 만약에 하나의 계정 뿐만 아니라 다양한 AWS 계정 또는 IAM User 계정을 등록해서 사용하고 싶다면 profile을 사용해야 합니다
    # default 프로파일 등록
    aws configure
    
    # 지정된 이름의 프로파일 등록
    aws configure --profile <PROFILE_NAME>
    • 하지만 profile을 사용하려면 매번 커맨드 뒤에 --profile 옵션을 추가해야 하는 번거로움이 생깁니다
    • 추가로 Human Error까지 초래할 수 있습니다

    2. AWS Profile 작동 원리

    • aws configure 명령어로 등록한 자격증명은 ~/.aws/credentials 에 저장이 되는데, 각 프로필도 이 곳에 저장이 됩니다
    [default] #default 프로파일
    aws_access_key_id = 1234
    aws_secret_access_key = abcd
    region=ap-northeast-2
    output=json
    
    [prod-account] #추가한 첫번째 프로파일
    aws_access_key_id = 1234
    aws_secret_access_key = abcd
    region=ap-northeast-2
    output=json
    
    [networking] #추가한 두번째 프로파일
    aws_access_key_id = 1234
    aws_secret_access_key = abcd
    region=ap-northeast-2
    output=yaml
    • aws cli는 기본적으로 default 프로파일을 사용하게 됩니다
    • AWS 공식 문서를 확인해보면 AWS_PROFILE 환경 변수에 따라 profile을 선택할 수 있습니다
      (기본적으로 현재 사용하고 있는 터미널 세션에서만 사용 가능)
    • 처음에는 해당 변수가 비어있고 자동으로 default 프로파일을 사용하게 됩니다

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

     

    구성할 환경 변수 AWS CLI - AWS Command Line Interface

    이러한 환경 변수는 웹 보안 인증 공급자를 사용한 역할 수임에만 적용되며 일반적인 역할 수임 공급자 구성에는 적용되지 않습니다.

    docs.aws.amazon.com

    • 리눅스 환경에서는 AWS_PROFILE이고 윈도우 환경에서는 env:AWS_PROFILE 입니다
    • 기본적으로 터미널 세션 별로 환경 변수가 적용되기 때문에 여러 프로파일을 한번에 사용도 가능합니다

    3. Profile 스위칭

    • aws configure list-profiles 명령어를 실행하면 현재 ~/.aws/credentials 파일에 저장된 프로파일의 목록을 확인할 수 있습니다
    • 해당 프로파일의 이름을 AWS_PROFILE 환경 변수에 등록하거나 --profile 옵션을 사용하면 됩니다
    • 처음에 말했듯이 매번 하기도 번거롭고 휴먼 에러를 초래할 수도 있기 때문에 이를 자동화해봤습니다

    4. 파이썬, shell script 활용 실패

    #!/usr/bin/python3
    import sys
    import re
    import os
    import subprocess
    
    def list_profiles():
        print("--------------------------------")
        print("Current Profile: " + os.environ.get("AWS_PROFILE", ""))
        print("--------------------------------")
        with open(os.path.expanduser("~/.aws/credentials"), "r") as file:
            contents = file.read()
            profiles = re.findall(r"\[([^]]+)\]", contents)
            for profile in profiles:
                print(profile)
        print("--------------------------------")
    
    def switch_profile(profile_name):
        if profile_name:
            with open(os.path.expanduser("~/.aws/credentials"), "r") as file:
                contents = file.read()
                if re.search(fr"\[{profile_name}\]", contents):
                    os.environ["AWS_PROFILE"] = profile_name
                    print(os.environ["AWS_PROFILE"])
                    print("[AWS_PROFILE] changed to [" + profile_name + "] successfully !!")
                else:
                    print("Invalid profile name.")
        else:
            list_profiles()
    
    if __name__ == "__main__":
        if len(sys.argv) == 1:
            switch_profile(None)
        elif len(sys.argv) == 2 and sys.argv[1] == "--help":
            print("Usage:")
            print("  awspf                : List of My AWS Profile (which located in '~/.aws/credentials')")
            print("  awspf [profile_name] : Switch Current Shell's Profile to [profile_name]")
        else:
            switch_profile(sys.argv[1])
    • 해당 스크립트로 profile list를 출력하고 방향키로 프로파일을 선택하게 해봤지만 스크립트가 새로운 세션에서 실행이 되고 죽기 때문에 export AWS_PROFILE이 적용이 되지 않았습니다

    5. fzf (대화형 탐색 도구) 활용

    •  fzf란 fuzzy finder의 약어로 터미널 환경에서 대화형으로 파일 탐색을 도와주는 도구 입니다
    • 스크립트와 달리 현재 세션에서 실행이 되고, 대화형을 지원해주기 때문에 원하던 기능을 그대로 구현할 수 있습니다
    • fzf를 설치한 후에 alias로 간단하게 구현할 수 있습니다

    5 - 1. 리눅스

    1. fzf 설치
      git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
      ~/.fzf/install
      source ~/.zshrc #혹은 source ~/.bashrc


    2. 다음 명령어 입력
      # 리눅스
      alias awspf='export AWS_PROFILE=$(sed -n "s/\[\(profile \)\?\(.*\)\]/\2/p" ~/.aws/credentials ~/.aws/config | sort -rg | uniq | fzf)'


    3.  ~/.bashrc에 alias를 등록해주면 새로운 터미널에서도 alias 명령어 실행 없이 awspf를 사용할 수 있습니다

    5 - 2. 윈도우

    • 윈도우에서는 fzf를 chocolatey 레포지토리를 활용하여 설치할 수 있습니다
    • 하단 링크 Install Chocolatey for Individual Use 섹션에서 설치 방법을 확인할 수 있습니다

    https://chocolatey.org/install#individual

     

    Installing Chocolatey

    Chocolatey is software management automation for Windows that wraps installers, executables, zips, and scripts into compiled packages. Chocolatey integrates w/SCCM, Puppet, Chef, etc. Chocolatey is trusted by businesses to manage software deployments.

    chocolatey.org

    1. fzf 설치
      • chocolatey 설치 후에
        # 관리자 권한으로 실행한 PowerShell에서 실행
        choco install fzf
    2. 파워쉘 스크립트 작성
      # aws_profile_switch.ps1
      
      $profiles = Get-Content "$HOME\.aws\credentials" | Select-String -Pattern '^\[.*\]' | ForEach-Object { $_ -replace '[\[\]]', '' }
      
      # Use fzf to select a profile
      $selectedProfile = $profiles | fzf
      
      if ($selectedProfile) {
          $env:AWS_PROFILE = $selectedProfile
          Write-Output "AWS_PROFILE set to '$selectedProfile'"
      } else {
          Write-Output "No profile selected"
      }
    3. PowerShell Profile 적용 (리눅스 alias 대체)
      # 관리자 권한 PowerShell에서 실행
      notepad $profile
      
      # 새로 생성하겠냐는 알림창이 나오면 확인 클릭 후에 하단 내용 입력
      # 위에서 생성한 PowerShell 스크립트가 있는 경로로 설정
      function awspf {
          . "C:\your path\\aws_profile_switch.ps1"
      }
    4. 리눅스와 동일하게 파워스크립트 창에서 awspf 명령어로 실행하고 방향키로 프로파일 선택 후에 자격증명 변경 가능

     

    [추가]

    • assume role을 사용하는 profile은 ~/.aws/config 파일에 다음과 같은 형식으로 저장이 됨
    • --profile 환경변수 사용하는 로직은 동일
    • 파워쉘 스크립트 수정
      • $HOME\.aws\credentials
      • $HOME\.aws\config
    # credentials 파일에서 프로파일 목록 가져오기
    $credentialsProfiles = Get-Content "$HOME\.aws\credentials" | Select-String -Pattern '^\[.*\]' | ForEach-Object { $_ -replace '[\[\]]', '' }
    
    # config 파일에서 프로파일 목록 가져오기
    $configProfiles = Get-Content "$HOME\.aws\config" | Select-String -Pattern '^\[profile .*' | ForEach-Object { $_ -replace '\[profile ', '' -replace '\]', '' }
    
    # 두 파일에서 프로파일을 병합하고 중복 제거
    $profiles = $credentialsProfiles + $configProfiles | Sort-Object -Unique
    
    # Use fzf to select a profile
    $selectedProfile = $profiles | fzf
    
    if ($selectedProfile) {
        $env:AWS_PROFILE = $selectedProfile
        Write-Output "AWS_PROFILE set to '$selectedProfile'"
    } else {
        Write-Output "No profile selected"
    }

     

     


     

     

     
    • 읽어주셔서 감사합니다

     

    반응형
    댓글