728x90

by Hyeong Sik Yang | on 20 6월 2023 | in Amazon Aurora, Amazon Route 53, AWS Step Functions, Database | Permalink |  Share

 

케이타운포유는 급성장 중인 K-Pop 및 한류 상품을 글로벌 판매하는 이커머스 서비스를 제공하는 회사로 2002년 서비스를 시작한 이래 200개국, 6개 언어로 500만 회원, 5,000여 개 팬클럽을 대상으로 서비스하고 있습니다. 케이타운포유는 B2B에서 B2C로 전환 후 2021년 매출액 2,000억을 돌파하며 짧은 기간에 15배에 달하는 성장을 하였습니다.

케이타운포유는 사용자서비스, 운영시스템, 물류시스템(WMS) 등의 시스템을 개발, 운영하고 있으며, 이를 위해 모든 시스템을 AWS 클라우드에서 구축/운영하고 있습니다. 2022년에 많은 버그를 해결함과 동시에 트래픽 수용을 위한 개선을 이뤘고, 2023년에는 상품구조 개선, 물류시스템 개선 및 고도화, 거대 모놀리식 레거시 시스템을 MSA 구조로 변경 진행 중에 있습니다.

순간적인 스파이크 트래픽에 따른 Aurora Auto Scaling 기능의 한계

케이타운포유는 이벤트 발생시 평소의 수배에서 수십배의 트래픽을 처리하고 있습니다. 어플리케이션에서 Amazon Elasticache를 적극 활용하여 서비스 안정성과 지연을 최소화하고 있지만 실시간 데이터베이스 쿼리를 요구하는 많은 API들로 인하여 급격한 데이터베이스 부하가 발생하고 있습니다. 예측 불가능한 이벤트로 발생한 데이터베이스 부하를 해소하기 위해 케이타운포유는 Aurora Cluster의 오토스케일링을 적극 활용하고 있습니다.

이벤트 발생시 Aurora 오토스케일링을 활용한 자동 Scale-out 또는 다수의 읽기 전용 인스턴스를 사전 증설을 하고 있음에도 아래와 같은 상황에 한계가 있습니다.

  • 예측 불가능한 순간적인 스파이크 트래픽 부하로 인한 서비스 장애 현상
  • Scale-out 발생시, 평균 15분 소요되는 읽기 전용 인스턴스 준비 시간
  • 비즈니스 특성상 최소 수 시간 전 읽기 전용 인스턴스 증설 비용
  • 예측 불가능한 이벤트 규모로 인한 과도한 대응과 리소스 낭비

이러한 비즈니스 요구사항과 예측 불가능한 트래픽의 대응 및 Aurora 오토스케일링 소요시간과 비용 문제를 해결하기 위해 개선된 오토스케일링 전략이 필요했습니다.

개선 아이디어

Aurora의 읽기 전용 인스턴스가 생성되는 약 15분 동안 트래픽을 여분의 인스턴스가 처리할 수 있다면 서비스 장애 문제를 해결할 수 있습니다. 읽기 전용 인스턴스가 생성되는 시간 동안에만 트래픽을 받고 평소에는 트래픽을 처리하지 않으며 트래픽을 처리한만큼만 요금을 지불하는 인스턴스가 있으면 이 문제를 효과적으로 개선할 수 있습니다. 그리고 이 구조는 이벤트 대응을 위해 사전에 증설하는 읽기 전용 인스턴스를 줄여 비용 최적화적으로도 도움이 될 것입니다. Cloudwatch에서 제공하는 Aurora RDS 메트릭의 해상도는 1분입니다. 순간적인 트래픽으로 인한 읽기 전용 인스턴스 부하의 빠른 감지와 빠른 오토스케일링을 위해 고해상도의 메트릭을 필요합니다.

이 아이디어를 정리해보면 필요한 인프라 변경요소는 다음과 같습니다.

  • 데이터베이스 부하 대응을 위한 고해상도 메트릭
  • 사용한 만큼 지불하는 여분의 인스턴스
  • 특정 임계치를 넘는 트래픽 발생시 여분의 인스턴스로 트래픽 분배하는 구조
  • 자동화된 운영 아키텍처

Amazon Aurora Hybrid(Mixed-Configuration) Cluster

Amazon Aurora DB Cluster는 다음과 같이 두 가지 유형의 DB 인스턴스로 구성됩니다.

  • 기본 DB 인스턴스 – 읽기 및 쓰기 작업을 지원하고, Cluster 볼륨의 모든 데이터 수정을 실행합니다.
  • Aurora 복제본(읽기 전용 인스턴스) – 기본 DB 인스턴스와 동일한 스토리지 볼륨에 연결되며 읽기 작업만 지원합니다.

Amazon Aurora 데이터베이스의 아키텍처 특징 중 하나는 컴퓨팅과 스토리지의 분리입니다. Amazon Aurora 스토리지는 데이터베이스의 데이터 양이 증가함에 따라 자동으로 크기가 조절됩니다.

Aurora Serverless v2는 CPU 및 메모리 리소스를 운영 중단 없이 자동적으로 크기가 조절됩니다. Aurora Serverless v2 용량에 대한 요금은 ACU 시간으로 측정됩니다. ACU는 약 2기가바이트(GB)의 메모리로 해당 CPU 및 네트워킹의 합한 용량입니다. 정의할 수 있는 Aurora Serverless v2 용량은 최소 0.5 ACU에서 최대 128 ACU입니다.

이러한 Amazon Aurora DB Cluster의 아키텍처로 특징으로 기존 프로비저닝 된 Aurora Cluster에 Aurora Serverless v2 읽기 전용 인스턴스를 추가하여, 아래 그림과 같이 Aurora Mixed-Configuration Cluster 형태로 구성 가능합니다. 케이타운포유는 이 데이터베이스 아키텍처를 Aurora Hybrid Cluster라고 부르고 있습니다.

커스텀 Aurora 오토스케일링 아키텍처

커스텀 Aurora 오토스케일링 아키텍처에서는 다음과 같은 로직으로 데이터베이스 부하를 처리합니다.

  • 기존 프로비저닝 된 Aurora Cluster에 추가된 Serverless v2 읽기 전용 인스턴스는 가중치가 0입니다. 가중치가 0이므로 평상시에는 트래픽이 발생하지 않아 Serverless v2 읽기 전용 인스턴스에 대한 요금이 부과되지 않습니다.
  • 만약, 기존 프로비저닝 된 Aurora Cluster의 읽기 전용 인스턴스의 평균 CPU 부하량이 임계치를 넘으면 알람을 발생합니다.
  • 알람이 발생되면, 가중치를 조절하여 추가된 Aurora Serverless v2 읽기 전용 인스턴스로 일부 트래픽을 전달합니다.
    • 가중치를 조절한 이후에도, 알람 상태를 지속적으로 확인하여 추가적인 트래픽 전환이 필요한지 판단합니다.
    • 만약, 알람이 해소되지 않고, 트래픽의 부하가 많은 상황이면, Serverless v2 읽기 전용 인스턴스가 더 많은 트래픽을 처리하도록 가중치를 추가 조절합니다.
  • 또한, 알람이 발생하였기 때문에, 기존 프로비저닝 된 Aurora Cluster에서 스케일 아웃이 발생하고, Provisioned 읽기 전용 인스턴스를 추가합니다.
  • 추가된 Provisioned 읽기 전용 인스턴스의 상태가 Available한 상태가 되면, 알람 상태를 확인하여 트래픽을 Provisioned 읽기 전용 인스턴스가 처리하도록 가중치를 조절합니다.
  • 최종적으로 알람이 해소된다면, serverless v2 읽기 전용 인스턴스의 가중치를 0으로 조절하여 사용을 중지하고, 요금을 발생하지 않습니다.

