Category: Compute


EC2 VPC VPN 신규 기능 – NAT 탐색, 암호화 옵션 추가 등

Amazon Virtual Private Cloud(VPC)를 사용하면 논리적으로 분리된 네트워크 영역을 AWS 클라우드에 만들 수 있습니다. VPC에서 원하는 IP 주소 범위를 결정하여, 서브넷을 만들고 라우팅 테이블을 설정합니다. 또한, 사내에서 하드웨어 VPN 어플라이언스에 연결하도록 네트워크 게이트웨이를 만들 수 있습니다.

AWS 클라우드에서 동작하는 가상 프라이빗 네트워크(VPN)는 VPN 게이트웨이 또는 VGW로서 고객 데이터 센터 네트워크에 있는 고객 게이트웨이(CGW)와 연결할 수 있습니다. 오늘 이러한 VPN 서비스에 몇 가지 새로운 기능을 추가했습니다.

  • NAT 탐색 지원
  • 암호화 옵션 추가
  • CGW IP 주소 재사용

이 세 가지의 새로운 기능을 활성화하기 위해서는 새로 VGW를 만들고 필요한 매개 변수와 함께 새로운 VPN 터널을 만들어야 합니다.

NAT 탐색 지원
네트워크 주소 변환 (NAT)은 특정 IP 주소 범위를 다른 IP 주소 범위로 변환하는 변환맵(Map)을 가집니다. VPC를 만들고 원하는 IP 대역대를 설정했을 때 여러 서브넷으로 만들어지고, 여러분의 EC2 인스턴스는 VPC내에 서브넷 중 하나에 연결됩니다. 이제 이를 VGW에 연결하려면 NAT 탐색 혹은 NAT-T를 사용 해야합니다. NAT-T는 사내 네트워크를 NAT 장치 뒤에 숨기면서, VPC에 연결할 수 있도록 합니다.

이러한 매핑은 VPN 연결이 만들어 질 때 자동으로 이루어집니다. AWS 관리 콘솔로 설정할 필요가 없으며, NAT 장치 탐색 기능을 사용하고 UDP 포트 4500 번을 사용할 수 있도록 방화벽(Firewall)을 설정하면 됩니다.

암호화 옵션 추가
여러 가지 암호화 옵션을 사용할 수 있습니다. VPC에 있는 하드웨어 VPN은 기존 데이터 센터 네트워크와 VPN에 연결되면, 여러 가지 다른 강도의 암호화 옵션을 제공합니다. 이제는 AES256을 기존의 AES128를 대체하여 사용하도록 권장됩니다. 새로운 암호 옵션을 사용한다면 전달 받는 측의 장치에서 AES128을 받지 않게 설정 해야합니다.

두 엔드포인트 사이에서는 Diffie-Hellman 키 공유 프로토콜에 의해 중요한 정보를 공유합니다. DH 그룹은 키의 해시 강도 결정과 공유에 사용됩니다. 이제는 몇 개의 그룹에서 선택할 수 있습니다.

  • Phase 1에서는 DH 그룹 2, 14-18, 22, 23 및 24.
    <liPhase 2에서는 DH 그룹 1, 2, 5, 14-18, 22, 23 및 24.

VPN에 연결 된 패킷은 해시 알고리즘을 사용하여 검증합니다. 해시가 일치하는 경우, 패킷이 도중에 변경되지 않았음을 나타냅니다. 이제 256 비트 다이제스트(SHA-256)를 사용한 SHA-2를 사용할 수 있습니다. 강도가 약한 알고리즘을 사용하지 않도록 장치를 설정하여 주어야 합니다.

CGW IP 주소 재사용성
이제는 CGW을 만들 때마다 IP 주소가 고유할 필요는 없습니다. 즉, 사용하는 IP 주소를 재사용 할 수 있다는 것입니다. VPC를 사용하고 있는 사용자로부터 많은 요구가 있었던 기능입니다.

자세한 내용은 FAQVPC 네트워크 관리자 가이드를 참조하십시오.

Jeff;

이 글은 EC2 VPC VPN Update – NAT Traversal, Additional Encryption Options, and More의 한국어 번역입니다.

EC2 Run Command – 대규모 원격 인스턴스 관리

지속적인 운영이 되는 일반적인 서버(또는 Amazon Elastic Compute Cloud (EC2) 의 용어로 인스턴스)로 이루어진 정적인 컴퓨팅 환경에서 대규모의 역동적이고 이질적인 환경에 마이그레이션 할 때 인스턴스를 새로운 방식으로 관리하고 제어 할 필요가 있습니다.

신규 EC2 Run Command

이를 위해 오늘 EC2 Run Command 신규 기능을 소개합니다. 이 기능은 인스턴스 (숫자와 관계 없이) 관리를 쉽고 안전한 방법으로 할 수 있습니다. 소프트웨어 설치, 특별한 스크립트 또는 Microsoft PowerShell 명령 실행, Windows Update 구성 등 다양한 엔터프라이즈 시나리오를 지원하도록 설계되어 있습니다. AWS Management Console, AWS Command Line Interface (CLI) , AWS Tools for Windows PowerShell , 그리고 AWS SDKs 에서 접근할 수 있습니다. 만약 현재 개별 인스턴스를 PS1 스크립트 또는 개별 PowerShell 명령에서 관리하고 있으시다면, 이를 하나 이상의 인스턴스에서 수행 할 수 있습니다.

이 기능은 많은 사용자와 고객들께서 요청해 주셨고, 아래 내용은 그 내용 중 일부입니다.

  • 인스턴스에 대한 구성 변경을 일관성을 가지면서 임시(ad-hot) 구현할 필요성
  • 여러 인스턴스에 걸쳐 신뢰성과 일관성있는 결과의 필요성
  • 변경을 실시 할 수있는 사람과 할 수 있는 권한 제어의 필요성
  • 어떤 조치가 이루어 졌는지의 명확한 감사(Auditing)의 경로
  • 전체 원격 데스크톱 (RDP) 접근의 필요 없이 위의 사항을 하고자 하는 필요성

명령어 실행 방식은 안전하고, 신뢰할 수 있는 방법이며 편리할 뿐만 아니라 확장성이 높습니다. 자신의 명령어을 작성한 후, AWS Identity and Access Management (IAM)를 사용한 세밀한 권한 제어를 수행 할 수 있습니다. 예를 들어, 신뢰할 수 있는 사용자 그룹에 의해 엄격하게 통제된 특정 세트의 인스턴스에서 실행할 수 있는 관리 명령을 지정할 수 있습니다. 모든 명령어는 감사를 위해 AWS CloudTrail를 통해 중앙에서 기록 및 감사 할 수 있게 됩니다.

명령어 실행의 이점
새로운 Run Command의 기능은 다음과 같은 이점을 제공하도록 설계되어 있습니다 :

  • 제어 및 보안: IAM 정책과 규칙(Rule)을 사용하여 명령어와 인스턴스에 대한 접근 통제를 할 수 있습니다. 따라서 인스턴스에 직접 접근하는 사용자의 수를 줄일 수 있습니다.
  • 신뢰성: 구성 변경 템플릿을 생성하여 시스템의 신뢰성을 향상 시킬 수 있습니다. 이를 통해 예측 가능성을 높이면서 구성 불일치를 줄이기 위한 제어가 가능합니다.
  • 가시성: Run Command을 통해 명령어 추적을 지원하여 CloudTrail 와 통합을 통한 구성 변경 사항에 대한 시각화가 가능합니다.
  • 용이성: 미리 정의 된 명령어 세트를 선택하여 실행하고, 관리 콘솔, CLI 또는 API를 통해 진행 상황 추적을 할 수 있습니다.
  • 사용자 정의: Run Command를 자신의 조직의 요구에 맞춘 사용자 정의 명령어로 만들 수 있습니다.

EC2 콘솔에서 Run Command 실행
Run Command는 모든 윈도우 인스턴스에서 동작하고 인스턴스 기존 EC2Config 에이전트를 사용합니다. 콘솔을 열고 Commands를 선택하고 Run Command를 사용하기 위한 조건을 확인하십시오 :

