AWS

[AWS] aws 강의 섹션 12 (IMDS, CLI with MFA, CLI Credentials Provier Chain, Exponential Backoff)

대기업 가고 싶은 공돌이 2024. 10. 1. 01:02

EC2 인스턴스 Metadata (IMDS)

  • EC2 인스턴스에 대한 메타데이터 및 사용자 데이터를 검색하는 데 사용되는 서비스다.
  • IAM 역살을 사용하지 않고 특정 URL을 통해 알 수 있다.
  • http://169.254.169.254/latest/meta-data 를 예시로 들었다.

메타 데이터에서 알 수 있는 것

  • 인스턴스 이름
  • 퍼블릭 ip
  • 프라이빗 ip
  • IAM Role 이름만 조회
    • 해당 Role의 이름만 알 수 있고 어떤 정책이 있는진 알 수 없다.
  • 자격 증명 정보 조회 
  • 유저 데이터 (빌드 스크립트)

IMDS의 두 가지 버전

IMDS v1

  • 인스턴스 메타데이터 서비스 첫 번째 버전이다.
  • URL에 접근해서 바로 사용할 수 있다

IMDS v2

  • 아마존 리눅스 2023 부터 기본으로 활성화 돼있는 보안이 더 강화된 버전이다.
  • 서비스를 이용하려면 두 단계를 거쳐야 한다.
    • put 메소드로 세션 토큰을 얻어야 한다.
    • 토큰을 헤더에 포함하여 IMDS URL을 호출한다.

aws CLI에서 계정 관리하기

aws CLI는 기본적으로 하나의 계정만을 관리하지만

profile 명령어를 통해 여러 개의 계정을 관리할 수도 있다.

  • aws configure --profile myprofile
    • 여기서 myprofile은 프로필 이름이다.
    • 이 명령을 실행하면 해당 프로필에 대한 aws 액세스 키, 시크릿 키 리전 등등을 설정할 수 있다.
  • 이후 .aws/credentials 파일에 들어가면 자격 증명을 확인할 수 있다. 

CLI를 활용한 MFA (다중 인증)

  • CLI를 사용하려면 임시 세션을 생성해야 하고, 
  • API를 사용하려면 STS GetSession Token을 사용해야 한다.
    • STS GetSession Token은 다중 인증에서 자격 증명을 얻기 위해 호출해야 하는 API다
    • 위 API 호출을 통해 받은 자격증명은 최대 36시간 동안 유효하다.
    • 함께 세션 토큰도 반환되게 되는데, 이 토큰을 AWS API 호출 시에 함께 제공해야 한다.
    • MFA가 활성화된 사용자는 GetSessionToken을 호출할 때 MFA 인증 토큰을 같이 제공해야
      임시 자격 증명을 발급받을 수 있다. 
{
    "Credentials": {
        "AccessKeyId": "ASIAEXAMPLE",
        "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
        "SessionToken": "FQoGZXIvYXdzEJr//////////EXAMPLETOKEN",
        "Expiration": "2024-01-01T12:34:56Z"
    }
}

SDK

  • 애플리케이션에서 AWS 서비스를 호출하게 도와준다.
  • 다양한 언어의 AWS용 공식 SDK가 있다.

  • CLI를 사용할 때는 python CLI를 사용했다.
  • CLI가 파이썬 언어를 사용하고 BOTO3 SDK를 사용한다고 한다.
  • SDK는 DynamoDB나 S3같은 AMAZON 서비스에서 API 호출을 발행할 때 사용한다.
  • 언제 SDK를 사용하는지 아는 것이 중요하다.
    • 나중에 람다 함수를 다룰 때 자세히 다룬다고 한다.

알아야 할 것은 리전을 저장하지 않고, 기본 리전을 지정하지 않으면,

API 호출을 위해서 us-east-1이 기본 리전으로 선택된다는 점이다. 

AWS Limits (Quotas)

  • aws 서비스나 리소스 사용 시 각 서비스마다 정의된 사용 한도를 의미한다.
  • 한도는 기본적으로 설정된 값이 있지만 필요에 따라 한도를 늘릴 수도 있다.

리밋 종류는 두 가지가 존재한다.

  API Rate Limit

  • aws API를 연속으로 호출하는 횟수 제한을 의미한다.
  • 예를 들어, EC2의 Describeinstances API는 초당 100회 호출의 제한이 있다.
  • S3의 GetObject는 한 prefix마다 매초 5500의 get 제한이 존재한다.
    • 따라서 애플리케이션 사용량이 많아지면 오류가 발생한다.
    • 그럴 경우 API 제한 증가를 요청해야 한다.

