여러 AWS 프로필 설정하기

Configure the AWS CLI 챕터에서 AWS CLI를 설정할 때, aws configure 커맨드를 사용해 서버리스 애플리케이션을 배포할 AWS 계정의 IAM 자격 증명을 설정했습니다.

이 자격 증명은 ~/.aws/credentials에 저장되며, serverless deploy를 실행할 때 Serverless Framework에서 사용됩니다. Serverless는 내부적으로 이 자격 증명과 AWS SDK를 사용해 지정된 AWS 계정에 필요한 리소스를 생성합니다.

여러 자격 증명을 AWS CLI에 설정해야 하는 경우가 있습니다. 이는 여러 프로젝트를 동시에 진행하거나, 동일한 프로젝트의 다른 단계를 분리하려는 경우에 발생합니다.

이번 챕터에서는 여러 AWS 자격 증명을 어떻게 다룰 수 있는지 살펴보겠습니다.

새로운 AWS 프로필 생성하기

다른 AWS 계정에서 작업하기 위해 새로운 AWS 프로필을 생성하려고 한다고 가정해 보겠습니다. IAM 사용자 생성 챕터에 설명된 단계를 따라 다른 AWS 계정에서 IAM 사용자를 생성하고 액세스 키 ID시크릿 액세스 키를 기록해 두세요.

AWS CLI에서 새로운 프로필을 설정하려면 다음 명령어를 사용하세요:

$ aws configure --profile newAccount

여기서 newAccount는 생성하려는 새 프로필의 이름입니다. 기본 리전 이름기본 출력 형식은 그대로 두어도 됩니다.

로컬에서 프로필 설정하기

Serverless Framework가 여러분의 AWS 프로필을 사용해 리소스를 배포하는 방법에 대해 언급했습니다. 하지만 serverless invoke local 명령어를 사용해 로컬에서 개발할 때는 상황이 조금 다릅니다.

이 경우, 여러분의 Lambda 함수는 로컬에서 실행되며 아직 배포되지 않은 상태입니다. 따라서 Lambda 함수 내에서 여러분의 계정에 있는 다른 AWS 리소스에 접근하려고 하면 기본 AWS 프로필을 사용하게 됩니다. 기본 AWS 프로필은 ~/.aws/credentials 파일의 [default] 태그 아래에서 확인할 수 있습니다.

serverless invoke local 명령어에서 기본 AWS 프로필을 새로운 프로필로 전환하려면 다음 명령어를 실행하면 됩니다:

$ AWS_PROFILE=newAccount serverless invoke local --function hello

여기서 newAccount는 전환하려는 프로필 이름이고, hello는 로컬에서 실행할 함수 이름입니다. serverless invoke local 명령어 앞에 AWS_PROFILE=newAccount를 추가함으로써 AWS SDK가 사용할 기본 AWS 프로필을 설정할 수 있습니다.

이 설정을 매번 명령어에 추가하지 않고도 사용하려면 다음 명령어를 실행하면 됩니다:

$ export AWS_PROFILE=newAccount

여기서 newAccount는 전환하려는 프로필 이름입니다. 이제 셸 세션 동안 newAccount가 기본 프로필로 설정됩니다.

이에 대한 더 자세한 내용은 AWS 문서에서 확인할 수 있습니다.

배포 시 프로필 설정하기

이제 새로 생성한 프로필을 사용해 배포하려면 serverless deploy 명령어에 --aws-profile 옵션을 사용할 수 있습니다.

$ serverless deploy --aws-profile newAccount

여기서 newAccount는 Serverless Framework가 배포 시 사용할 AWS 프로필입니다.

매번 serverless deploy를 실행할 때마다 프로필을 설정하고 싶지 않다면, serverless.yml 파일에 추가할 수 있습니다.

service: service-name

provider:
  name: aws
  stage: dev
  profile: newAccount

여기서 profile: newAccount 라인을 주목하세요. 이는 Serverless Framework가 serverless deploy를 실행할 때 newAccount 프로필을 사용하도록 지시합니다.

스테이지별 프로필 설정

스테이지마다 다른 AWS 프로필을 지정하고 싶은 경우가 있습니다. 일반적으로 프로덕션 환경과 스테이징 환경이 완전히 분리된 경우가 이에 해당합니다. 각 환경은 고유한 API 엔드포인트, 데이터베이스 테이블, 그리고 무엇보다도 환경을 보호하기 위한 IAM 정책을 가지고 있습니다. 이를 효과적으로 관리하는 간단한 방법은 각 환경을 별도의 AWS 계정으로 분리하는 것입니다. AWS Organizations는 팀이 이러한 계정을 생성하고 관리하며, 사용 요금을 하나의 청구서로 통합할 수 있도록 도입되었습니다.

스테이지별로 여러 프로필을 사용하는 방법을 간단한 예제로 살펴보겠습니다. 이전 예제를 따라 프로덕션 환경에 배포하려면 다음과 같이 실행합니다.

$ serverless deploy --stage prod --aws-profile prodAccount

스테이징 환경에 배포하려면 다음과 같이 실행합니다.

$ serverless deploy --stage dev --aws-profile devAccount

여기서 prodAccountdevAccount는 각각 프로덕션 환경과 스테이징 환경의 AWS 프로필입니다.

이 과정을 단순화하기 위해 serverless.yml에 프로필을 추가할 수 있습니다. 이렇게 하면 serverless deploy 명령어에서 프로필을 지정할 필요가 없습니다.

service: service-name

custom:
  myStage: ${opt:stage, self:provider.stage}
  myProfile:
    prod: prodAccount
    dev: devAccount

provider:
  name: aws
  stage: dev
  profile: ${self:custom.myProfile.${self:custom.myStage}}

여기서 몇 가지 작업이 이루어집니다.

  • 먼저 custom.myStage${opt:stage, self:provider.stage}로 정의했습니다. 이는 Serverless Framework에게 --stage CLI 옵션의 값이 있으면 그 값을 사용하고, 없으면 provider.stage에 지정된 기본 스테이지를 사용하도록 지시합니다.
  • 또한 custom.myProfile을 정의하여 각 스테이지에 배포할 때 사용할 AWS 프로필을 포함시켰습니다. 이전과 마찬가지로 prod 스테이지에 배포할 때는 prodAccount 프로필을, dev 스테이지에 배포할 때는 devAccount 프로필을 사용합니다.
  • 마지막으로 provider.profile${self:custom.myProfile.${self:custom.myStage}}로 설정했습니다. 이는 custom.myStage에 정의된 현재 스테이지에 따라 프로필 값을 선택합니다.

이 예제에서는 Serverless Framework의 변수 개념을 사용했습니다. 이에 대한 자세한 내용은 Serverless 환경 변수 챕터에서 확인할 수 있습니다.

이제 프로덕션에 배포할 때 Serverless Framework는 prodAccount 프로필을 사용합니다. 그리고 리소스는 prodAccount 프로필 사용자의 AWS 계정 내에 프로비저닝됩니다.

$ serverless deploy --stage prod

스테이징에 배포할 때는 동일한 AWS 리소스 세트가 devAccount 프로필 사용자의 AWS 계정 내에 프로비저닝됩니다.

$ serverless deploy --stage dev

--aws-profile 옵션을 설정할 필요가 없습니다. 이제 여러분은 여러 AWS 프로필과 자격 증명을 사용하는 방법을 잘 이해하셨을 것입니다.