Run a command를 클릭하여 메인 Run Command 화면으로 이동합니다. 기존의 실행 결과(있는 경우)와 Run a command 버튼이 보입니다

디스플레이의 각 열은 인스턴스에서 실행 된 명령어을 나타내고 있습니다. Run a command를 클릭하여 새로운 명령을 시작합니다.

Command document 메뉴에는 7개의 미리 정의 된 명령어 및 계정에서 만든 사용자 정의 명령이 있습니다.

사용자 활용 사례에 맞춘 적절한 기술 문서와 대상 인스턴스에 대해 원하는 변경 사항을 적용할 수 있습니다. 각 문서에는 적절한 것을 선택할 수 있는 몇 가지 설명이 있습니다. 일반적인 관리 작업을 위해서는 AWS-RunPowerShellScript문서를 사용합니다. 이를 통해 모든 PowerShell 명령어을 실행하거나 기존 PowerShell 스크립트를 호출할 수 있습니다.

문서를 선택한 후, 명령어(ipconfig를 사용)를 입력하여 관심 있는 인스턴스를(속성, 태그 또는 키워드 필터링 가능) 선택합니다.

명령어 또는 스크립트를 실행하면 표준 출력에 많은 결과가 생성되고, S3 버킷 및 주요 접두어를 지정하여 결과를 저장할 수 있습니다. 그렇지 않으면, Run Command는 콘솔 출력의 처음 2500문자를 캡처하고 표시합니다.

준비가 되면 Run을 클릭합니다. 콘솔에 확인 메시지가 표시됩니다.

명령어 기록으로 돌아가서 그 결과를 확인해 봅니다.

원하는 명령어를 골라서 Output 탭을 선택합니다.

그리고 View Output을 선택합니다.

실제 환경에서 실행하기
자신의 AWS 환경에서 Run Command를 사용하는 몇 가지 방법입니다 :

  • 타사 에이전트 및 소프트웨어 설치 및 구성
  • 로컬 그룹 및 사용자 관리
  • 설치된 소프트웨어 또는 패치 확인 및 결과 수행
  • 윈도 서비스 다시 시작
  • 예약 된 작업 업데이트

정식 출시
Run Command 기능은 오늘 부터 US East (Northern Virginia), US West (Oregon), and Europe (Ireland) 리전에서 사용 가능합니다. Run Command Console을 열거나 최신 AWS Tools for Windows PowerShell, AWS Command Line Interface (CLI)를 사용하시기 바랍니다. 이 서비스는 AWS 자원 사용 요금을 제외하고 무료로 제공됩니다.

Jeff;

PS – Linux를 실행하는 인스턴스에도 같은 기능을 제공하는 것을 계획하고 있습니다. 추가 정보도 곧 알려드리겠습니다.

이 글은 New EC2 Run Command – Remote Instance Management at Scale의 한국어 번역입니다.

AWS Unity SDK 로 간단한 게임 구현하기

AWS는 다양한 프로그래밍 언어를 위한 소프트웨어 개발 도구(SDK)를 제공하고 있습니다. Python, Java, PHP 등은 물론이고, 최근에는 C/C++를 지원하는 SDK도 발표를 하였습니다. 또한, 모바일 앱을 개발을 지원하는 AWS Mobile SDK가 있습니다. AWS Mobile SDK는 iOS, Android, Fire OS 그리고 오늘 설명 드릴 Unity를 지원합니다.

Unity는 잘 알려진 게임 개발 통합 플랫폼입니다. 주로 3D게임을 편리하게 개발하기 위한 기능과 툴을 제공하고 있으며, Unity를 통해 개발된 많은 게임이 존재합니다. Unity는 게임 디자인부터 사운드와 물리 엔진 등의 여러가지 기능과 네트워크 기능도 제공하고 있습니다. AWS Mobile SDK는 기본적으로 Mobile apps에서 AWS 를 쉽게 접근할 수 있도록 함수를 제공하는 것이 기본적인 목적입니다.

따라서, AWS Mobile SDK for Unity는 Unity를 통해서 모바일 게임 등을 개발할 때 직접 Unity 코드에서 SDK를 이용하여 AWS 에서 제공하는 서비스들을 편리하게 사용할 수 있습니다.

아래 내용은 SurvivalShooter라는 공개 데모 게임에 AWS Unity SDK를 설치하고 개발하여 실제 게임에서 AWS Cognito를 통해 인증 및 데이타 싱크, S3에서 설정 파일 다운로드, Facebook과 인증 연동, 게임 정보와 로그를 DynamoDB에 기록, Mobile analytics로 게임 로그 전송을 구현한 예제입니다. 전체 코드를 참조하여 주시고, 설명은 각각의 주요 내용에 대한 핵심 부분을 간략히 설명하겠습니다.

☞샘플 코드: https://s3-ap-northeast-1.amazonaws.com/www.cloudinternal.com/SurvivalShooterAWS.zip

참고: 본 가이드는 AWS Mobile SDK for Unity Preview 버전을 기반으로 작성되어 최신 정식 SDK 버전과 약간의 차이가 있을 수 있습니다.

1. AWS Mobile SDK for Unity 소개

AWS Unity SDK는 현재(21-Oct-2015) 아래 AWS 서비스를 지원하고 있습니다. 아래 AWS 서비스를 사용하기 위한 .NET Classes를 제공하고 있어, Unity로 게임을 개발하면서 아래 서비스를 사용하기 위해 클래스를 호출하여 개발을 하게 됩니다. 최근에는 AWS Lambda를 추가로 지원하면서 Unity로 개발된 게임에서 Lambda 함수를 호출하여 (별도 백엔드 서버를 통한 처리가 아니라) 이벤트 기반 개발 로직 처리 및 구현이 가능합니다. SDK 내용을 보면 아래의 각 서비스의 플러그인 패키지로 구성되어 있습니다.

2. Unity 및 AWS Unity SDK 설치

AWS Unity SDK는 Unity version 4.x 와 5.x 의 버전과의 호환성을 가지고 있으며, 4.0~4.2버젼의 경우는 설치 시에 몇 가지 작업이 필요합니다. AWS Unity SDK의 소개와 설치에 대한 부분은 아래 링크에서 상세히 가이드하고 있습니다. 아래 링크를 참조하시어 개발 환경 구성을 구성하십시오. 순서를 요약하면 아래와 같습니다.

  1. Unity 다운로드 및 설치
  2. AWS Unity SDK 다운로드 설치
  3. AWS Unity SDK 설정 (생략을 하고 코드에서 직접 지정을 할 수도 있습니다.)
  4. Amazon Cognito를 통해 AWS Credentials 획득
  5. 주요 개발 문서:

3. Amazon Cognito 인증하기

AWS Unity SDK에서 AWS 리소스에 접근하기 위해서는 인증이 필요하게 됩니다. 인증을 위한 정보가 바로 AWS Credential입니다. 보통 access key, secret key로 구성하나, 모바일 게임을 개발하면서 지정된 키를 직접 코드에 넣는 것은 좋은 방법이 아닙니다. 모바일 인증을 손쉽게 하기 위한 빌딩 블럭인 Amazon Cognito를 통해 쉽게 구성할 수 있습니다.

Amazon Cognito는 Identity pool을 구성하고 해당 풀에 사용자 정보를 저장할 수 있습니다. 그리고 해당 Identity pool에 IAM 역할(role)을 정의하여 게임 사용자가 어떤 AWS 서비스를 이용할 수 있는지 정할 수 있습니다. 예를 들어 IAM role에서 DynamoDB에 PutItem API를 허락하도록 추가한다면 사용자는 AWS Cognito를 통해 전달 받은 임시 토큰을 통해 DynamoDB에 직접 데이터를 입력할 수 있습니다.

그 과정을 살펴 보도록 하겠습니다. 먼저 아래 아래 코드와 같이 AWSManager.cs 파일에 Credential provider를 생성합니다.