이러한 아이디어를 통해 효율적이고 안정적으로 데이터베이스를 사용할 수 있도록 아래와 같이 아키텍처를 변경하였습니다.

커스텀 Aurora 오토스케일링 아키텍처는 다음과 같이 크게 4개 영역으로 구분되어 동작합니다.

  • Aurora Serverless v2 읽기 전용 인스턴스 추가 및 커스텀 엔드포인트 설정
  • Enhanced Metric 지표 수집 및 Cloudwatch 커스텀 메트릭 생성
  • Step Functions을 이용한 Route53 가중치 기반 레코드의 가중치 조절
  • Cloudwatch 커스텀 메트릭을 이용한 Aurora Cluster 오토스케일링 설정

1. Aurora Serverless v2 읽기 전용 인스턴스 추가 및 커스텀 엔드포인트 설정

순간적인 스파이크 트래픽을 대응하기 위해 기존에 프로비저닝 된 Aurora Cluster에 Serverless v2 읽기 전용 인스턴스를 추가합니다. Serverless v2 읽기 전용 인스턴스를 최하위 우선순위로 설정해서 Fail-over 발생시, 쓰기 인스턴스로 승격되는 것을 방지할 수 있습니다. Serverless v2 읽기 전용 인스턴스를 여러 대 생성하면 더 급격한 스파이크 트래픽도 대응할 수 있습니다.

커스텀 엔드포인트는 아래와 같이 각각 설정합니다.

  • Provisioned 커스텀 엔드포인트
    • 평상시 트래픽을 처리할 기존 프로비저닝 된 Aurora Cluster에 속한 Provisioned된 읽기 전용 인스턴스 그룹을 가리키는 엔드포인트
  • Serverless v2 커스텀 엔드포인트
    • 임계치를 넘어가는 부하 트래픽을 처리하는 Serverless v2 읽기 전용 인스턴스를 가리키는 엔드포인트

이때, 오토스케일링으로 인해 추가되는 Provisioned 인스턴스는 Provisioned 커스텀 엔드포인트에만 추가되도록 설정합니다.