Service Quotas (Service Limits)

  • 서비스 사용량 제한으로 실행할 수 있는 리소수 수의 제한을 의미한다.
  • 온디맨스 인스턴스의 경우 최대 1,152개의 CPU를 사용할 수 있다. 
    • 더 많은 CPU를 사용하려면 티켓을 통해 한도 증가를 요청해야 한다.
    • 서비스 할당량 API를 이용해서 요청할 수도 있다.

즉, 하나의 리소스에는 API 비율 제한과 서비스 할당량이 있는 것이다.

 

사용량이 너무 많아져 오류가 발생할 때는 지수 백오프를 사용해야 한다.

Exponential Backoff (any AWS service)

  • ThrottlingException이 발생했을 때 지수 백오프를 사용한다.
    • ThrottlingException이란 API 호출량이 너무 많은 것을 의미한다.
  •  AWS SDK를 사용하면 이 지수백오프 매커니즘은 기본적으로 SDK 동작에 포함돼 있다.
  •  AWS API를 그대로 사용한다면 지수 백오프를 사용해야 한다.
    • 지수 백오프를 다시 시도해야 하는 경우를 고르는 문제가 간간히 출제 된다.
      • 자체 SDK를 실행하는 경우나,
      • 자체 사용자 정의 HTTP 호출
      • 500으로 시작하는 내부 오류 코드
      • 등이 빌생하면 재시도 매커니즘을 실행해야 한다. 
      • 4xx는 클라이언트 오류다
    • 지수 백오프란 오류나 실패가 발생했을 때, 재시도 간격을 점점 길게 늘리면서 시도하는 방법이다.
    • 문제가 생겼을 때 바로 바로 재시도 하지 않고, 간격을 점점 늘리는 것이다.
    • 1 -> 2 -> 4 -> 8 로 2의 제곱으로 늘어난다.

AWS CLI Credentials Provier Chain

  • AWS CLI에서 자격증명을 찾는 순서를 의미한다.
  • Command Line option
    • region, output, profile 등의 명령어를 통해 자격 증명을 입력하는 것이다.
  • 환경변수 설정
    • 커맨드 라인에서 설정하지 않으면 환경 변수에 저장된 값이 자격증명으로 사용된다.
  • CLI credentials file
  • CLI configuration file
  • container credentials - for ECS 
  • instance profile credentials - for EC2 instance Profiles

위에서 아래 순서대로 자격증명을 찾는다. 

 

SDK Default Credentials provider Chain

JAVA SDK를 예로 살펴보자

  1. Java system properties
  2. environment variables
  3. default credential profiles file
  4. ecs container credentials 
  5. instance profile credentials 

중요한 것은 환경 변수가 여전히 우선시 된다는 것이다.

 

자격 증명 예시 시나리오

  • ec2에서 애플리케이션을 배포하고 IAM 유저의 환경변수를 통해 S3 API를 호출하는 상황이다.
  • IAM 유저는 S3FullAccess 권한을 가진다.
  • 여기서 EC2 인스턴스에 IAMRole을 통해 여러 개의 S3 버킷 중 단 하나의 S3 버킷에만 접근할 수 있게 설정해 놓는다.

이렇게 설정하더라도 IAM 유저는 여전히 모든 S3 버킷에 접근할 수 있다.

 

이유는 환경변수에 설정된 자격증명이 더 우선순위가 높기 때문이다.

 

이를 해결하기 위해선 instance profile 보다 상위에 있는 모든 요소에서 자격증명을 없애야 한다.

Credentials Best Practices

  • 절대로 자격 증명을 코드에 저장하면 안 된다. (외부 유출 금지)
  • IAM Role을 최대한 많이 사용하자.
    • Ec2 인스턴스에는 EC2 인스턴스 Role을 부여하고
    • ECS에는 ECS 역할을
    • 이런 식으로 자격 증명을 관리해라
  • aws 서비스를 사용하지 않는 경우엔 환경 변수를 사용하거나 profile 파일을 사용하자 

Signing AWS API requests

  • API 요청에 인증 정보를 추가하는 것을 의미한다. 
  • 어느 API 요청이든지 signing 즉 서명을 추가해야 한다.
    • 그래야 aws가 호출자가 누구인지 알고 요청할 자격이 있는지 인증한다.
  • 서명은 액세스키와 시크릿 키 즉 자격 증명을 바탕으로 생성한다.
  • 대부분의 API 호출에는 서명이 필요하다.
  • 서명은 Signature V4 를 사용해야한다.

서명을 AWS 에게 전달하는 방법이 두 가지 있다.

  • Authorization 헤더에 서명을 넣어 전달하는 방법
  • 쿼리 스트링을 이용하는 방법 
    • 서명을 직접 URL에 넣는 방법이다.
    • 서명의 이름은 X-Amz-Signature이다.

AWS SDK(AWS Java SDK, Python boto3 등)나 AWS CLI를 사용할 때는 사용자가 직접 서명을 만들 필요가 없다.

자동으로 만들어 준다.