public string IDENTITY_POOL_ID = "";
public string ANALYTICS_APP_ID = "";
public RegionEndpoint ENDPOINT = RegionEndpoint.USEast1;

private CognitoAWSCredentials credentials;
private CognitoSyncManager syncManager;

// Create a Credentials provider that uses Cognito Identity
credentials = new CognitoAWSCredentials(IDENTITY_POOL_ID, ENDPOINT);

IDENTITY_POOL_ID를 입력 받아 코드에서 해당 Identity pool ID를 읽어 인증을 진행하게 됩니다. Unity개발 도구의 Inspector에서 생성한 ID를 입력하도록 합니다. AWS 콘솔에서는 아래와 같이 Amazon Cognito 메뉴로 이동하여, Identity pool을 생성하여 인증 사용자와 비인증 사용자가 이용할 IAM 역할(Role)을 선택합니다. 위에서 설명 드린 것처럼 IAM Role에 AWS 서비스에 접근할 수 있는 권한이 주어져야 개발된 게임에서 해당 서비스에 접근을 할 수 있습니다.

4. Amazon Cognito 데이터 싱크

Amazon Cognito는 사용자 별로 데이터를 각각 저장하고 동기화하는 기능을 제공합니다. 멀티 플랫폼에서 사용자와 애플리케이션 정보를 유지하여 지속적으로 서비스에 활용하도록 하는 기능입니다. 데모 게임에서는 플레이어의 위치를 Cognito Dataset에 저장하고 다음 플레이에 해당 위치에서 시작하도록 예를 구성하였습니다.

AWSManager 클래스에서 CognitoSynchManager를 생성



// Cognito Sync Manager
syncManager = new DefaultCognitoSyncManager(
credentials, new AmazonCognitoSyncConfig { RegionEndpoint = ENDPOINT });
//UserDataManager에서 플레이어 위치 정보를 저장하고 읽어 올 수 있도록 구현합니다.
public Dataset GetUserProfileDataset() {
	return userProfileDataset;
}

public void SetPlayerPosition(Vector3 pos) {
	userProfileDataset.Put("position", NDCUtil.stringFromVector3(pos));
}

public Vector3 GetUserPosition() {
	Vector3 pos = NDCUtil.vector3FromString(userProfileDataset.Get("position"));
	if (pos == null) {
		pos = new Vector3(0, 0, 0);
		userProfileDataset.Put("position", NDCUtil.stringFromVector3(pos));
	}
return pos;
}

public void SyncUserProfile() {
	userProfileDataset.Synchronize();
}

Amazon S3 파일 가져오기

Amazon S3 스토리지 서비스를 게임 자원의 DLC(Downloadable Content)에 활용하면 편리하게 파일 형태의 데이터를 저장하고 읽어 올 수 있습니다. 정적 콘텐츠(Static Contents)는 물론 게임 내에서 활용할 설정이나 환경 설정(Configuration) 정보를 저장하여 게임 시작 시 다운로드하여 게임에 쉽게 활용할 수 있습니다.

이 예제 게임에서는 S3 URL을 입력하여 간단한 JSON 형태의 입력 파일을 게임 시작 시 다운로드 합니다. DLCManager 클래스에서 다운로드 코드를 구현합니다. S3를 보다 잘 사용하기 위해서는 AmazonS3Client를 이용하면 편리합니다.


public string DLC_URL = "";
public void CheckDLC() {
	WWW www = new WWW(DLC_URL);
	print (GameManager.Instance);
	StartCoroutine(WaitForDLCRequest(www));
}

IEnumerator WaitForDLCRequest(WWW www) {
	yield return www;

	// check for errors
	if (www.error == null) {
		GameManager.Instance.UpdateStatusMessage("DLC updating...");
		Debug.Log("WWW Ok!: " + www.text);
		ParseAndUpdateDLC(www.text);
		GameManager.Instance.UpdateStatusMessage("Facebook initializing...");
	//  FB.Init(FacebookInitCallback);

		GameManager.Instance.OnDLCUpdateEnded();
	} else {
		Debug.Log("WWW Error: "+ www.error);
		GameManager.Instance.UpdateStatusMessage("Failed to update content: " + www.error, false);
		}
}

AmazonS3Client를 활용할 경우 아래의 예제 코드를 간단히 변경하여 적용이 가능합니다.


private void GetObject()	{
	ResultText.text = string.Format("fetching {0} from bucket {1}",
	SampleFileName, S3BucketName);
	Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) =< {
		string data = null;
		var response = responseObj.Response;
	        if (response.ResponseStream != null) {
		      using (StreamReader reader = new StreamReader(response.ResponseStream)) {
		      data = reader.ReadToEnd();
		     }
	        ResultText.text += "\n";
	        ResultText.text += data;
	       }
        });
}

5. Facebook과 인증 연동하기

Amazon Cognito Identity 는 Facebook, Google, Amazon, Twitter/Digits 및 OpenID를 이용한 연동 인증을 지원합니다. 이 게임 예제에서는 Facebook을 인증 제공자로 선택하여 인증할 수 있도록 구현하였습니다.

앞에 설명한 것처럼 Cognito는 비인증 사용자(Unauthenticated user)와 인증 사용자(Authenticated user)를 구분하여 지원할 수 있습니다. Facebook developers 페이지에서 앱을 등록하여 ID를 발급받아 Amazon Cognito Identity pool에 등록하는 과정이 필요합니다.

아래와 같이 Facebook developer 페이지에서 앱을 등록하여 ID를 발급받습니다.

Amazon Congito 에서 생성한 Identity pool의 설정에 아래와 같이 ID를 등록합니다.

보다 상세한 내용은 아래 링크를 참조해 주십시오.

http://docs.aws.amazon.com/cognito/devguide/identity/external-providers/facebook/

Unity에 Facebook 연동으로 위해 Facebook SDK를 설치합니다. 아래 링크에서 다운로드가 가능합니다.

https://developers.facebook.com/docs/android

Facebook 연동 인증은 FacebookManager.cs로 구현되어 있습니다. GUI로 화면에서 로긴 정보를 입력할 수 있도록 구현되어 있습니다.

위에서 Find Access Token을 누르면 Facebook 페이지에서 사용자 토큰(User token)을 발급받아 입력할 수 있습니다. 키를 입력하고 Login을 누르면 Facebook 과 연동하여 Authenticated user로 인증을 진행 할 수 있습니다.

6. Amazon Mobile Analytics 사용하기

Amazon Mobile Analytics 서비스는 모바일 게임 또는 서비스에서 나오는 사용자 및 매출 통계, 캠페인을 통한 결과 등 비지니스를 위한 다양한 정보를 그래프와 함께 제공해 주는 기능입니다. 또한 맞춤형 이벤트(Custom Events)를 만들어주면 원하는 통계를 받아 볼 수 있습니다. 게임이라면 게임 내에 일어나는 다양한 이벤트를 Amazon Mobile Analytics로 간단히 추가해서 반영할 수 있습니다.

이 게임 예제에서는 게임 중에 Enemy와 Damage에 대한 정보와, 세션 시간에 대한 정보를 예제로 Amazon Mobile Analytics Custom events로 보내는 내용이 구현되어 있습니다. 참조하여 다양한 정보를 간단한 코드 추가로 분석해 볼 수 있는 기능입니다.

Amazon Mobile Analytics를 이용하기 위해서는 App을 등록하는 과정이 필요합니다 등록하여 ID를 발급 받아 해당 아디이로 생성한 App에 데이터를 넣을 수 있게 됩니다. 아래 그림은 콘솔에서 Mobile analytics app을 생성한 내용입니다.

위에 App ID를 Unity inspector에서 Cognito ID처럼 동일하게 값을 입력하여 코드에서 읽어 사용하게 됩니다.

AWSManage 클래스에 구현되어 있는 코드는 아래와 같습니다. AnalyticsManager를 생성하고 원하는 통계치 메트릭을 추가합니다.