이렇게 생성된 각각의 커스텀 엔드포인트는 Route53에 Private Hosted Zone으로 도메인을 생성하고, 같은 서브 도메인으로 가중치 기반 라우팅 레코드((Weighted Based Record)를 각각 생성합니다. Serverless v2 커스텀 엔드포인트에 연결된 가중치 기반 레코드의 가중치 값은 0으로 설정합니다.

이 과정을 통해 설정된 DNS 주소로 감당 가능한 평상시의 트래픽은 Provisioned 커스텀 엔드포인트에 연결된 인스턴스가 처리하고, 임계치를 넘어가는 부하 트래픽은 Serverless v2 읽기 전용 인스턴스가 처리하여 최소한의 금액으로 서비스의 안정성을 높일 수 있습니다.

2. Enhanced Metric 지표 수집 및 커스텀 메트릭 생성

2.1. 고해상도 메트릭 수집

AWS Cloudwatch 통해 수집되는 Amazon Aurora의 기본 메트릭은 60초 단위로 수집됩니다. 순간적인 스파이크 트래픽에 따른 급격한 데이터베이스 CPU 사용률 변화를 감지하기위해 높은 해상도를 가진 메트릭의 수집이 필요합니다.

Enhanced Monitoring은 데이터베이스가 구동되는 OS의 메트릭을 최대 1초의 해상도로 모니터링 할 수 있습니다. Aurora Cluster의 인스턴스를 수정하여 Enhanced Monitoring을 활성화 합니다. 오토스케일링으로 생성되는 인스턴스는 기본 인스턴스의 설정을 공유하므로 기본 인스턴스의 Enhanced monitoring도 활성화 하여야 합니다.

Enhanced Monitoring 기능을 활성화 하면 RDSOSMetrics 라는 이름의 Cloudwatch Logs Groups에 해당 지표가 저장됩니다. 케이타운포유는 이 Log에서 추출한 지표를 통해 고해상도 메트릭을 구성하였습니다.

2.2 Subscription Filter를 이용한 메트릭 정제

Cloudwatch Logs Subscription Filter는 Cloudwatch에 Log로 수신되는 정보를 구독하여 Lambda, Kinesis 등의 서비스로 전송하는 기능입니다. RDSOSMetrics Log Group에는 Enhanced Monitoring 기능이 활성화된 모든 인스턴스들의 지표들이 수집되므로 subscription filter를 이용하여, 위에서 설정한 Provisioned 커스텀 엔드포인트의 대상이 되는 인스턴스 메트릭만을 정제하는 작업을 진행했습니다.

먼저, 아래 코드는 Lambda의 event로 전송된 압축된 로그를 읽을 수 있도록 처리하는 예시입니다.

import json
import base64
import gzip

def lambda_handler(event, context, metrics):
	data = event["awslogs"]["data"]
    decoded_data = base64.b64decode(data)
    decompressed_data = gzip.decompress(decoded_data)
    metric = json.loads(json.loads(decompressed_data)["logEvents"][0]["message"])
Python

다음으로 위에서 설정한 각 커스템 엔드포인트에 해당하는 읽기 전용 인스턴스의 지표만을 추출합니다. 하지만, 메트릭에서는 커스텀 엔드포인트를 기준으로 추출할 수 없습니다. 따라서, AWS boto3에서 제공하는 RDS의 describe_db_instances, describe_db_clusters API를 이용하여 available 상태인 읽기 전용 인스턴스의 CPU 사용량 메트릭만을 추출하였습니다.

instances_with_status = rds.describe_db_instances(
        Filters=[{"Name": "db-cluster-id", "Values": ["<CLUSTER_NAME>"]}]
    )["DBInstances"]

instances_with_primary = rds.describe_db_clusters(DBClusterIdentifier="<CLUSTER_NAME>")[
    "DBClusters"
][0]["DBClusterMembers"]

instances = []
for i in instances_with_status:
    for c in instances_with_primary:
        if i["DBInstanceIdentifier"] == c["DBInstanceIdentifier"]:
            instances.append(dict(i, **c))
            break

available_provisioned_read_replicas = [
    instance["DBInstanceIdentifier"]
    for instance in instances
    if instance["DBInstanceStatus"] in available_status
    and instance["DBInstanceClass"] != "db.serverless"
    and not instance["IsClusterWriter"]
Python

2.3 EMF를 이용한 실시간 메트릭 반영

빠른 메트릭 반영을 위해 EMF(Embedded Metric Format)을 이용합니다. EMF는 Cloudwatch에 맞춰진 구조화된 로그 포맷으로서, 메트릭 반영이 빠르다는 장점을 가지고 있으며 장애대응과 같은 실시간성 지표가 필요할때 사용할 수 있습니다.

Python을 런타임으로 사용한 Lambda의 경우 metric_scope decorator를 이용하여 쉽게 반영할 수 있습니다. 아래 코드는 Lambda에서 EMF를 이용해 Cloudwatch에 맞춰진 구조화된 로그 포맷으로 변환하는 예시입니다.

from aws_embedded_metrics import metric_scope
from aws_embedded_metrics.storage_resolution import StorageResolution

@metric_scope
def lambda_handler(event, context, metrics):
    #    ... metric data 추출 / 변환 ...
    metrics.set_dimensions("<METRIC_DIMENSION_NAME>": "<METRIC_DIMENSION_VALUE>"})
    metrics.put_metric("<METRIC_NAME>", "<METRIC_VALUE>", ageResolution.HIGH)
    metrics.set_namespace("<METRIC_NAMESPACE>")
Python

EMF를 사용하면 정제한 커스텀 메트릭 값(대상 인스턴스의 CPU 사용량)을 1초 이내에 Cloudwatch에서 확인할 수 있습니다.

3. Step Function을 이용한 Route53 레코드 가중치 조절

데이터베이스의 높은 부하 발생을 처리하는 알람 이벤트를 생성하고 트래픽 비율(Route53의 레코드 가중치)를 조절하는 Step Functions을 트리거 하여 프로비저닝 된 읽기 전용 인스턴스와 Serverless v2 읽기 전용 인스턴스 사이의 트래픽 비율을 조절하도록 구성하였습니다.

케이타운포유는 데이터베이스 부하 증가와 감소를 처리할 Step Functions을 분리하여 관리하였습니다. 아래는 부하 증가 시 발생되는 Step Functions을 기준으로 작성하였습니다.

3.1 읽기 전용 인스턴스 부하 알람 및 이벤트 트리거 구성

위에서 생성한 커스텀 메트릭을 이용하여 Cloudwatch Alarm을 생성합니다. 높은 데이터베이스 부하 알림 데이터 포인트는 적게, 낮은 부하 알림 데이터 포인트는 높게 설정하는 것으로 시스템 안정성을 높일 수 있습니다. AWS 네임스페이스 메트릭이 아닌 커스텀 메트릭을 사용할 경우, 알람의 데이터 포인트 주기를 최대 10초 까지 높일 수 있는 장점이 있습니다.

3.2 트래픽 비율 조절 Step Function 구성

Cloudwatch 알람 이벤트는 OK 상태에서 Alarm 또는 반대의 상태로 변경되는 최초 1회에서만 발생합니다. 스파이크 트래픽 이후에도 점진적으로 트래픽이 상승하는 경우에는 한번의 Route53 가중치 조절만으로는 안정성을 확보할 수 없습니다. 가중치 조절 이후, 데이터베이스의 상태를 지속적으로 점검하여 안정성을 확보하기 위해서 Step Functions을 사용합니다.

알람에 의한 Step Functions은 다음과 같이 동작합니다.

  • Route53에 Serverless v2 읽기 전용 인스턴스와 연결된 레코드의 가중치를 수정합니다.
  • 조절된 가중치가 실제 데이터베이스 사용량과 CloudWatch Alarm에 반영될 수 있도록 최소 Cloudwatch Alarm의 데이터 포인트 주기만큼 대기합니다.
  • Cloudwatch Alarm이 해결되었는지 확인합니다.
    • Alarm이 해결된 경우, Step Functions을 종료합니다.
    • Alarm이 해결되지 않은 경우, 다시 Route53 레코드의 가중치를 조절합니다.

AWS API를 사용하고 대기하는 등의 부분은 별도의 Lambda 없이 Step Function에 내장된 함수들을 사용하였습니다. 케이타운포유는 내장된 함수를 사용하여 Lambda 사용시간을 줄이고 비용을 최적화할 수 있었습니다.

4. 커스텀 메트릭을 이용한 Aurora 오토스케일링

Serverless v2 인스턴스의 CPU 사용량은 Max ACU 기준 사용중인 ACU로 계산됩니다. Aurora Cluster에서 제공하는 오토스케일링 기능은 아래와 같이 Aurora Cluster에 포함된 모든 읽기 전용 인스턴스의 평균 CPU 사용량을 기준으로 동작합니다.

이 계산방식으로 인해 Aurora Cluster에 포함된 모든 읽기 전용 인스턴스의 평균 CPU 사용량이 프로비저닝 된 읽기 전용 인스턴스들의 평균 CPU보다 낮게 계산되어, 원하는 CPU 기준에 오토스케일링이 발생하지 않는 문제가 있습니다.

따라서, 아래와 같이 프로비저닝 된 읽기 전용 인스턴스만으로 평균 CPU 사용량을 통해 실제 사용중인 리소스 기반으로 오토스케일링이 일어날 수 있도록 커스텀 메트릭에 기반한 오토스케일링을 구성하였습니다.

커스텀 메트릭을 이용하여 Aurora Cluster에 오토스케일링을 구성하기 위해 AWS 서비스 중 하나인 AWS Auto Scaling 서비스의 API를 사용하여야 합니다. AWS Auto Scaling 서비스는 DynamoDB, ECS, Aurora, EMR 등의 AWS 서비스의 오토스케일링 구현을 위한 서비스입니다. AWS Auto Scaling 서비스를 이용하면 Aurora Cluster에서 지원하는 오토스케일링 기준 지표인 “읽기 전용 인스턴스의 평균 CPU 사용량” 과 “읽기 전용 인스턴스의 평균 커넥션”이 아닌 별도의 메트릭을 통해 스케일링 정책을 구성할 수 있다는 장점이 있습니다.

AWS CLI를 사용하여 커스텀 메트릭을 사용하여 아래와 같이 각각 수행하여 Aurora Cluster에 오토스케일링을 구성하였습니다.

1. 오토스케일링에 사용할 대상을 등록합니다. 최소/최대 용량을 제어할 수 있습니다.

aws application-autoscaling register-scalable-target \
  --service-namespace rds \
  --scalable-dimension rds:cluster:ReadReplicaCount \
  --resource-id cluster:"<CLUSTER_NAME>" \
  --min-capacity "<MIN_CAPACITY>" \
  --max-capacity "<MAX_CAPACITY>"
Bash

2. 오토스케일링에 사용할 지표와 정책을 결정합니다.

aws application-autoscaling put-scaling-policy \
  --policy-name "<POLICY_NAME>" \
  --service-namespace rds \
  --resource-id cluster:"<CLUSTER_NAME>" \
  --scalable-dimension rds:cluster:ReadReplicaCount \
  --policy-type TargetTrackingScaling \
  --target-tracking-scaling-policy-configuration file://metric.json
Bash

케이타운포유는 초 단위의 Custom Metric을 활용하여 오토스케일링이 빠르게 적용될 수 있도록 구성하였습니다. Policy Type은 TargetTrackingScaling 로 하여 일반적인 부하 상황 모두 처리할 수 있도록 Policy를 구성하였습니다. TargetTrackingScaling은 현재 CPU 사용량에 기반하여 적당한 수준의 Read Replica를 늘리는 정책입니다. 서비스 워크로드 특성에 따라 StepScaling을 이용하여 지정된 사이즈만큼 증가하거나 감소 하도록 정책을 설정할 수 있습니다.

metric.json은 위에서 생성한 고해상도의 커스텀 메트릭을 이용하여 구성하였습니다.

{
  "TargetValue": "<TARGET_VALUE>",
  "CustomizedMetricSpecification": {
    "MetricName": "<METRIC_NAME>",
    "Namespace": "<METRIC_NAMESPACE>",
    "Dimensions": [
      {
        "Name": "<DIMENSION_NAME>",
        "Value": "<DIMENSION_VALUE>"
      }
    ],
    "Statistic": "Average",
    "Unit": "Percent"
  },
...
}
JSON

Serverless v2 읽기 전용 인스턴스를 활용한 Aurora Hybrid Cluster 아키텍처를 사용하면 상대적으로 더 높은 트래픽도 안정적으로 서비스할 수 있게 됩니다. 케이타운포유는 이 장점을 살려 기존 프로비저닝 된 Aurora Cluster의 오토스케일링에 구성하였던 targetValue 보다 높게 구성할 수 있었습니다.

커스텀 Aurora 오토스케일링 아키텍처 검증하기

테스트 환경

  • Amazon Aurora Cluster : r5.4xlarge x 2 (1 write, 1 read) + Serverless x 1 (1 read/ACU 0.5~128)
  • Provisioned Instance Type: c5.2xlarge
  • Scale-out 임계치 : 40%
  • 프로비저닝 / 서러비스 트래픽 전환 임계치 : 40% / 60%
  • Serverless v2 읽기 전용 인스턴스 트래픽 전환 비율 : 20% (프로비저닝 된 인스턴스 기준)

테스트 시나리오

  1. 테스트 시작 직후 급격한 트래픽을 주어 데이터베이스에 부하 발생
  2. 임계치 60%를 초과하면서 서버리스로 트래픽 전환 시작
  3. 프로비저닝 / 서버리스 엔드포인트 간의 트래픽 비율 미세 조절
  4. Scale-out ~ traffic shifting high threshold 사이의 CPU 구간으로 수렴
  5. Scale-out 발생
  6. read replica 추가로 프로비저닝 된 인스턴스의 CPU 부하 감소
  7. 위 과정 반복
  8. 테스트 종료

테스트 결과

AS-IS : Aurora Cluster (Provisioned Only)

평균 CPU 사용률

기존 프로비저닝 된 Aurora 읽기 전용 인스턴스만으로 구성된 Cluster에서는 위 그림과 같이 테스트 시작 직후 발생한 다량의 트래픽으로 인해 10여분간 CPU 사용량 100% 도달 및 서비스 장애가 발생하였습니다.

TO-BE : Aurora Hybrid Cluster (Provisioned + Serverless v2)

평균 CPU 사용률

개선 전 Aurora Cluster에서 Scale-out이 일어나는 약 10여분간 100%의 CPU 사용량을 유지하는 것과 달리, Aurora Hybrid Cluster에서는 순간적인 CPU 부하 증가를 감지 후 Serverless v2 읽기 전용 인스턴스로 트래픽을 전환하여 안정적인 CPU 사용량을 유지하는 것을 확인할 수 있었습니다.

엔드포인트 별 커넥션 증가율

또한, 오토 스케일일링으로 인해 Scale-out이 일어난 후에는 Serverless v2 읽기 전용 인스턴스로 전환되는 트래픽의 비율을 점진적으로 낮추고 Scale-out이 완료된 이후에는 모든 트래픽이 Provisioned 인스턴스로 전환되는 것을 확인할 수 있습니다.

결과

기존 프로비저닝 된 Aurora Cluster와 Aurora Serverless v2 인스턴스를 동시 접목한 Aurora Hybrid Cluster 아키텍처로 인해 케이타운포유는 크게 다음과 같은 부분에서 시스템이 개선되었습니다.

서비스 안정성

Aurora Hybrid Cluster 아키텍처는 이벤트 전 예상치 못한 글로벌 스파이크 트래픽이 발생하여도 Serverless v2 인스턴스를 통해 안전하게 트래픽에 대한 대응이 가능합니다.

시스템 성능

데이터베이스의 안정적인 사용량은 어플리케이션의 성능과도 연관됩니다. 테스트 결과 초기 데이터베이스 과부하 상태에서 테스트 쿼리에 대한 응답속도는 하이브리드 구성에서 평균 80ms, 미구성일 경우 220ms 확연한 차이가 나타납니다.

오토스케일링 시간 단축

AWS namespace를 가지는 메트릭의 알람 데이터 주기는 최소 1분입니다. 하지만 별도의 커스텀 메트릭을 통하여 데이터 포인트 주기를 최대 10초로 낮출 수 있습니다. 이 고해상도 메트릭을 통해서 오토스케일링은 더욱 빠르게 반영됩니다.

비용 절감

케이타운포유는 이벤트 대응을 위해 최소 1시간 이전에 읽기 전용 인스턴스를 증설합니다. 서비스의 안정성을 최우선으로 하기때문에 읽기 전용 인스턴스는 예측되는 트래픽보다 최소 20% 이상 추가 증설합니다. 하지만 일부 이벤트는 정확한 시간을 미리 알 수 없기 때문에 수시간 전 미리 증설하기도 하며 이로 인하여 발생하는 비용 누수는 한달에 수십대*시간의 규모입니다. Aurora Hybrid Cluster 아키텍처는 사전 불필요한 인스턴스 증설이 필요없기 때문에 약 30%의 이벤트 비용을 절감할 수 있었습니다.

위 사항을 정리하면 다음과 같습니다.

  기존 클러스터 하이브리드 클러스터
서비스 장애 시간 평균 15분 내외 장애 없음
장애구간 서비스 응답 속도 평균 220ms 평균 80ms
서비스 비용 비용 추가 발생 (CloudWatch, Lambda 등) 비용 추가 발생 (CloudWatch, Lambda 등)
이벤트 대응 비용 (비율) 100% 70% (30% 절감)
오토스케일링 정밀도 최대 1분 최대 10초

이처럼 Aurora Hybrid Cluster 아키텍처 구성을 통해 예측하지 못한 순간적인 스파이트 트래픽에 대해서 신속한 트래픽 전환을 통해 서비스의 안정성을 빠르게 회복할 수 있었습니다. 그리고 시스템 성능, 빠른 대응이 가능한 오토스케일링, 그리고 비용 측면에서 크게 개선되었습니다.

마무리

기업의 64%가 1년 안에 서비스 중단을 경험했으며 평균 25시간 이상의 다운타임을 겪은 것으로 조사되었습니다. 또한 ITIC가 1,000명 이상의 직원을 보유한 기업을 대상으로 한 조사 결과에 따르면 해당 기업의 98%는 서비스 중단에 따른 손실이 시간당 1억원을 초과합니다. 서비스 중단을 최소화하여 손실을 막고 비즈니스의 성과를 달성하기 위한 노력은 중요합니다.

Aurora Serverless v2 인스턴스를 지원하는 엔진은 Aurora MySQL 3 이상, Aurora PostgreSQL 13, Aurora PostgreSQL 14, Aurora PostgreSQL 15 입니다. Aurora Cluster의 엔진 버전이 낮은 경우, Aurora Serverless v2를 사용하도록 기존 클러스터 업그레이드 또는 전환을 참조 하시거나, 새로운 Blue/Green Deployment 기능을 활용하여 DB 업그레이드 작업을 더 안전하고 빠르게 업그레이드 진행을 수행하시기를 권장 드립니다.

Aurora Hybrid(Mixed-Configuration) Cluster를 활용한 개선된 커스텀 오토스케일링 아키텍처는 AWS에서 제공하는 다양한 API 기반의 기능과 로깅을 활용하여 쉽고 빠르게 구축할 수 있었습니다. 또한, 여러 번의 아키텍처 개선 과정을 거쳐 최종적으로 AWS에서 제공하는 Cloudwatch Log를 활용하여 Cloudwatch Alarm 기반으로 동작하도록 자동화하였기 때문에 운영, 관리 부담도 크게 줄일 수 있었습니다. 특히, 이러한 아키텍처는 데이터베이스 부하 대응을 위한 용도 이외, Serverless v2 읽기 전용 인스턴스를 다양한 용도로 활용 가능한 장점이 있습니다.

케이타운포유의 Aurora Hybrid Cluster 구축 사례가 서비스 안정성 향상과 성능, 비용 등 다양한 데이터베이스 문제를 겪고 있는 분들께 훌륭한 대안이 되기를 기대합니다.

참고

 

'Cloud' 카테고리의 다른 글

Secure Connectivity from Public to Private: Introducing EC2 Instance Connect Endpoint  (0) 2023.06.20
컨테이너  (0) 2022.08.15
728x90

by Sheila Busser | on 14 JUN 2023 | in Amazon EC2, Amazon VPC, Announcements, Compute, Customer Solutions, Security, Identity, & Compliance, Technical How-To | Permalink |  Share

 

 

This blog post is written by Ariana Rahgozar, Solutions Architect, and Kenneth Kitts, Sr. Technical Account Manager, AWS.

Imagine trying to connect to an Amazon Elastic Compute Cloud (Amazon EC2) instance within your Amazon Virtual Private Cloud (Amazon VPC) over the Internet. Typically, you’d first have to connect to a bastion host with a public IP address that your administrator set up over an Internet Gateway (IGW) in your VPC, and then use port forwarding to reach your destination.

Today we launched Amazon EC2 Instance Connect (EIC) Endpoint, a new feature that allows you to connect securely to your instances and other VPC resources from the Internet. With EIC Endpoint, you no longer need an IGW in your VPC, a public IP address on your resource, a bastion host, or any agent to connect to your resources. EIC Endpoint combines identity-based and network-based access controls, providing the isolation, control, and logging needed to meet your organization’s security requirements. As a bonus, your organization administrator is also relieved of the operational overhead of maintaining and patching bastion hosts for connectivity. EIC Endpoint works with the AWS Management Console and AWS Command Line Interface (AWS CLI). Furthermore, it gives you the flexibility to continue using your favorite tools, such as PuTTY and OpenSSH.

In this post, we provide an overview of how the EIC Endpoint works and its security controls, guide you through your first EIC Endpoint creation, and demonstrate how to SSH to an instance from the Internet over the EIC Endpoint.

 


AWS EC2 를 이용하여 Private Network 와 Public Network 를 더 쉽게 설계할 수 있는 방법이 등장했다.

 

기존에는 LB - WEB - WAS - DB 정도로 이루어진 아키텍쳐가 어느정도 처리를 가지고 있었다고 가정하면, 이제는 쓸데없이 WEB쪽에서 Reverse Proxy 를 이용하여 전달할 필요가 없다는 이야기이다.

(물론 이  경우에도 분명히 말하지만, 당시 회사에서는 WEB 부분에서 실질적으로 처리되는 것이라곤 nginx 에서 설정하는 일부 값이였기에 굉장히 무의미하긴 했다.)

 

결과적으로 아마 내, 외부망 분리라고 하는 것은 VPC 에 있는 IGW에 노출시키고 그 발이 닿는것이냐에 대한 질문이 아니였을까 생각한다.


EIC Endpoint product overview

EIC Endpoint is an identity-aware TCP proxy. It has two modes: first, AWS CLI client is used to create a secure, WebSocket tunnel from your workstation to the endpoint with your AWS Identity and Access Management (IAM) credentials. Once you’ve established a tunnel, you point your preferred client at your loopback address (127.0.0.1 or localhost) and connect as usual. Second, when not using the AWS CLI, the Console gives you secure and seamless access to resources inside your VPC. Authentication and authorization is evaluated before traffic reaches the VPC. The following figure shows an illustration of a user connecting via an EIC Endpoint:

Figure 1. User connecting to private EC2 instances through an EIC Endpoint

EIC Endpoints provide a high degree of flexibility. First, they don’t require your VPC to have direct Internet connectivity using an IGW or NAT Gateway. Second, no agent is needed on the resource you wish to connect to, allowing for easy remote administration of resources which may not support agents, like third-party appliances. Third, they preserve existing workflows, enabling you to continue using your preferred client software on your local workstation to connect and manage your resources. And finally, IAM and Security Groups can be used to control access, which we discuss in more detail in the next section.

Prior to the launch of EIC Endpoints, AWS offered two key services to help manage access from public address space into a VPC more carefully. First is EC2 Instance Connect, which provides a mechanism that uses IAM credentials to push ephemeral SSH keys to an instance, making long-lived keys unnecessary. However, until now EC2 Instance Connect required a public IP address on your instance when connecting over the Internet. With this launch, you can use EC2 Instance Connect with EIC Endpoints, combining the two capabilities to give you ephemeral-key-based SSH to your instances without exposure to the public Internet. As an alternative to EC2 Instance Connect and EIC Endpoint based connectivity, AWS also offers Systems Manager Session Manager (SSM), which provides agent-based connectivity to instances. SSM uses IAM for authentication and authorization, and is ideal for environments where an agent can be configured to run.

Given that EIC Endpoint enables access to private resources from public IP space, let’s review the security controls and capabilities in more detail before discussing creating your first EIC Endpoint.

Security capabilities and controls

Many AWS customers remotely managing resources inside their VPCs from the Internet still use either public IP addresses on the relevant resources, or at best a bastion host approach combined with long-lived SSH keys. Using public IPs can be locked down somewhat using IGW routes and/or security groups. However, in a dynamic environment those controls can be hard to manage. As a result, careful management of long-lived SSH keys remains the only layer of defense, which isn’t great since we all know that these controls sometimes fail, and so defense-in-depth is important. Although bastion hosts can help, they increase the operational overhead of managing, patching, and maintaining infrastructure significantly.

IAM authorization is required to create the EIC Endpoint and also to establish a connection via the endpoint’s secure tunneling technology. Along with identity-based access controls governing who, how, when, and how long users can connect, more traditional network access controls like security groups can also be used. Security groups associated with your VPC resources can be used to grant/deny access. Whether it’s IAM policies or security groups, the default behavior is to deny traffic unless it is explicitly allowed.

EIC Endpoint meets important security requirements in terms of separation of privileges for the control plane and data plane. An administrator with full EC2 IAM privileges can create and control EIC Endpoints (the control plane). However, they cannot use those endpoints without also having EC2 Instance Connect IAM privileges (the data plane). Conversely, DevOps engineers who may need to use EIC Endpoint to tunnel into VPC resources do not require control-plane privileges to do so. In all cases, IAM principals using an EIC Endpoint must be part of the same AWS account (either directly or by cross-account role assumption). Security administrators and auditors have a centralized view of endpoint activity as all API calls for configuring and connecting via the EIC Endpoint API are recorded in AWS CloudTrail. Records of data-plane connections include the IAM principal making the request, their source IP address, the requested destination IP address, and the destination port. See the following figure for an example CloudTrail entry.

 Figure 2. Partial CloudTrail entry for an SSH data-plane connection

EIC Endpoint supports the optional use of Client IP Preservation (a.k.a Source IP Preservation), which is an important security consideration for certain organizations. For example, suppose the resource you are connecting to has network access controls that are scoped to your specific public IP address, or your instance access logs must contain the client’s “true” IP address. Although you may choose to enable this feature when you create an endpoint, the default setting is off. When off, connections proxied through the endpoint use the endpoint’s private IP address in the network packets’ source IP field. This default behavior allows connections proxied through the endpoint to reach as far as your route tables permit. Remember, no matter how you configure this setting, CloudTrail records the client’s true IP address.

EIC Endpoints strengthen security by combining identity-based authentication and authorization with traditional network-perimeter controls and provides for fine-grained access control, logging, monitoring, and more defense in depth. Moreover, it does all this without requiring Internet-enabling infrastructure in your VPC, minimizing the possibility of unintended access to private VPC resources.

Getting started

Creating your EIC Endpoint

Only one endpoint is required per VPC. To create or modify an endpoint and connect to a resource, a user must have the required IAM permissions, and any security groups associated with your VPC resources must have a rule to allow connectivity. Refer to the following resources for more details on configuring security groups and sample IAM permissions.

The AWS CLI or Console can be used to create an EIC Endpoint, and we demonstrate the AWS CLI in the following. To create an EIC Endpoint using the Console, refer to the documentation.

Creating an EIC Endpoint with the AWS CLI

To create an EIC Endpoint with the AWS CLI, run the following command, replacing [SUBNET] with your subnet ID and [SG-ID] with your security group ID:

aws ec2 create-instance-connect-endpoint \
    --subnet-id [SUBNET] \
    --security-group-id [SG-ID]

After creating an EIC Endpoint using the AWS CLI or Console, and granting the user IAM permission to create a tunnel, a connection can be established. Now we discuss how to connect to Linux instances using SSH. However, note that you can also use the OpenTunnel API to connect to instances via RDP.

Connecting to your Linux Instance using SSH

With your EIC Endpoint set up in your VPC subnet, you can connect using SSH. Traditionally, access to an EC2 instance using SSH was controlled by key pairs and network access controls. With EIC Endpoint, an additional layer of control is enabled through IAM policy, leading to an enhanced security posture for remote access. We describe two methods to connect via SSH in the following.

One-click command

To further reduce the operational burden of creating and rotating SSH keys, you can use the new ec2-instance-connect ssh command from the AWS CLI. With this new command, we generate ephemeral keys for you to connect to your instance. Note that this command requires use of the OpenSSH client. To use this command and connect, you need IAM permissions as detailed here.

Once configured, you can connect using the new AWS CLI command, shown in the following figure:

Figure 3. AWS CLI view upon successful SSH connection to your instance

To test connecting to your instance from the AWS CLI, you can run the following command where [INSTANCE] is the instance ID of your EC2 instance:

aws ec2-instance-connect ssh --instance-id [INSTANCE]

Note that you can still use long-lived SSH credentials to connect if you must maintain existing workflows, which we will show in the following. However, note that dynamic, frequently rotated credentials are generally safer.

Open-tunnel command

You can also connect using SSH with standard tooling or using the proxy command. To establish a private tunnel (TCP proxy) to the instance, you must run one AWS CLI command, which you can see in the following figure:

Figure 4. AWS CLI view after running new SSH open-tunnel command, creating a private tunnel to connect to our EC2 instance

You can run the following command to test connectivity, where [INSTANCE] is the instance ID of your EC2 instance and [SSH-KEY] is the location and name of your SSH key. For guidance on the use of SSH keys, refer to our documentation on Amazon EC2 key pairs and Linux instances.

ssh ec2-user@[INSTANCE] \
    -i [SSH-KEY] \
    -o ProxyCommand='aws ec2-instance-connect open-tunnel \
    --instance-id %h'

Once we have our EIC Endpoint configured, we can SSH into our EC2 instances without a public IP or IGW using the AWS CLI.

Conclusion

EIC Endpoint provides a secure solution to connect to your instances via SSH or RDP in private subnets without IGWs, public IPs, agents, and bastion hosts. By configuring an EIC Endpoint for your VPC, you can securely connect using your existing client tools or the Console/AWS CLI. To learn more, visit the EIC Endpoint documentation.

728x90

컨테이너란?

컨테이너는 데스크탑, 기존의 IT 또는 클라우드 등 어디서나 실행될 수 있도록 애플리케이션 코드가 해당 라이브러리 및 종속 항목과 함께 패키징되어 있는 소프트웨어 실행 유닛입니다.

이를 수행하기 위해 컨테이너는 OS의 기능(Linux 커널의 경우, 이름 공간 및 cgroups 프리미티브)을 활용하여 프로세스를 격리하고 해당 프로세스가 액세스할 수 있는 CPU, 메모리 및 디스크의 양을 제어하는 운영 체제(OS) 가상화의 형식을 활용합니다.

가상 머신과는 달리 컨테이너는 모든 인스턴스에 게스트 OS를 포함할 필요가 없으며, 그 대신 호스트 OS의 기능과 리소스를 간편하게 활용할 수 있습니다. 따라서 컨테이너는 소형이고, 빠르며, 이식성이 뛰어납니다.

컨테이너는 FreeBSD Jails 및 AIX Workload Partitions 등의 버전으로 수십 년 전에 처음 소개되었지만, 최신 개발자들 중 대부분은 Docker의 소개에 따라 2013년에 최신 컨테이너 시대가 도래했다고 기억합니다.

 

-> Docker 가 Container Environment 를 이끌면서 시대가 도래했다고 인식하는 경향이 많다. 실제적으로 이후에 Docker의 전체적인 DevOps 적 Mainternance를 위해서 Orchestration Tools 인 K8s 가 도입되었고, 많은 부분에서 정식적으로 K8s 에 대한 정식지원 발표로 인하여, K8s 가 대표적인 Tool 이 되었다.

 

 

컨테이너 vs. 가상 머신(VM)

컨테이너를 보다 잘 이해하는 한 가지 방법은 기존의 가상 머신(VM)과의 차이점을 살펴보는 것입니다. 온프레미스에 있건 혹은 클라우드에 있건 이와 무관하게, 기존의 가상화에서는 하이퍼바이저를 활용하여 물리적 하드웨어를 가상화합니다. 그리고 각각의 VM에는 애플리케이션, 이와 연관된 라이브러리 및 종속 항목과 함께 OS가 실행해야 하는 하드웨어의 가상 사본인 게스트 OS가 포함됩니다.

기반 하드웨어를 가상화하는 대신, 컨테이너는 운영 체제(일반적으로 Linux)를 가상화함으로써 각 개별 컨테이너에는 오직 애플리케이션과 함께 해당 라이브러리와 종속 항목만 포함됩니다. 게스트 OS의 부재는 컨테이너가 경량이며 빠르고 포터블한 이유를 설명합니다.

이러한 비교를 좀더 자세히 살펴보려면 "컨테이너 vs. VM: 차이점"을 참조하세요.

 

- 간단하게 요약하자면 VM에서는 하이퍼바이저를 활용하여 물리적 하드웨를 가상화한다는 소리는 Partition의 일부를 떼어 실제적으로 가상환경을 꾸릴 수 있게 가상화를 꾸린다고 설명하는 것이다.

그리고 이에 대한 Dependencies 인 Library, Guest OS(상주하는 OS)를 올린다고 생각하면 되는 듯 하다.

 

- Container 의 경우 Application 과 함께 Dependencies 만 올라간다. 그러니까 Guest OS 가 탑재되지 않은 상태에서 초경량 상태로 올라가기 때문에 K8s 는 이를 활용하여 replication 을 구축하고 일정 처리속도를 담아 지속적인 무중단 서비스를 운영할 수 있다.

 

컨테이너의 이점

특히 VM과 비교하여, 컨테이너의 주요 장점은 경량화와 이식성을 제공하는 추상화 레벨을 제공하는 것입니다.

  • 경량: 컨테이너는 시스템 OS 커널을 공유함으로써 애플리케이션마다 전체 OS 인스턴스가 필요하지 않으며, 리소스에서 컨테이너 파일의 소형화와 간편함을 제공합니다. 특히 가상 머신과 비교하여 더 작아진 크기로 덕분에 수평 확장되는 클라우드 네이티브 애플리케이션을 보다 잘 지원하며 신속한 스핀업이 가능합니다.

    - 이 말인 즉슨, 시스템 OS Kernel 을 Sharing 한다는 부분에서, System OS Kernel (미리 컴파일된 커널이 상시 대기중인 상태로 base 로 공유됨 으로 진지구축을 빠르게 할 수 있따는 것이다.

  • 이식성 및 플랫폼 독립성: 컨테이너가 모든 종속 항목들을 자신과 함께 전달하므로, 일단 소프트웨어를 한 번만 작성하면 랩탑, 클라우드 및 온프레미스 컴퓨팅 환경에서 이를 재구성하지 않고도 바로 실행할 수 있습니다.
  • 최신형 개발 및 아키텍처 지원: 플랫폼 간의 배치 이식성/일관성 및 소형 크기의 조합 덕분에, 컨테이너는 최신형 개발에 매우 이상적입니다. 또한 DevOps, 서버리스  마이크로서비스 등의 빌드되어 있는 애플리케이션 패턴은 소규모 증분의 일반 코드 배치입니다.
  • 활용도 향상: 이전의 VM처럼, 컨테이너를 사용하여 개발자와 운영자는 물리적 시스템의 CPU 및 메모리 활용도를 향상시킬 수 있습니다. 컨테이너의 보다 큰 장점은 마이크로서비스 아키텍처도 허용하므로 애플리케이션 컴포넌트를 보다 미세하게 배치 및 스케일링할 수 있다는 점입니다. 이는 단일 컴포넌트의 과중한 로드로 인해 전체 모놀리식 애플리케이션을 확장해야 하는 데 대한 매력적인 대안이 될 수 있습니다.

 

컨테이너에 대한 유스케이스

컨테이너는 특히 클라우드 환경에서 점점 더 두각을 나타내고 있습니다. 많은 기업들은 심지어 자체 애플리케이션과 워크로드에 대한 범용 컴퓨팅 플랫폼으로서 VM의 대용으로 컨테이너를 고려하고 있습니다. 그러나 이러한 광범위한 분야 내에서, 컨테이너가 특히 의미가 있는 주요 유스케이스가 있습니다.

  • 마이크로서비스: 컨테이너는 소형이고 경량입니다. 따라서 이는 애플리케이션이 다수의 느슨하게 결합되고 독립적인 배치가 가능한 소형 서비스들로 구성되는 마이크로서비스 아키텍처에 매우 적절합니다.
  • DevOps: 아키텍처로서 마이크로서비스와 플랫폼으로서 컨테이너의 결합은 소프트웨어의 구축, 장착 및 실행 방안으로서 DevOps를 채택하는 많은 팀들의 공통 기반입니다.
  • 하이브리드, 멀티클라우드: 컨테이너가 랩탑, 온프레미스 및 클라우드 환경의 어디서나 일관되게 실행될 수 있으므로, 이는 기업들이 자체 데이터 센터와 결합하여 다수의 혼합형 퍼블릭 클라우드에서 운영을 수행하는 하이브리드 클라우드  멀티클라우드 시나리오의 이상적인 기반 아키텍처입니다.
  • 애플리케이션 현대화 및 마이그레이션: 애플리케이션 현대화의 가장 일반적인 접근 방법 중 하나는 클라우드로의 마이그레이션이 가능하도록 이를 컨테이너화함으로써 시작됩니다.

    - 이 부분이 가장 중요한 핵심 포인트라 생각한다. 일반적인 접근 방법 중 하나라고 하지만, Container 화를 한다는 것은 Application 현대화 (말이 좀 거창하지) 하여 빨리 빨리 진지구축을 할 수 있도록 한다는 것이다.

컨테이너화

컨테이너를 활용하려면 소프트웨어를 서로 다르게 설계 및 패키징해야 하며, 이러한 프로세스를 통상적으로 컨테이너화라고 합니다.

애플리케이션을 컨테이너화하는 경우, 해당 프로세스에는 이와 관련된 환경 변수, 구성 파일, 라이브러리 및 소프트웨어 종속 항목과 함께 애플리케이션을 패키징하는 작업이 포함됩니다. 최종 결과물은 이후에 컨테이너 플랫폼에서 실행될 수 있는 컨테이너 이미지입니다. 자세한 정보를 얻으려면 아래의 "컨테이너화 설명" 동영상(08:09)을 시청하세요.

 
- 예를 들어, Root Base 인 Container 가 있다고 생각하고 이후에 파생된 Container 에서는 B형태 C형태 등으로 일부 소프트웨어가 구분되어 사용되어 질 수 있다. 그러니까 일일히 하나씩 쪼갠다고 생각하면 된다.
 

Kubernetes의 컨테이너 오케스트레이션

기업들이 종종 최신형 클라우드 네이티브 아키텍처의 일부로서 컨테이너를 채택하기 시작하면서, 개별 컨테이너의 단순성은 분산형 시스템에서 수백 개(심지어 수천 개)의 컨테이너를 관리하는 복잡성과 충돌하기 시작했습니다.

이러한 문제를 해결하기 위해, 다음을 포함하여 해당 라이프사이클 전체에서 방대한 볼륨의 컨테이너를 관리하는 방법으로서 컨테이너 오케스트레이션이 부상하게 되었습니다.

  • 프로비저닝
  • 중복성
  • 상태 모니터링
  • 리소스 할당
  • 스케일링 및 로드 밸런싱
  • 물리적 호스트 간의 이동

이러한 문제들의 해결을 지원하고자 많은 컨테이너 오케스트레이션 플랫폼(예: Apache Mesos, Nomad 및 Docker Swarm)이 구축되었지만, 2014년에 Google에서 소개한 오픈 소스 프로젝트인 Kubernetes는 순식간에 가장 인기 있는 컨테이너 오케스트레이션 플랫폼의 자리를 차지했습니다. 또한 이는 업계의 대부분이 관련 표준화 작업을 수행하는 플랫폼이기도 합니다.

Kubernetes를 이용하여 개발자와 운영자는 YAML 파일을 통해 전체 컨테이너 환경의 원하는 상태를 선언할 수 있습니다. 그 이후에는, Kubernetes가 해당 애플리케이션이나 워크로드에 대한 지정된 수의 인스턴스 배치, 실패 시에 해당 애플리케이션의 재부팅, 로드 밸런싱, 자동 스케일링, 제로 다운타임 배치 등을 포함한 활동을 통해 해당 상태를 설정 및 유지하는 온갖 힘든 작업들을 수행합니다.

Kubernetes에 대해 자세히 알아보려면, Kubernetes의 개요에 대한 Sai Vennam의 설명을 제시하는 아래의 동영상(10:59)을 시청하세요.

 

 

Kubernetes는 현재 Linux Foundation의 후원을 받는 벤더 애고니스틱 산업 그룹인 CNCF(Cloud Native Computing Foundation)에서 운영하고 있습니다.

 

 

Istio, Knative 및 확장형 컨테이너 에코시스템

컨테이너가 애플리케이션의 패키징과 실행을 위한 인기 있는 방법으로 지속적으로 성장함에 따라, 프로덕션 유스케이스를 강화하고 확장하도록 설계된 툴과 프로젝트의 에코시스템 또한 지속적인 증가세를 보이고 있습니다. Kubernetes 외에도, 컨테이너 에코시스템에서 가장 인기 있는 2개의 프로젝트는 바로 Istio 및 Knative입니다.

 

- K8s 이외에 가장 인기있는게 저거 2개라고 하는데 솔직히 잘 모르겠다.

 

 

Istio

개발자가 컨테이너를 활용하여 마이크로서비스 아키텍처를 빌드하고 실행하므로, 관리 문제는 이제 개별 컨테이너의 라이프사이클 고려사항을 벗어나서 엄청난 수의 소형 서비스(이를 종종 "서비스 메시"라고 함)들이 서로 간에 연결되고 서로 간에 관련되는 방식으로 이동하고 있습니다. Istio는 개발자가 검색, 트래픽, 모니터링, 보안 등과의 연관된 문제들을 보다 손쉽게 관리할 수 있도록 만들어졌습니다. Istio에 대해 자세히 알아보려면, "Istio의 정의"를 살펴보고 아래의 "Istio 설명" 동영상(05:06)을 시청하세요.

 

 

Knative

서버리스 아키텍처 역시 특히 클라우드 네이티브 커뮤니티 내에서 지속적으로 늘어나는 인기를 실감하고 있습니다. Knative의 엄청난 가치는 컨테이너형 서비스를 서버리스 기능으로 배치할 수 있는 능력입니다.

항상 실행되면서 필요 시에 응답(서버 작동과 유사함)하는 대신, 서버리스 기능은 "제로(0)로 스케일링"될 수 있습니다. 즉, 이는 호출되지 않는 한 전혀 실행되지 않습니다. 수만 개의 컨테이너에 적용되는 경우, 이 모델은 엄청난 양의 컴퓨팅 파워를 절감할 수 있습니다.

Knative에 대해 자세히 알아보려면 아래의 "Knative 정의" 동영상(07:58)을시청하세요.

 
728x90
ssh -i /path/my-key-pair.pem ec2-user@public-dns-hostname

해당 키페어로 접근한뒤 데몬에 대한 설정을 수정하고 서비스를 재시작한다.


다음과 같이 접근하기 전에 다음과 같은 오류가 발생한다.

오류: 보호되지 않는 프라이빗 키 파일

다른 사용자의 읽기 및 쓰기 작업으로부터 프라이빗 키 파일을 보호해야 합니다. 프라이빗 키를 본인 이외의 다른 모든 사람이 읽거나 쓸 수 있는 경우 SSH는 키를 무시하고 다음과 같은 경고 메시지를 표시합니다.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0777 for '.ssh/my_private_key.pem' are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. bad permissions: ignore key: .ssh/my_private_key.pem Permission denied (publickey).

인스턴스에 로그인할 때 이와 비슷한 메시지가 표시되면 오류 메시지의 첫 줄을 살펴보고 인스턴스에 올바른 퍼블릭 키를 사용하고 있는지 확인합니다. 위의 예에서는 프라이빗 키 .ssh/my_private_key.pem 및 파일 권한 0777이 사용되어 모든 사람에게 이 파일에 대한 읽기 또는 쓰기가 허용됩니다. 이 권한 수준은 전혀 보호되지 않는 수준이므로 SSH에서는 이 키를 무시합니다. 오류를 해결하려면 프라이빗 키 파일 경로를 대체하는 다음 명령을 실행합니다.

[ec2-user ~]$ chmod 0400 .ssh/my_private_key.pem

키페어 파일에 대한 권한이 너무 공공적이라는 것. 키페어에 대한 권한을 수정하고 다시 접근한다.



/etc/ssh/sshd_config 접근

=> sudo vi /etc/ssh/sshd_config 


PasswordAuthentication을 yes로 수정 그리고 저장


ssh 재시작

=> /etc/init.d/ssh restart


그리고 putty로 접속하니 해결


문제는 이와같은 해결방법은 정석적인 해결방법이 아니다.

애초에 키페어가 존재하던 이유는 PasswordAuthentication 에 대한 BruteForce 를 방지하기 위하여 만들었던 것.


Public IP Address 에 대한 Open Permission 이 아니라, specific IP Address 에 대한 지정이 확립되어야 함.

'Cloud > AMAZON' 카테고리의 다른 글

Make an AMI public  (0) 2023.08.12
[AWS CLI] modify-image-attribute  (0) 2023.08.12
[Trouble Shooting] Instance Check Failed issue  (0) 2023.08.08
Viewing AWS account identifiers  (0) 2023.08.01
DB 인스턴스를 지정된 시간으로 복원  (0) 2018.05.30

+ Recent posts