// Amazon Mobile Analytics Manager
analyticsManager = AmazonMobileAnalyticsManager.GetOrCreateInstance(
	credentials, ENDPOINT, ANALYTICS_APP_ID);
//-------
public void RecordEnemyHit(string weapon, int damage, string enemyName, int score) {
	AmazonMobileAnalyticsEvent customEvent = new AmazonMobileAnalyticsEvent("ShooterEnemyHit");
	customEvent.AddAttribute("Enemy", enemyName);
	customEvent.AddMetric("Damage", damage);
	analyticsManager.RecordEvent(customEvent);
}

public void RecordSessionTime(int time) {
	AmazonMobileAnalyticsEvent customEvent = new AmazonMobileAnalyticsEvent("SessionTime");
	customEvent.AddMetric("SessionTime", time);
	analyticsManager.RecordEvent(customEvent);
}

DynamoDB에 데이터 적재하기

AWS Unity SDK는 직접 DynamoDB에 데이터를 넣고 쓸 수 있도록 지원하고 있습니다. 중간에 다른 Back-end server를 구현하지 않고, 직접 NoSQL 데이터베이스인 DynamoDB를 읽고 쓸 수 있는 방법은 비용을 줄이고 빠르게 개발할 수 있는 장점이 있습니다. 이 게임 예제에서는 UserInfo와 ShotInfo라는 두 개의 테이블을 만들어 사용자 정보와 사용자가 게임을 하면서 발생하는 적과 데미지 무기 종류에 대한 정보를 지속적으로 DynamoDB에 넣을 수 있도록 구현하였습니다.

아래는 코드 예제로 Cognito 인증 정보를 통해 DynamoDB client객체를 생성하고 데이터를 넣는 예제입니다.


// Dynamo DB Client
dynamoClient = new AmazonDynamoDBClient(new CognitoAWSCredentials(IDENTITY_POOL_ID, ENDPOINT), ENDPOINT);
dynamoContext = new DynamoDBContext(dynamoClient);
// -----

public void PutUserShotInfo(string weapon, int damage, string enemyName, int score) {
	string userId = GameManager.Instance.userDataManager.userId;
	UserShotInfo userShotInfo = new UserShotInfo{
	Id = userId,
	Timestamp = NDCUtil.CurrentTimestamp(),
	Weapon = weapon,
	Damage = damage,
	Score = score
};
dynamoContext.SaveAsync<UserShotInfo>(userShotInfo,
(AmazonDynamoResult<VoidResponse> r) =< {
		if (r.Exception != null) {
		Debug.LogError("Save error");
		Debug.LogException(r.Exception);
		return;
		}
	}, null);
}

AWS Mobile SDK를 통해 서버를 통하지 않고 직접 AWS의 다양한 서비스를 활용하는 방법은 최근 이야기되는 Serverless architecture를 이용하여 낮은 비용과 빠른 개발 시간을 통해 다양한 게임을 개발할 수 있는 새로운 방법을 제공하여 줍니다.

더불어 Unity라는 게임 개발 플랫폼에서 게임 개발과 동시에 AWS의 서비스를 직접 활용할 수 있도록 하는 AWS Mobile SDK for Unity는 예제와 같이 단순한 코드로 콘텐츠, NoSQL DB, 분석 등의 다양한 기능을 직접 구현할 수 있도록 게임 개발자 분들에게 편리한 기능을 제공합니다. Unity로 게임을 개발하면서 Back-end service를 AWS로 구성하여 다양한 게임을 개발하는데 도움이 되었으면 합니다.

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 AWS 활용 기술 팁을 보내드리는 코너로서, 이번 글은 김일호 솔루션즈 아키텍트께서 작성해주셨습니다.

AWS Lambda 신규 기능 – Python 지원, VPC 지원, 함수 실행 시간 연장 및 스케줄링

작년 re:Invent 2014에서 AWS Lambda를 공개한 이후, 놀라운 변화가 있었습니다. 먼저 많은 개발자 및 시스템 아키텍트들이 서버 없는(Serverless) 시스템에 대한 신 개념을 빠르게 파악하는 것을 보았습니다. 이를 통해 대용량 요청을 처리하기 위한 확장 및 관리가 전혀 없는 형태의 놀라울 만한 방법으로 이를 클라우드 아키텍쳐에 도입하였습니다.

이제 그동안 추가되어 온 Lambda 함수가 처리할 수 있는 각종 이벤트를 한번 다시 한번 살펴보겠습니다.

지난 1년간 Lambda에 많은 기능을 추가해 왔는데, 우선 세 개의 AWS 리전(US West, US East, Europe)에 더하여 올해 초 동경 리전을 추가하였습니다. 시작할 때 Node.js에 더불어 자바 함수 지원도 시작했습니다. 위의 목록에서 보듯이 많은 AWS 자원의 이벤트를 지원하고 있고, AWS Compute Blog에서 이를 사용하는 다양한 예제를 보실 수 있으며 그 중에서도 가장 멋진 글은 바로 (개인적인 취향이지만) Microservices Without the Servers입니다.

AWS Lambda 신규 기능
오늘 re:Invent 2015에서는 AWS Lambda의 새로운 추가 기능들을 발표하게 되었습니다.

  • VPC 지원
  • Python 함수 지원
  • 함수 실행 시간 증가
  • 함수 버전 지원
  • 함수 스케쥴링 지원

보시면 아시겠지만, 모두 함수에 대한 새로운 기능들로 좀 더 자세히 하나씩 살펴보도록 하겠습니다.

1. 람다 함수에서 VPC내 자원 접근
많은 고객들이 Amazon VPC내에서 마이크로서비스를 운영하고 있고, 람다 함수에서 이를 접근할 수 있기를 바라고 있습니다. 만약 MongoDB 클러스터를 운영하면서, 데이터를 조회하거나 Amazon ElastiCache를 상태 저장소로 사용하거나 할때 람다 함수가 필요할 수 있는데, 이들은 인터넷 상에 노출되는 자원이 아닙니다.

이제 여러분이 정한 VPC 안의 보안 그룹을 설정함으로서 이러한 리소스를 접근할 수 있게 됩니다. 람다를 통한 인바인드 트래픽 접근을 허용하고 타겟 VPC 서브넷에 첨부 하면 됩니다. 여러분이 람다 함수를 만들거나 기존 함수를 사용할 때, 특정 VPC, 서브넷 그리고 보안 그룹을 지정해야 합니다. 또한, IAM 역할을 통해 함수 권한을 실행해서, 유연한 네트워킹 설정을 위한 몇가지 EC2 함수 접근을 주면 됩니다.

본 기능은 올해 말 지원을 할 예정이고, 더 자세한 것은 본 블로그를 통해 계속 알려드리겠습니다.

2. Python 기반 람다 함수 지원
여러분은 Node.js 및 Java로 람다 함수 작성이 가능하며, 이에 추가적으로 오늘부터 Python 2.7 프로그래밍 지원을 시작합니다. AWS SDK for Python에도 함께 포함되었습니다. Python 언어는 쉽게 배우고 사용할 수 있는 인기 있는 언어로서 이에 대한 많은 지원 요청을 받았습니다. 그래서 오늘 여러분께 선보이기 되어서 매우 기쁩니다.

아래는 Python을 통한 함수 지원 스크린샷입니다.

3. 람다 함수 실행 시간 증가
람다는 추출-변환-읽기(Extract-Transform-Load, ETL)과 같은 작업에 딱 맞습니다. 영구적인 인프라가 필요 없이 쉽게 대용량 데이터를 수집 및 처리하는데 쉽게 확장이 가능합니다. 이를 지원하기 위해 람다 함수는 5분까지 실행할 수 있게 되었습니다. 이러한 경우에 대해 함수를 만들 때 타임아웃을 지정하기만 하면 됩니다. 여러분의 함수가 얼마나 오래 실행되는지 확인을 하셔도 됩니다.

아래는 Python을 활용하여 잔여 시간을 확인할 수 있는 로그를 남기는 방법입니다.

print(" Remaining time (ms): " + str(context.get_remaining_time_in_millis()) + "\n") 

대부분 경우처럼, 정해진 함수 실행 시간을 모도 소모하면 종료됩니다.

4. 람다 함수 버전 및 별칭 지원
람다 함수를 통해 복잡한 시스템을 만들 때, 함수 기능을 계속 추가하면서 이를 제어할 필요가 있습니다. 개발 및 테스트 측면에서도 중요한 이런 부분을 단순화 하기 위해 신규 버전 기능을 공개합니다.

특정 함수의 새로운 코드를 매번 올릴 때 마다 람다가 새로운 버전 숫자를 지정하게 됩니다.(예, 1,2,3 등) 함수에 대한 ARN(Amazon Resource Name)에 옵션으로 버전 지시자가 추가 됩니다. (즉, “:”뒤에 버전 번호) ARN에 지시자가 없으면 최신 버전임을 의미하며 하위 호환성을 쉽게 활용할 수 있습니다. 버전 2의 ARN 지시자는 “arn:aws:lambda:us-west-2:123456789012:function:PyFunc1:2” 형식입니다.

버전 기능에 대해 알아 두셔야 할 몇 가지 점을 함께 알려드립니다.

  • 각 함수 버전은 자체 설정 정보를 포함합니다. (언어, 런타임, 메모리 크기 및 타임아웃, IAM 역할 등)
  • 각 버전은 자체적인 CloudWatch 측정값를 생성합니다.
  • CloudWatch 로그는 스트림 이름에 함수 버전을 포함합니다.
  • Lambda에서는 각 함수마다 다중 버전을 저장하고, 각 람다 계정은 1.5기가바이트까지 코드를 저장한 뒤, 이전 버전은 삭제합니다.

또한, 각 함수 및 버전 이름에 대한 별칭(aliasing)을 지정할 수도 있습니다. (예를 들어, version 3에 “prod”, version 5에 “test” 그리고 version 7에 “dev”같은 방식) 또한 ARN에서 별칭을 확인 할 수도 있습니다.

  • Production – “arn:aws:lambda:us-west-2:123456789012:function:PyFunc1:prod”
  • Testing – “arn:aws:lambda:us-west-2:123456789012:function:PyFunc1:test”
  • Development – “arn:aws:lambda:us-west-2:123456789012:function:PyFunc1:dev”

ARN에 있는 버전 및 별칭을 이용하여 어디서나 기존 ARN에 사용할 수 있으며, 모범 활용 방법으로 추천드립니다.

이 기능을 통해 문제 발생 시 쉽게 코드를 개발 단계에서 이전 버전으로 롤백을 할 수 있습니다. 예를 들어, 클라이언트 애플리케이션의 변경이나 이벤트 소스에 대한 함수 재실행 없이도 서비스 환경에서 버전 3을 변경해서 기능 변화를 줄 수 있습니다.

5. 람다 함수 스케쥴링(Cron)
새롭게 주기적으로 람다 함수를 실행할 수 있는 기능을 추가합니다. 실행 날짜, 시간 및 분 단위로 주기를 정할 수 있고 이는 기존 Cron 작업과 비슷합니다.

이러한 기능들은 오늘 부터 바로 AWS 관리 콘솔에서 사용할 수 있으며 바로 활용할 수 있습니다.

— Jeff;

이 글은 AWS Lambda Update – Python, VPC, Increased Function Duration, Scheduling, and More의 한국어 번역이며, re:Invent 2015의 신규 서비스 소식입니다.

EC2 인스턴스 추가 – X1 (SAP HANA) 및 T2.Nano

AWS 고객의 계획과 인프라 요구 사항에 저희에게 항상 공유해 주고, 저희는 이러한 필요를 맞추기 위해 노력해 왔습니다. EC2 인스턴스 역사를 보면 그러한 변화를 잘 파악할 수 있으며 다양한 인스턴스 타입을 추가해 왔습니다.

최근에 아래의 두가지 요구사항을 많이 받아 왔으며 매우 중요한 산업 트렌드라고 생각하고 있습니다.

  • 엔터프라이즈 고객은 많은 메모리 용량을 가진 고성능의 인스턴스를 요구합니다. 인메모리 기반의 SAP HANA나 Neo4j 및 Titan 같은 실시간 분석 그리고 대용량 캐시 같은 사례가 있습니다.
  • 소형 웹 사이트를 운영하는 고객은 그렇게 많은 컴퓨팅 용량을 차지 하지 않거나 모니터링이나 마이크로서비스용 서비스를 운영하기도 합니다.

이러한 요구 사항을 맞추기 위해 오늘 저희는 두 가지의 새로운 인스턴스 타입을 소개합니다. 바로 대용량 메모리를 가진 X1 인스턴스와 매우 적은 컴퓨팅 용량을 가지지만 필요 시 버스팅 기능을 가진 t2.nano입니다.

X1 – 대용량 메모리 기반
X1 인스턴스는 2TB의 메모리를 가지며 대용량 메모리 작업이 필요한 SAP HANA, Microsoft SQL Server, Apache Spark 및 Presto 같은 애플리케이션에 적합합니다.

X1인스턴스는 네 개의 Intel® Xeon® E7 프로세서를 기반으로 하고 각 프로세서는 L3 캐시의 메모리 대역폭을 가지며 고성능 대용량 메모리 앱을 지원합니다. 100개가 넘는 vCPU를 통해 이들 인스턴스가 동시 작업을 수행할 수 있습니다.

X1 인스턴스는 2016년 상반기 중에 공개할 예정이며, 더 자세한 것은 이 블로그를 통해 알려드리겠습니다.

t2.nano – 소형 서비스용(버스팅 기능 포함)
T2 인스턴스는 최저 사양의 프로세서 기준을 가지고 이를 넘어가는 경우 기존에 모아둔 CPU 크레딧이라는 사용하는 방식으로 효율적으로 인스턴스를 운영할 수 있는 모델입니다. 저희는 t2.micro, t2.small 그리고 t2.medium 등의 서비스를 제공했습니다. 버스팅 모델은 많은 고객들에게 인기가 높아지고 있으며 얼마 전 t2.large라는 인스턴스도 제공하기 시작했습니다.

다음 단계로 오늘 t2.nano라는 인스턴스 타입을 공개합니다. 1 vCPU에 512MB의 메모리를 가지며 한 시간 정도 전체 CPU를 사용할 수 있는 크레딧을 제공합니다.

트래픽이 거의 없거나 간단한 작업을 하는 서비스에 적합니다. 본 인스턴스 타입 또한 더 자세한 것은 이 블로그를 통해 알려드리겠습니다.

— Jeff;

이 글은 EC2 Instance Update – X1 (SAP HANA) & T2.Nano (Websites)의 한국어 번역이며, re:Invent 2015의 신규 서비스 소식입니다.

EC2 전용 호스트(Dedicated Hosts) – 출시 임박!

때로는 비지니스가 기술을 만들기도 하고, 반대로 기술이 비지니스를 만들기도 합니다!

여러분이 기존 환경에서 AWS로 이전하려고 할 때, 물리적 코어 숫자와 소켓 갯수에 맞춘 서버에 따른 소프트웨어 볼륨 라이선스를 구매하셨을 수도 있습니다.또는 특정 기간 동안 특정 서버에 실행을 하도록 하는 등 윈도 서버, 윈도 SQL 서버 및 오라클 데이터베이스와 SUSE 리눅스 엔터프라이즈 버전에는 이런 요구 사항이 있습니다.

AWS로 이전하는데 있어 이러한 라이선스를 그대로 활용할 수 있는 방법이 필요합니다. 일반적으로 저희는 BYOL(Bring Your Own License)라는 모델을 통해 이를 제공하는데, 라이선스 조항에 제대로 부합하려면 물리적 서버 기반에서 EC2 인스턴스를 연결(Mapping) 및 제어할 필요가 있습니다.

신규 Dedicated Host 모델
이러한 연결을 지원하기 위해서 Amazon EC2 Dedicated Hosts(전용 호스트)라는 새로운 모델을 발표합니다. 이를 통해 Dedicated Hosts라는 물리적 서버를 할당 받고 여기에 하나 이상의 EC2 인스턴스를 실행할 수 있습니다. 특정 물리 서버 사양을 정해 재사용하거나 기존 소프트웨어 라이선스에 맞는 환경을 구성할 수 있습니다.

BYOL 모델을 클라우드에 적용해 비용을 절감할 뿐만 아니라 EC2 Dedicated Host를 통해 엄격한 보안 준수 및 규제 요구사항에 맞출 수 있습니다. 인스턴스별 가시성 및 제어 요구사항을 물리 서버에도 적용 가능합니다. 이러한 환경에서 변경 사항에 대한 세부적 감사도 매우 중요한데 AWS Config를 통해 인스턴스 및 전용 호스트에 대한 변경 사항도 모두 기록이 가능합니다.

전용 호스트 사용하기
여러분께서는 특정 리전, 가용 영역에 특정 인스턴스 타입에 대해서 전용 호스트를 할당하실 수 있습니다.(API, CLI 및 관리 콘솔에서 가능합니다.)

각 호스트는 특정 인스턴스 타입에 따라 미리 설정된 인스턴스 숫자가 있습니다. (예를 들어, 8개 c3.xlarge 처럼). 이는 호스트를 할당하고 나면, 8개의 인스턴스를 띄울 수 있다는 이야기입니다.

배치에 대해서도 원하는 대로 가능합니다. 특정 전용 호스트에 인스턴스를 올릴 수도 있고, 여러개 중의 하나의 전용 호스트에 올릴 수도 있습니다. 인스턴스가 중단 후 재부팅, 재시작할 때 같은 전용 호스트에 배치될 수 있도록 선호 기능도 제공합니다.

새로운 모델 역시 클라우드 기반(cloudy)입니다. 여러분이 원하는 대로 호스트와 인스턴스를 할당 및 중단할 수 있으며(클라우드에서 매우 중요한 측면이지요.), 여러분의 요구 사항에 따라 변경할 수 있는 유연성 또한 제공합니다.

지불 방식
Amazon EC2 Dedicated Hosts는 예약(Reserved) 및 온디멘드 형식을 따릅니다. 어떤 경우든, 인스턴스 실행 여부와 관계 없이 전용 호스트가 할당될 때 결제가 되거나 기존에 구매한 예약 호스트를 사용하게 됩니다.

기존 머신 이미지의 경우 AWS VM ImportAWS Management Portal for vCenter를 통해 이전 가능합니다. 또는 AWS Marketplace에서 찾아서 이를 Amazon EC2 Dedicated Hosts에 기존 라이선스에 따라 올릴 수 있습니다. 물론 Amazon Linux AMI 및 다른 운영체제도 지원합니다.

향후 계획
새로운 전용 호스트 모델에 대해 미리 알려드리게 되어 기쁘게 생각합니다. 빠르게 새로운 소식 및 기능을 이 블로그를 통해 공유해 드리겠습니다.

— Jeff;

이 글은 Coming Soon – EC2 Dedicated Hosts의 한국어 번역이며, re:Invent 2015의 신규 서비스 소식입니다.

Elastic Beanstalk – Java 및 Go 언어 지원

Abhishek Singh는 AWS Elastic Beanstalk의 신규 기능 업데이트 소식인 Java JAR 파일 및 Go 프로그래밍 언어 지원을 아래 글을 통해 알려드립니다.

Jeff;


AWS Elastic Beanstalk을 통해 Java, .NET, PHP, Ruby, Node.js 및 Docker 등 웹 응용 프로그램 및 서비스를 손쉽게 확장성 높은 AWS 클라우드로 배포 및 서비스가 가능합니다. 프로그램 코드를 업로드만 하면 Elastic Beanstalk이 자동으로 용량 프로비저닝, 로드 밸런싱, 오토 스케일링, 응용 프로그램의 상태 모니터링을 포함하여 배포 작업을 수행합니다. 또한, 응용 프로그램을 계속 서비스하기 위한 AWS 리소스 제어 또한 가능합니다.

이번에 Java와 Go 응용 프로그램에 대한 지원을 추가함으로써 Elastic Beanstalk를 더욱 유용하게 활용할 수 있게 되었습니다. 또한, 새로운 플랫폼에서는 Nginx 리버스 프록시를 구성하는 프로세스를 쉽게 가능합니다. Nginx 구성을 제어하려면 .ebextensions/nginx 폴더에 nginx.conf를 추가 할 수 있습니다. 또한 플랫폼에서 제공하는 Nginx 구성을 포함하려면, .ebextensions/nginx/conf.d 폴더에 설정 파일을 추가 할 수 있습니다. 자세한 내용은 역방향 프록시 구성 방법을 참조하십시오.

  1. .ebextensions/nginx/nginx.conf – Nginx 설정 재정의(Override)
  2. .ebextensions/nginx/conf.d – Nginx 설정 파일

자바 신규 지원

JettyPlay와 같은 개발 프레임웍을 사용하여 자바 앱을 배포하는 것이 가능합니다. Tomcat외에도 다양한 옵션이 제공됩니다.

Java 응용 프로그램을 Elastic Beanstalk에 배포하는 방법은 다음과 같습니다.

바로 시작해 보시려면, Elastic Beanstalk 시작 화면에서 샘플로 정의된 카테고리에 있는 Java 플랫폼을 선택하십시오. Java 7 및 Java 8 모두 지원됩니다.

Go 언어 신규 지원
AWS Elastic Beanstalk에서 Go language 응용 프로그램을 실행시킬 수 있습니다. 다음과 같은 방법으로 Elastic Beanstalk에 Go 응용 프로그램을 배포 할 수 있습니다.

  1. 응용 프로그램의 소스를 포함 아카이브를 업로드합니다. AWS Elastic Beanstalk은 자동으로 응용 프로그램을 빌드하고 실행시킵니다. (AWS Elastic Beanstalk은 application.go라는 파일에 main function이 있다고 가정합니다.)
  2. 응용 프로그램의 바이너리를 포함한 아카이브를 업로드합니다. 여기에 응용 프로그램을 동작 시키기 위해 필요한 추가 매개 변수를 정의하는 Procfile도 포함되어 있습니다. 자세한 내용은 Application Process Configuration (Procfile)를 참조하십시오.
  3. 응용 프로그램 소스 Buildfile 및 Procfile를 포함한 아카이브를 업로드합니다. 자세한 내용은 Building Applications On-Server (Buildfile)를 참조하십시오.Java 플랫폼처럼 Go 플랫폼은 Profile에 여러 프로세스를 정의하는 Procfile을 지원합니다.

새로운 플랫폼을 사용하려면, AWS Elastic Beanstalk Management Console 로그인 및 EB CLI를 이용하여 최적의 클라우드 서비스 플랫폼을 만들어 보시기 바랍니다.

Abhishek Singh, Senior Product Manager, AWS Elastic Beanstalk

이 글은 Elastic Beanstalk Update – Support for Java and Go의 한국어 번역입니다.

Amazon SNS를 통해 AWS IP 대역 변경 사항 알림 받기

작년 AWS IP 대역 JSON 형식으로 공개하였습니다. 이 글은 금요일 오후에 올렸지만 주말 내내 인기 글이 되었습니다. 많은 AWS 사용자들이 아이피 대역을 활용하여 AWS 네트워크 성장함에 따라 자체 방화벽의 규칙을 관리하는데 잘 이용할 수 있게 되었습니다. 만약 AWS Direct Connect를 사용하는 고객이라면, 이 파일을 통해 접속을 위한 라우팅 테이블을 반영에 도움을 얻을 수 있습니다.

오늘은 좀 더 쉽게 이 파일 목록을 이용할 수 있도록 Amazon Simple Notification Service (SNS) 토픽을 생성해서 업데이트 내역에 대한 알림을 받을 수 있는 기능을 알려드리겠습니다. 프로그램 코드를 통해 좀 더 쉽게 업데이트 내역을 파악하여 빠르게 적용 가능합니다.

arn:aws:sns:us-east-1:806199016981:AmazonIpSpaceChanged 토픽에 가입하고 원하는 방식대로 이용하면 됩니다. (SNS 지원 프로토콜 활용 가능)

아래와 같은 형식으로 알림을 받게 됩니다.

{
  "create-time":"yyyy-mm-ddThh:mm:ss+00:00",
  "synctoken":"0123456789",
  "md5":"6a45316e8bc9463c9e926d5d37836d33",
  "url":"https://ip-ranges.amazonaws.com/ip-ranges.json"
}

AWS Lambda 함수를 통해 변경 사항을 받으실 수도 있습니다.

이제 AWS IP 대역 파일 업데이트 내역을 쉽게 받아서 파싱 후, 원하는 정보로 가공 할 수 있게 되었습니다. 좀 더 자세한 사항은 AWS IP Address Ranges 문서를 참고하시기 바랍니다.

Jeff;

PS – 2015년 8월 25일 현재 EC2의 IP 대역은 13,065,550개의 주소를 가지고 있습니다.

이 글은 Subscribe to AWS Public IP Address Changes via Amazon SNS의 한국어 번역입니다.

EC2 스팟 인스턴스에서 자원 중심 입찰 기능 제공

올해 초에 EC2 Spot 집합 API를 소개했습니다. 이전 글에서 언급했듯이 한번의 API 요청으로 Spot 집합 인스턴스를 시작하고 관리 할 수 있습니다. 스팟 인스턴스 집합 구성을 필요로 하는 용량 시간 당 입찰 가격 인스턴스 유형을 지정하면, Spot 집합은 최저가의 EC2 용량을 찾아 내고 그 용량을 유지 합니다.

오늘은 기존 입찰 방식에 가중치를 적용하여 Spot 집합 API 기능을 더욱 강화했습니다. 새로운 기능을 통해 인스턴스 유형 및 가용 영역 안에서 애플리케이션에 가장 적합한 입찰을 진행할 수 있습니다. RequestSpotFleet API를 호출 할 때 (인스턴스 당) 입찰 가격을 지정합니다. 하지만, 요구하는 자원에 대한 자세한 조건을 주면 더 좋을 것입니다. 예를 들어, 최소 488GiB 메모리를 2개 이상의 R3(메모리 최적화) 인스턴스를 원하거나 최소 128vCPU을 C3와 C4(컴퓨팅 최적화) 인스턴스 조합으로 원하는 경우 등입니다.

신규 자원 중심 입찰 방식
새로운 자원 중심의 입찰 모델은 이러한 종류의 스팟 집합 인스턴스 요청이 가능합니다. 각 인스턴스는 만들어질 집합 크기에 영향을 주는 여러 가지 자원을 “용량 단위(capacity units)”로 유지합니다. 앞의 예제처럼 몇 GB의 RAM 또는 얼마의 vCPU 자원이 필요한가? 또는 EBS 최적 대역폭 계산 능력, 네트워크 성능 및 기타 응용 프로그램 고유 단위 등이 많습니다. 이러한 용량 단위 Spot 인스턴스 집합의 요청 매개 변수로 사용 용량 단위 전체에 대한 각 인스턴스 비율도 알려드립니다.

이를 통해 각 인스턴스 유형을 실제로 사용할 수 있는지 여부에 신경 쓰지 않고, 여러 인스턴스 유형의 자원을 경우에 따라서는 여러 가용 영역에 걸쳐 사용할 수 있습니다. 각 RequestSpotFleet 요청에는 여러 시작 설정 (launch specification)을 지정할 수 있고, 요청한 인스턴스 유형에 따라 AMI를 지정할 수 있습니다. 각 시작 설정 (launch specification)에는 다음과 같은 값을 지정할 수 있습니다 :

  • WeightedCapacity – 지정된 인스턴스 유형이 전체 용량 중 얼마나 차지하게 할지를 지정합니다. Spot 인스턴스 입찰을 할 때 유닛마다 입찰 가격을 계산합니다. 예를 들어, 15.25GB 메모리 r3.large 인스턴스에 비해서, 30.5GB 메모리를 탑재 한 r3.xlarge 인스턴스에 대해 2배의 비용을 지불한다는 입찰이 가능합니다.
  • SpotPrice – 특정 유닛 단위의 입찰 가격으로 인스턴스의 입찰가보다 우선합니다. 이 값을 사용하면 특정 인스턴스 유형, 가용 영역이나 서브넷을 선택하거나 하지 않도록 하는 것이 가능합니다.

아래는 메모리 기반의 시작 설정의 한 사례입니다.

Instance Type Instance Weight
 r3.large  15.25
 r3.xlarge  30.5
 r3.2xlarge  61
 r3.4xlarge  122
 r3.8xlarge  244

먼저 원하는 용량인 488GB를 지정하고 이에 대한 대상 용량에 대한 입찰 가격 (GB/시간)을 RequestSpotFleet를 실행하면, 이 경우 r3.large에 비해 r3.8xlarge는 16배 높은 가격을 지불하고 선언 한 것입니다.

EC2 서비스에서는 이 정보를 바탕으로 유닛 당 Spot 가격이 최저에서 사용 가능한 인스턴스를 찾아 가장 경제적인 조합의 스팟 인스턴스 집합을 구축합니다. 다음과 같이 단일 인스턴스 유형을 사용한 간단한 구성이 가능합니다 :

  • 2 x r3.8xlarge
  • 4 x r3.4xlarge
  • 8 x r3.2xlarge
  • 16 x r3.xlarge
  • 32 x r3.large

조금 더 복잡하게 한다면 다음과 같습니다.

  • 1 x r3.8xlarge and 2 x r3.4xlarge
  • 2 x r3.4xlarge and 8 x r3.xlarge
  • 8 x r3.xlarge and 16 x r3.large

시간이 지남에 따라 스팟 가격 상승으로 인스턴스가 중단 된 경우, 필요한 자원을 보충하기 위한 대체 인스턴스가 시작됩니다. 이 경우, 여러분의 애플리케이션은 인스턴스 유형 (및 사용할 수 있는 메모리 용)을 감지하여 조정해야 합니다. 스팟 집합에서는 사용 가능한 리소스를 사용하여 지정된 용량을 달성하기 위해 최대 인스턴스를 추가로 확보하게 됩니다. 이전 예제에서는 512GiB 전체 집합 인스턴스의 용량을 요청했을 때 발생합니다. 또한, 작은 요청이나 용량이 큰 인스턴스가 최저가(유닛 당) 가격인 경우에도 비슷한 일이 발생합니다.

용량 단위에 대해
용량 단위는 사전에 정해져 있으며, 인스턴스의 물리적 특성과 직접 매핑할 필요는 없습니다. 몇 가지 벤치 마크 테스트를 하여 인스턴스 유형별 트랜잭션 비율(TPS)을 측정하고 있다면, 필요한 TPS를 처리 할 수​​있는 전체 용량을 요청하는 그 시점에서 가장 경제적인 EC2 인스턴스 유형을 제시합니다. 사실 스팟 인스턴스 기법은 기술과 비즈니스의 교차점에 있습니다. 여러분의 비즈니스 경제성을 개선할 수 있고, (온디멘드 인스턴스 가격보다 90% 이상 비용 절감하기 위해) 창의적이고 혁신적인 여지가 많이 있습니다.

이러한 입찰 메커니즘을 사용하면 원하는 가용 영역의 WeightedCapacity 값을 높이고, 우선 순위를 제어할 수 있습니다. 예를 들어, 동일한 인스턴스 유형으로 여러 설정을 해두고, 다른 가용 영역에 서로 다른 가중치를 설정 할 수 있습니다.

API 요청은 AWS Command Line Interface (CLI)를 사용하거나 RequestSpotFleet API를 호출하십시오.

이 기능은 모든 리전에서 스팟 인스턴스를 사용할 때 사용 가능합니다.

Jeff;

PS – EC2 스팟 인스턴스에 대한 자세한 사항은 스팟 인스턴스 분류글을 참고하시기 바랍니다.

본 글은 New – Resource-Oriented Bidding for EC2 Spot Instances의 한국어 번역입니다.

EC2 Spot 인스턴스를 통해 가격에 민감한 앱 만들기

지난번에 EC2 Spot 인스턴스의 모범 사례 에 대한 기사를 연재할 계획을 말씀드린 바 있습니다. 그 첫번째로 Spot 인스턴스를 사용하여 어떻게 하면 가격 기반 응용 프로그램을 개발할 것인가? 라는 주제로 EC2 Spot 팀의 2 명의 시니어 개발자와 함께 이야기를 하였습니다. Dmitry Pushkarev (기술 개발 담당)와 Joshua Burgin(제품 관리자)과의 대화를 인터뷰 형식으로 편집해서 제공해 드립니다.



Jeff : Spot 인스턴스 가격의 진정한 의미는 무엇일까요?

Joshua : Spot 기반 무장애 응용 프로그램을 구축 할 때, 현재 가격과 과거 가격 기록은 중요한 고려 사항입니다. 가격을 잘 살펴봄으로서 가장 가능성 높은 용량 풀(Capacity Pool)에 응용 프로그램을 배포하거나, 서비스가 방해 받을 가능성을 줄이고 가격 성능을 전반적으로 향상시킬 수 있습니다.

Spot 시장에서 인스턴스 가격은 수요와 공급으로 정해집니다. 낮은 가격이라는 것은 수요보다 많은 용량이 있다는 것을 의미합니다. 낮은 가격이거나 낮은 변동폭으로 일정한 것은 그 용량 풀은 수요가 적다는 것을 의미합니다. 예를 들어, 이전 세대의 인스턴스가 그런 경향을 가집니다.(m1.small, c1.xlarge, cc2.8xlarge 등)


Jeff : 고객이 어떻게 (가격에 따라 인스턴스가 변동될 수 있는) 환경에서 애플리케이션을 구축할 수 있을까요?

Dmitry : (Spot 인스턴스를 이용하여) 장애가 나지 않도록 응용 프로그램을 설계할 때 ‘가격 기록’을 잘 사용하는 것은 중요합니다. 고객에게도 각각 배치 전략이있습니다만 일반적으로 두 가지 개의 성공 패턴이 있습니다. 하나는 가격 변동폭이 적은 용량 풀 (인스턴스 유형 및 가용 영역)을 선택하거나, 여러 용량 풀에 필요한 용량을 분산 배치하는 것입니다.

주식 시장이라는 좋은 예가 있습니다. “가장 좋은 성능”의 용량 풀을 찾아 정기적으로 그 선택에 대해 다시 확인 할 수 있으며, 관련이 없는 풀에 걸쳐 분산시켜 장애 위험을 크게 줄일 수 있습니다.


Jeff : 용량 풀의 배치 전략에 대해 자세히 알려주세요.

Joshua : 가격 변동 폭이 안정적인 풀을 찾기 위해 최근 Spot 가격 기록을 분석하는 아이디어가 있습니다. 용량 풀에서 입찰 희망 가격(매 시간에 지불한 최대 가격)을 초과 한 최근 시점부터 현재까지 기간으로 분석하는 방법입니다. 과거의 경향이 결코 미래의 결과를 보장하는 것은 아니지만, 처음 패턴을 보기에 좋은 방법입니다. 이 전략은 개발 테스트 환경이나 장시간 분석 작업을 하는 인스턴스에 좋습니다. Amazon EMR 클러스터에 용량을 추가하는 방법으로도 좋구요. 이익을 극대화하면서 용량 풀을 계속 사용하실 거라면, 입찰 후 어느 정도 경과 한 후에는 가격을 재검토하는 것도 추천합니다.

Jeff : 고객들이 Spot 가격 기록을 어떻게 볼 수 있습니까?
Dmitry : 콘솔 또는 SDK 및 AWS 명령어 인터페이스 (CLI) 프로그램에서 볼 수 있습니다.
또한, Spot 페이지에서 접근 가능한 웹 기반 Spot Bid Advisor을 새롭게 만들었습니다. 이 도구는 여러 가용 영역 평균 통계를 표시하고 가격 변동이 작은 인스턴스 유형을 찾아기 쉽습니다. 리전, 운영 체제, 입찰 가격 (온 디멘드의 25 %, 50 %, 100 %)을 선택하면 지난 주 또는 매월 변화, 과거 빈도를 표시합니다.

GitHub의 저장소 aws-spot-labs 에 또 다른 예가 있습니다. get_spot_duration.py 스크립트로 Spot 가격 정보를 취득하여 입찰 희망 가격을 초과한 기간에 근거하여 인스턴스 유형 및 가용 영역을 사용할 수 있습니다.


Jeff : 그렇군요. 큰 인스턴스 풀을 선택하고 정기적으로 다시 살펴봐야 하는군요.

Dmitry : 네. 그게 좋은 출발점입니다. Spot을 보다 쾌적하게 사용하는 다음 단계로는 동시에 여러 풀을 사용하는 용량을 분산하는 것입니다. 왜냐하면 각 용량 풀은 물리적으로 분리되어, 가격에 관련된 이슈가 거의 없기 때문입니다. 여러 용량풀이 단기간에 동시에 가격이 상승하는 일은 매우 드뭅니다. 이를 통해 문제가 발생할 영향을 줄일 수 되고, 필요한 용량을 확보하는 데 충분한 시간을 얻을 수 있습니다.

Joshua : 이러한 용량 분산 방법은 장기적인 가격 대비 성능도 개선합니다. 만약 여러 인스턴스 유형 및 가용 영역에 균등하게 용량을 분산하고 시간 단가는 여러 풀에서 과금되므로 결과적으로 좋은 가격 대비 성능입니다.


Jeff : 너무 좋네요. 그 다음 단계가 될 입찰 전략은 어떨까요?
Joshua : 지불하고자하는 가격에 적절하게 입찰하는 것이 중요합니다. 부당하게 높은 Spot 입찰을 하는 것보다 여러 용량 풀을 신중하게 선택하고 거기에 애플리케이션을 분산 배치하여 고가용성을 제공하는 것이 좋습니다. 현재 용량 풀 가격이 상승하고 있다는 것을 발견하면, 그것은 수요가 증가하고 있다는 의미입니다. 문제를 피하기 위해 더 저렴한 풀에 업무를 마이그레이션하거나 높은 가격으로 놀고 있는 인스턴스를 종료할 것을 추천합니다.


Jeff : 더 정교한 입찰 전략을 사용하는 고객이 있습니까?

Dmitry : 많은 고객이 Spot을 사용할 수록 경쟁력 면에서 중요합니다. 프로덕션 환경을 모두 Spot에서 실행하는 고객도 있습니다. 물론 그들의 SLA를 충족하도록 추가 엔지니어링이 필요하지만… Spot에 대한 생각에 대해 의미 있는 이야기는 “클라우드 친화적” 응용 프로그램이 Spot에 의한 효과를 얻고 있다는 것입니다. 설계에 의한 복원력, 유연성, 가격을 인식하고 있다는 것을 의미합니다. 가격을 인식하고 가장 비어있는 용량 풀에 응용 프로그램을 배포 할 수 있습니다. 특히 신생 기업은 빨리 확장시키고 보다 저렴 컴퓨팅 인프라를 사용하기 위해 독창적으로 Spot을 사용하고 있습니다.

Joshua : Auto Scaling, Spot 모음, Elastic MapReduce와 같은 도구는 Spot을 조합 할 수 있으며, 특별한 추가 개발을 하지 않고 여러 용량 풀을 동시에 사용할 수 있습니다.

Spot 인스턴스에 대한 정보를 얻기 위해 앞으로도 블로그를 계속확인해 주십시오! 언제든지 여러분의 Tips(과 질문)을 댓글에 써주세요.

– Jeff ;

이 글은 Building Price-Aware Applications Using EC2 Spot Instances의 한국어 번역입니다.