Category: AWS Lambda*


AWS Lambda와 Slack을 이용한 DevOps Chatroom 구현하기

Slack이 제공하는 협업을 위한 채팅을 통해 DevOps팀에서 실제 운영이나 서로 의견이나 정보를 다양한 플랫폼에서 동시에 주고 받을 수 있습니다. 예를 들어, 스마트폰 앱을 이용하거나 맥에서는 클라이언트 도구도 제공하고 있습니다. 메시지를 다양한 형태로 전달할 수 있는 Amazon SNS(Simple Notification Service)를 통해 이벤트를 발생시키고, AWS Lambda 는 SNS를 통해 전달된 메시지를 이벤트 트리거(Event trigger)를 통해 원하는 코드를 직접 수행 할 수 있습니다.

Slack은 API를 통해 메시지를 보낼 수 있는 방법을 제공하고 있습니다. AWS Lambda에서 알림을 받아 Slack 대화 채널로 메시지를 전달할 수 있습니다. 이에 관한 간략한 소개는 ChatOps를 위한 AWS Lambda를 통한 Slack 통합 샘플 코드에서 제공하고 있습니다. 이번 글에서는 좀 더 상세하게 해당 기능을 소개하여 쉽게 구성할 수 있도록 도움을 드리고자합니다.

1. AWS Elastic Beanstalk로 웹 서비스 구성하기
AWS Elastic Beanstalk을 사용하면 아주 쉽게 웹 서비스를 바로 만들 수 있습니다. 또한, ELB(Elastic Load Balancing)과 RDS(Relational Database Service)를 같이 생성해 주며, Auto Scaling Group도 자동으로 생성하여 트래픽을 분산하고 스케일링을 자동화 할 수 있습니다. Auto Scaling을 위한 Policy 역시 생성되며, 확장을 위한 조건 및 정책 변경이 가능합니다.

Beanstalk은 로컬에서 개발한 코드를 AWS 환경에 바로 배포가 가능합니다. 로컬에서 Git을 이용하여 개발 후 EB CLI(Elastic Beanstalk CLI)를 통해 쉽게 업로드하여 배포할 수 있습니다. 로컬 환경에 EB CLI를 설치하고 웹서비스는 Github awslabs에 있는 Node.js로 만들어진 예제를 사용하겠습니다.

원하는 폴더를 생성 후 Github에서 예제를 다운로드합니다.

$ git clone https://github.com/awslabs/eb-node-express-sample.git
Cloning into 'eb-node-express-sample'...
remote: Counting objects: 56, done.
remote: Total 56 (delta 0), reused 0 (delta 0), pack-reused 56
Unpacking objects: 100% (56/56), done.
Checking connectivity... done.

Git사용을 위한 초기화를 진행합니다.

$ git init .
Reinitialized existing Git repository in /Users/ilho/Github/ebsample1/ebsample2/eb-node-express-sample/.git/

EB CLI를 설정하면 $ eb라는 명령을 통해 Elastic Beanstalk을 로컬 환경에서 구성하여 사용할 수 있습니다. 처음에 개발하는 폴더를 Root로 지정하고 Beanstalk 환경에 대한 설정을 진행합니다. eb init이란 명령으로 수행합니다. Beanstalk을 어느 Region에 생성할지부터 서비스 이름 등 기본적인 설정을 진행합니다. 현재 AWS Lambda가 도쿄 리전에서 지원하고 있기 이를 활용하기 위해 Elastic Beanstalk을 도쿄 리전에서 시작해 보겠습니다.

AWS Elastic Beanstalk은 Node.js외에도 Java, .NET, PHP, Python, Ruby, Go, Docker를 모두 지원합니다.

a0999b0edcf5:eb-node-express-sample ilho$ eb init
Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-southeast-1 : Asia Pacific (Singapore)
7) ap-southeast-2 : Asia Pacific (Sydney)
8) ap-northeast-1 : Asia Pacific (Tokyo)
9) ap-northeast-2 : Asia Pacific (Seoul)
10) sa-east-1 : South America (Sao Paulo)
11) cn-north-1 : China (Beijing)
(default is 3): 8

Select an application to use
1) MyNewTest
2) ebsample1
3) [ Create new Application ]
(default is 3): 3

Enter Application Name
(default is "eb-node-express-sample"): ebsample2
Application ebsample2 has been created.
 
It appears you are using Node.js. Is this correct?
(y/n): y
Do you want to set up SSH for your instances?
(y/n): y
 
Select a keypair.
1) example_key1
2) example_key2
3) example_key3
4) example_key4
5) [ Create new KeyPair ]
(default is 5): 4

Beanstalk Application을 AWS 콘솔을 통해서도 만들 수 있지만, EB 명령을 이용하여 로컬에서 바로 생성을 시킬 수 있습니다. Eb create 명령을 사용하여 Beanstalk 환경을 구성합니다. 아래처럼 필요한 환경을 구성하면서 만들어지는 내용을 확인할 수 있습니다. 명령을 실행하여 AWS 콘솔에서 환경이 구성되는 것을 확인할 수도 있습니다. 환경이 구성 중에는 회색으로 표기되며 모두 정상적으로 만들어지면 녹색으로 변경되어 상태를 구분할 수도 있습니다.

$ eb create web2-env
WARNING: You have uncommitted changes.
Creating application version archive "app-5529-160121_085131".
Uploading ebsample2/app-5529-160121_085131.zip to S3. This may take a while.
Upload Complete.
Environment details for: web2-env
Application name: ebsample2
Region: ap-northeast-1
Deployed Version: app-5529-160121_085131
Environment ID: e-immiw7zwnk
Platform: 64bit Amazon Linux 2015.09 v2.0.6 running Node.js
Tier: WebServer-Standard
CNAME: UNKNOWN
Updated: 2016-01-20 23:51:35.207000+00:00
Printing Status:
INFO: createEnvironment is starting.
INFO: Using elasticbeanstalk-ap-northeast-1-1234567890 as Amazon S3 storage bucket for environment data.
INFO: Created load balancer named: awseb-e-i-AWSEBLoa-5F13U6NNRGJT
INFO: Environment health has transitioned to Pending. There are no instances.
INFO: Created security group named: awseb-e-immiw7zwnk-stack-AWSEBSecurityGroup-59FO03AWS48X
INFO: Created Auto Scaling launch configuration named: awseb-e-immiw7zwnk-stack-AWSEBAutoScalingLaunchConfiguration-42NJ3UCM61ZD
INFO: Added instance [i-00952c8f] to your environment.
INFO: Created Auto Scaling group named: awseb-e-immiw7zwnk-stack-AWSEBAutoScalingGroup-1QP37B57TQ43O
INFO: Waiting for EC2 instances to launch. This may take a few minutes.
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:1234567890:scalingPolicy:6b7c0afe-3c1e-436d-a2e0-fcbc96d9c3c2:autoScalingGroupName/awseb-e-immiw7zwnk-stack-AWSEBAutoScalingGroup-1QP37B57TQ43O:policyName/awseb-e-immiw7zwnk-stack-AWSEBAutoScalingScaleUpPolicy-6FX2ZY0A9VIG
INFO: Created Auto Scaling group policy named: arn:aws:autoscaling:ap-northeast-1:1234567890:scalingPolicy:e8e7a4c3-af2f-4557-98e2-2dc472470f2e:autoScalingGroupName/awseb-e-immiw7zwnk-stack-AWSEBAutoScalingGroup-1QP37B57TQ43O:policyName/awseb-e-immiw7zwnk-stack-AWSEBAutoScalingScaleDownPolicy-1RY0SZO4CF9VP
INFO: Created CloudWatch alarm named: awseb-e-immiw7zwnk-stack-AWSEBCloudwatchAlarmHigh-10PTC4TZJA6XR
INFO: Created CloudWatch alarm named: awseb-e-immiw7zwnk-stack-AWSEBCloudwatchAlarmLow-1485FJORPZ9R3
INFO: Environment health has transitioned from Pending to Ok.
INFO: Successfully launched environment: web2-env

eb 명령어를 이용하면 바로 브라우져를 통해 Beanstalk으로 구성된 웹페이지를 열어볼 수 있습니다.

$ eb open

2. CloudWatch Alarm에 Notification 추가하기
Elastic Beanstalk은 Auto Scaling Group, CloudWatch Alarm, ScalingPolicy, SNS를 모두 구성해 줍니다. 자동으로 만들어진 SNS Topic을 이용하여 Lambda 함수와 연계되도록 구성을 할 수도 있고, 별도의 SNS Topic을 구성하여 Lambda 함수와 연계할 수도 있습니다.

CloudWatch 메뉴로 이동하여 자동으로 생성된 CloudWatch Alarm을 찾아 알람이 발생하면 SNS로 Notification을 전달 할 수 있도록 추가합니다.

기본으로 CPUUtilization을 모니터링하여 알람이 발생하도록 구성되어 있습니다. 스케일인-아웃(Scaling-in/out)을 위한 두 개의 알람이 생성되어 있으며, 해당 알람을 선택하여 Modify를 선택하고 Notification을 아래와 같이 추가합니다.

3. AWS Lambda에 Slack메시지 전송 함수 생성하기
Lambda에서는 Slack을 위한 함수가 예제로 추가되어 있습니다. 아래와 같이 slack으로 검색하면 Node.js와 Python 을 지원하는 Slack-echo-command, cloudwatch-alarm-to-slack 함수가 있습니다. 여기서는 Node.js를 사용하도록 하겠습니다.

cloudwatch-alarm-to-slack을 선택 후 Event Source로 앞에서 확인한 SNS Topic을 선택합니다. 해당 SNS Topic에 메시지가 전달되면 Lambda 함수가 자동으로 실행됩니다. 다음으로 제공하는 코드의 내용을 원하는 Slack 채팅 그룹, 채널에 메시지를 전달하기 위한 내용이 Comment에 설명되어 있습니다. 우선 Slack Incoming WebHooks 을 사용하여 메시지를 전달할 수 있도록 정보를 확인합니다.

  1. https://<your-team-domain>.slack.com/services/new로 이동합니다.
  2. “Incoming WebHooks”을 검색하여 채팅 그룹와 채널을 선택하고, 추가합니다.
  3. “Webhook URL” 을 확인하고 노트합니다.

Webhook URL이 노출되지 않도록 AWS KMS(Key Management Service)를 이용하여 Webhook URL을 암호화합니다. 별도의 암호화 관리를 하지 않고 쉽게 사용할 수 있는 서비스입니다. AWS CLI를 통해 직접 콘솔을 통하지 않고도 키 생성이 가능합니다.

1) AWS CLI로 KMS에 Key를 생성합니다. 이 예제에서는 Tokyo Region의 KMS에 키를 생성합니다.

$ aws kms create-key --region ap-northeast-1
{
"KeyMetadata": {
"KeyId": " xxxxxx-xxxx-xxx-xxxx-xxxxxxxx ",
"Description": "",
"Enabled": true,
"KeyUsage": "ENCRYPT_DECRYPT",
"KeyState": "Enabled",
"CreationDate": 1453342025.031,
"Arn": "arn:aws:kms:ap-northeast-1:1234567890:key/xxxxxx-xxxx-xxx-xxxx-xxxxxxxx",
"AWSAccountId": "123456789"
}
}

2) Key 사용이 쉽도록 Alias를 생성합니다. 이 예제에서는 SlackKey라는 이름으로 타겟 키를 지정하여 Alias를 생성합니다.

$ aws kms create-alias --alias-name "alias/SlackKey" --target-key-id " xxxxxx-xxxx-xxx-xxxx-xxxxxxxx " --region ap-northeast-1

3) WebHook URL을 생성한 키와 AWS CLI를 이용하여 암호화합니다. URL은 프로토콜 부분은 제외하고 입력합니다.

$ aws kms encrypt --key-id alias/SlackKey --plaintext "hooks.slack.com/services/abcdefghijklmnopqrstuvwxyz" --region ap-northeast-1
{
"KeyId": "arn:aws:kms:ap-northeast-1:1234567890:key/ xxxxxx-xxxx-xxx-xxxx-xxxxxxxx ",
"CiphertextBlob": "AbcdfghijksN8ta1n/abdefjiowl/x5RwtKZGSctHgnMVKeNo2xZjoAAACnMIGkBgkqhkiG9abcdefghijklmnb3DQEHATAeBglghkgBZQMEAS4wEQQMPWtiU2OmhyBJ9/swAgEQgGCZJ7fabcdefghijklmnUt6ltc1avMiWQawdgW9tj8Xv3drF7savCoL0oVDzRYRabcdefghijklmncIjX4LdXbAIg6nNWcF2JEa4v9Ze9WWNA9yrzJmmNs="
}

4) 암호화되어 생성된 WebHook URL을 Lambda코드의 kmsEncryptHookUrl 변수에 입력합니다. 입력할 Slack 채널명도 slackChannel 변수에 입력합니다.

var AWS = require('aws-sdk');
var url = require('url');
var https = require('https');
var hookUrl, kmsEncyptedHookUrl, slackChannel;

kmsEncyptedHookUrl = 'AbcdfghijksN8ta1n/abdefjiowl/x5RwtKZGSctHgnMVKeNo2xZjoAAACnMIGkBgkqhkiG9abcdefghijklmnb3DQEHATAeBglghkgBZQMEAS4wEQQMPWtiU2OmhyBJ9/swAgEQgGCZJ7fabcdefghijklmnUt6ltc1avMiWQawdgW9tj8Xv3drF7savCoL0oVDzRYRabcdefghijklmncIjX4LdXbAIg6nNWcF2JEa4v9Ze9WWNA9yrzJmmNs="';  // Enter the base-64 encoded, encrypted key (CiphertextBlob)
slackChannel = '#general';  // Enter the Slack channel to send a message to

5) Lambda 함수가 KMS를 사용하여 URL Decryption을 해야하므로 함수가 KMS를 사용할 수 있는 권한이 필요합니다. Lambda 함수가 사용할 Role에 KMS의 Decrypt API 접근 허용을 추가합니다. 아래 예제는 lambda_basic_execution role의 Policy에 추가한 화면입니다.

6) Lambda 함수에 lambda_basic_execution role을 지정하고 함수를 생성합니다.

7) Lambda Event Source의 처음 설정은 Disabled 이므로 Enabled로 변경합니다.

4. Slack 대화방에서 메시지 확인하기
Beanstalk에서 만든 사이트는 현재 트래픽이 없으므로, CPUUtilization이 낮아 Low CPU Alarm이 생성되어 메시지가 전달되게 됩니다. 아래와 같이 Slack 대화방에 해당 Alarm이 전달된 것을 확인할 수 있습니다.

Beanstalk을 활용하여 아주 간단히 웹서비스를 만들고 CloudWatch 알람 이벤트를 소스로 Lambda 함수를 활용하여 Slack 서비스에 메시지를 자동으로 포스팅하는 서비스를 상세히 구현해 보았습니다. Ops 혹은 DevOps팀에서 AWS의 여러 상태 정보나 메시지를 받아서 활용할 수 있습니다. Slack에서는 메시지의 포맷을 변경하거나 할 수 있는 여러가지 예제를 제공하고 있어 보아 다양한 메시지 구현이 가능합니다.

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

ChatOps를 위한 AWS Lambda를 통한 Slack 통합 샘플 코드

여러분이 속한 개발팀이 채팅 기반 운영(ChatOps)?를 하고 계신가요? 대회를 기반으로 하는 새로운 운영 방식을 의미하는 것으로 하나 이상의 봇(bots)을 활용하여 대화에 빠르게 대응하여 상태 확인 및 보고를 해주는 용어입니다.

채팅 환경은 실시간 소통이 가능하고, 손쉽게 여러 사람이 웹 혹은 모바일 기기를 통해 접근할 뿐만 아니라 이전 메시지 기록까지 볼 수 있는 장점이 있습니다. 봇 기반의 통합 작업은 운영팀이 좀 더 협업을 하는데 도움을 주고, 갑작스런 문제에 동시 다발적으로 함께 추적하여 문제를 해결 할 수 있는 방식을 지원 합니다.

신규 Slack 통합 방식
AWS 고객들이 시스템 환경을 좀 더 새롭고 혁신 적인 방식으로 운영을 하기 위해, 최근 AWS Lambda 기반의 Slack 통합 함수 예제 를추가하였습니다.

여러분은 이러한 샘플 예제를 통해 채팅 기반 운영을 할 수 있는 도구를 만들어, 현재 사용하고 계신  Slack 대화안에 넣으실 수 있습니다. slack-echo- 샘플 코드는 특정 명령어에 대응하는 봇을 만들 수 있게 해주고, cloudwatch-alarm-to-slack- 샘플 코드는 알림 및 상태 보고를 도와줍니다. 여러분이 봇에게 AWS API 접근 권한을 부여하기 때문에, (봇을 통해) AWS 자원과 원하는 방법으로 상호 작용할 수 있습니다. 상태를 조회하거나, 오류 조건, 설정 변경 및 새로운 자원 생성도 가능합니다.

CloudWatch 알람을 통해 오토 스케일링 그룹을 모니터링하고, 제한 용량이 초과했을 경우 이를 Slack 채널의 ChatOps 팀에 메시지를 보낸다고 가정해 봅시다. 운영팀에서는 상황을 좀 더 자세히 살펴 보고 빠르게 스케일업을 통해 문제를 해결 할 수 있습니다. 다양한 AWS  자원과 Slack 통합을 통해, 아래와 같이 전체적은 운영 프로세스의 효율화가 가능합니다. (붉은 화살표는 알림, 녹색은 그에 대한 대응입니다.)

이러한 시스템 개발을 위해, 채널에 메시지를 보내기 위한 Slack webhook 을 사용하고, 메시지 내용은  cloudwatch-alarm-to-slack-python 샘플 예제로 보내면 됩니다. 샘플 예제를 기반으로  AWS Key Management Service (KMS) 키를 만든 후, webhook 주소를 암호화하고 base-64 인코딩을 통해  데이터 보안을 할 수 있습니다. 그리고, IAM Role을 통해 KMS Decrypt 함수를 호출 할 수 있는 권한을 부여하면, 됩니다. 슬랙 채널에 메시지를 전달하는 간단한 이벤트 핸들러 함수는 다음과 같습니다.

slack_message = {
    'channel': SLACK_CHANNEL,
    'text': "%s state is now %s: %s" % (alarm_name, new_state, reason)
}

req = Request(HOOK_URL, json.dumps(slack_message))

이벤트 핸들러를 통해 호출을 통해 나오는 모든 예외 처리를 할 수 있으며, 샘플 코드에 포함되어 있습니다.

또한, 맞춤형 슬랙 명령어를 구현하는 함수를 만들 수도 있습니다. 이를 위해 Amazon API Gateway를 활용하여, 각 함수의 HTTP 엔드 포인트를 만들고 엔드 포인트에서 명령어를 실행할 슬랙 채널을 설정하면 됩니다. 예를 들어, 아래 설정은 /scale/forcealarm 명령어를 위한 것입니다.

이벤트 핸들러 함수는 사용자, 명령어, 채널 등에 대한 접근 권한이 있습니다.

def lambda_handler(event, context):
    req_body = event['body']
    params = parse_qs(req_body)

    user = params['user_name'][0]
    command = params['command'][0]
    channel = params['channel_name'][0]
    command_text = params['text'][0]

POST 메서드에 대한 엔드 포인트를 설정하고 NONE에게 권한을 설정하면 됩니다. 또한, JSON에 요청하는 본문을 연결하면 됩니다. 각 샘플 코드에 포함되어 있는 상단의 주석 부분에 좀 더 자세한 정보들이 있으니 참고하시면 됩니다.

여러분의 함수를 공유해 주세요!
이러한 방법을 통해 여러분의 운영 방식을 획기적으로 개선할 다양한 Lambda  함수에 대한 아이디어 및 코드를 공유해 주시면 소개해 드리겠습니다.

Jeff;

이 글은 New – Slack Integration Blueprints for AWS Lambda의 한국어 번역입니다.

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의 신규 서비스 소식입니다.

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의 한국어 번역입니다.

Amazon S3 기능 추가 – 알람 기능 및 버킷 측정 기준 향상

2006년 봄에 Amazon Simple Storage Service (S3)간단한 블로그 공지로부터 시작했습니다. 그동안 간편하지만 강력한 서비스 모델을 유지해 오면서, 가격 인하를 포함하여 중복을 감소한 스토리지, VPC 엔드 포인트, 리전간 복제 기능이벤트 노티피게이션 기능 등을 추가해 왔습니다.

작년에 이벤트 알림 기능을 추가한 이후 다양한 객체 이벤트에 대한 알림을 지원해 왔습니다. 예를 들어, PUT, POST, Copy, Multipart Upload 등의 이벤트가 있을 때 알람을 지원합니다. 이러한 알람 통지 기능은 모든 버킷의 객체가 대상입니다. 오늘 부터 객체들이 삭제 되었을 때, 접두사 및 접미사(prefixes 및 suffixes) 필터링을 지원합니다. 또한, 버킷 수준에서 Amazon CloudWatch 메트릭 지원합니다.

알림 통지 기능 향상
또한, S3 버킷에서 객체가 삭제 된 경우에 알람을 통지하도록 설정할 수 있습니다. 다른 형식의 통지와 마찬가지로, 삭제 통지는 SQS 큐(Queue)나 SNS 토픽(Topic), AWS Lambda function에 연결해서 보낼 수 있습니다. 이러한 객체 삭제 알림은 DELETE 수행이 될 때 S3 객체를 관리하기 위한 인덱스 업데이트 및 데이터 추적 등에 사용할 수 있습니다.

또한, 객체 이름의 접두사와 접미사를 사용한 필터를 사용할 수 있습니다. 다음 예제에서는 특정 버킷에서 “images /” 접두사 “.png” 접미사의 객체가 삭제 된 경우에 알람을 통지 할 수 있습니다.

관리 콘솔에서 여러 개의 알람 통지를 생성 및 편집 할 수 있습니다.

CloudWatch 스토리지 측정 기준
Amazon CloudWatch는 AWS 서비스 및 여러분이 추가한 응용 프로그램의 측정 값 추적 및 알람 기능을 가지고 있습니다. 알람 설정은 경과 시간 동안 임계값을 초과 할 때 발생합니다. S3의 모니터 및 알람 기능을 S3에 대해서도 할 수 있습니다. 지원되는 측정 지표는 버킷 당 총 바이트 수 (표준 및 RRS)과 총 객체 수입니다. 측정 기준에 따른 결과는 AWS 관리 콘솔에서 볼 수 있습니다.

측정 기준은 빌링과 함께 마찬가지로 매일 업데이트 합니다. 또한, 스토리지 라이프 사이클 규칙 등에 의해 Glacier로 이동하도록 설정 된 객체는 제외됩니다.

지금 사용 가능
이 기능들은 오늘 부터 바로 사용이 가능합니다.

Jeff;

이 글은 Amazon S3 Update – Notification Enhancements & Bucket Metrics의 한국어 번역입니다.

DynamoDB 신규 기능 – 스트림 및 Lambda 데이터 트리거 + 리전간 복제

Amazon DynamoDB에 여러 가지 새로운 소식이 있습니다. 먼저 DynamoDB 스트림 기능이 추가되었으며, AWS Lambda를 통해 스트림 데이터 활용이 가능합니다. 두 번째는 하나의 DynamoDB 테이블에서 다른 테이블로 복제가 가능하고, 리전(Regions)을 넘어서도 가능해졌습니다.

지금 부터 자세히 살펴 보겠습니다.

DynamoDB Streams
지난 가을에 re:Invent 행사 며칠 전 DynamoDB 스트림에 대한 미리 보기 기능을 출시했습니다. 많은 사용자들이 DynamoDB 테이블의 변경을 추적하기를 원하셨기 때문이었습니다.

이 기능은 오늘부터 정식으로 사용할 수 있으며, 바로 DynamoDB 테이블에 기능을 활성화하면 모든 변경 사항(put, update, delete)를 24시간 언제든지 stream record로서 실시간으로 스트리밍으로 받을 수 있습니다. 여러 개의 스트림 레코드는 빠르고 효율적인 처리를 위해 샤드(shard)에 그룹으로 만들어서 하나의 단위로 변환됩니다.

테이블 변경 순서의 상대적인 위치는 하나의 고유키로 만들어서 샤드안에 저장됩니다. 이를 통해 항목 변화를 정확히 추적할 수 있도록 샤드 내에 스트림 레코드를 쉽게 처리할 수 있게 됩니다.

“Interactive Intelligence는 Amazon DynamoDB의 리전간 복제 기능을 처음 테스트 해보고 매우 놀라웠습니다. PureCloud 플랫폼이 이 기능을 처음 도입을 해보고, 빠르고 쉽게 AWS 리전간 데이터가 쉽게 복제되어서 운영 및 기술 지원 비용을 확실히 감소할 수 있게 되었습니다.”
Mike Szilagyi, PureCloud Service Technology 부사장
Interactive Intelligence

프로그램 코드를 사용해서 샤드에서 레코드를 추출한 후, 변환 받은 다음 필요한 기능을 수행할 수 있습니다. 각 레코드는 미리 생성된 테이블 쓰기 용량 내에서 두 번 정도에 변환 받을 수 있습니다.

스트림 기능을 활성화하려면, 테이블을 만들 때 CreateTable를 호출하여 스트림에 대한 파라미터를 넣어 만들 수 있습니다. 기존 테이블에서도 UpdateTable에서 비슷한 파라미터를 넣으시면 됩니다. 각각의 경우, 표준 스펙에 스트림을 시작할지 말지에 대한 플래그(flag)와 보기 형식(저장 및 반환 항목키 만, 새로운 이미지, 예전 이미지 혹은 둘 다)를 포함해야 합니다.

좀 더 자세한 사항은 신규 기능에 대한 DynamoDB Streams Developer Guide를 참고하시기 바랍니다.

추가 비용 없이 여러분의 테이블에 스트리밍 기능을 바로 만드실 수 있으며, 스트림에서 데이터를 읽을 때만 과금이 되는데 GetRecords를 통한 호출 시 1MB까지 데이터를 꺼내 올 수 있습니다. 좀 더 자세한 것은 요금 정책을 참고하시면 됩니다.

DynamoDB 스트림 + Lambda = 데이터베이스 트리거
AWS Lambda는 (현재 Node.js와 자바)를 통해 만든 프로그래밍 코드를 클라우드 내에서 실행하는 신개념의 클라우드 함수입니다.  장애나 확장성에 대한 고려 없이도 100 밀리초 단위로 실행한 시간 만큼만 과금을 하는 경제적인 모델을 가진 서비스입니다.

오늘 DynamoDB 스트림 기능을 정식 출시함으로서 테이블이 더 커지거나 쿼리가 많아질 때, 확장성을 고려하지 않고도 기존의 프로그래밍 코드보다 훨씬 적은 노력만으로 (Lambda를 이용하여) 스트림 레코드를 처리할 수 있습니다.

즉,  이 두 가지를 조합해서 간단한 NoSQL 스타일의 데이터베이스 트리거를 만들 수 있습니다. 예전에 관계형 DB의 트리거는 엔진 내에서 구현되었고, 때문에 엔진에서 정의된 동작만 수행할 수 있는 제한이 있었습니다. Lambda를 이용하면, 데이터 추가, 삭제 및 테이블 항목 변경이 일어날 때 마다 관련되는 동작을 원하는 대로 구현할 수 있습니다. 신규 혹은 과거 이미지의 변경 사항을 분석하고, 데이터 양식을 변경하거나 특정 비지니스 로직을 동기 혹은 비동기로 강제하는 것도 가능합니다. 여러분이 좀 더 애플리케이션 개발에 중요한 부분에 집중하도록 Lambda를 통해 호스팅과 확장 문제를 관리하게 만들어 둘 수도 있습니다.

Lambda 코드를 설정해서 스트림 변경을 확인하는 것도 간단합니다. 새 테이블을 통해 하는 방법을 간단히 살펴 보겠습니다. 먼저 Lambda를 위한 IAM 역할을 만들고, 관리 콘솔에서 Create Lambda function을 실행해 봅니다. 예제들 중 dynamodb-process-stream를 선택해 보겠습니다.

먼저 Lambda 함수 예제 코드와 이벤트 소스를 설정합니다.콘솔 화면에 이벤트 소스로 user_table이라는 테이블을 연결해서, 100개까지의 스트림 레코드를 받아서 새로운 레코드로 처리하는 기능을 수행해 보겠습니다.

예제에는 현재 상태를 테스트해 보는 목적의 코드가 있으며, 간단한 이름을 정한 후 (ProcessUserTableRecords) DynamoDB에 접근할 수 있는 IAM 역할을 선택합니다.

이제 이벤트 소스를 활성화 해보겠습니다. (Lambda 코드를 테스트해 본 후에 실제 동작 하도록 하는 게 좋습니다.)

Create function을 눌러서 이벤트 소스로서 테이블 업데이트 스트림을 처리하는 함수를 만듭니다. Lambda 콘솔의 Event sources탭에서 상태와 다른 이벤트 소스도 보실 수 있습니다.

자, 이제 설정이 다 끝났고 여기서 테이블의 업데이트 스트림을 연결 한 후, 레코드를 처리해 봅시다. 이를 위해 DynamoDB 콘솔로 옮겨가서 데이터를 몇 개 추가해서 스트림에 변화가 생기도록 해 보겠습니다.

Lambda 콘솔에 들어와 보면, 기대했던 동작이 일어났는지 확인해 볼 수 있습니다. 모니터링 탭을 클릭해 보면 오류 없이 Lambda 함수가 두 번 실행된 것을 알 수 있습니다.

일단 잘 동작한 것으로 보고 CloudWatch 로그를 좀 더 자세히 보겠습니다.

만약 제가 실제 애플리케이션을 만들었다면, 기본 예제에 더 많은 기능을 추가해서 만들어 볼 수 있었을 것입니다.

AWS 고객인 Mapbox는DynamoDB Streams와 Lambda를 이용한 후기를 Scaling the Mapbox Infrastructure with DynamoDB Streams를 통해 소개하였습니다.

DynamoDB와 Lambda를 결합한 구현 방식에 대해서는 Using DynamoDB Streams and AWS Lambda 문서를 참고하시기 바랍니다. DynamoDB Trigger에는 추가 요금이 없고 Lambda 함수 실행에 대한 과금만 이루어 지며 자세한 것은 Lambda 요금 정보를 참고하시기 바랍니다.

이러한 조합을 통해 여러분의 애플리케이션이 더 간단하고 강력하며 반응성이 높은 기능을 추가할 수 있기를 기대해 봅니다.

리전(Region)간 DynamoDB 복제 기능
DynamoDB 스트림 기능과 아울러 AWS 리전 간 데이터를 쉽게 복제할 수 있는 기능을 소개해드립니다. 이 애플리케이션은 작년에 저희가 배포한 DynamoDB Cross Region Replication library를 통해 구현한 것입니다. (앞으로도 이 라이브러리를 여러분의 앱에 사용하셔도 됩니다.)

이를 통해 DynamoDB를 여러개의 리전으로 중복으로 복제할 수 있는데, 이는 재난 복구나 여러 지역에서 낮은 지연을 통해 접근이 필요한 여러가지 이유가 있을 수 있습니다. 보시다시피 아주 간단하게 리플리카를 만들어서 운영할 수 있게 됩니다.

이 앱은 AWS Elastic Beanstalk에서도 실행할 수 있고, Amazon EC2 Container Service를 사용할 수 있으며, AWS CloudFormation 템플릿으로도 구현 가능합니다. DynamoDB 콘솔에서 초기화 할 수 있으며 CloudFormation을 통해 스택이나 콘테이너를 생성하기 위한 템플릿 정보를 입력할 수 있습니다.

스택(Stack, 템플릿을 통해 만들어지는 AWS 자원에 대한 이름)을 입력하고 Next를 눌러 파라미터를 입력할 수 있습니다. (대부분 기본값을 그대로 두시면 됩니다.)

메타테이터 테이블은 복제에 필요한 정보를 포함합니다. 이는 어떤 테이블을 복제할 것인지 어디에 저장할 것인지를 설정합니다. 복제용 앱을 띄운 후, 온라인 설정 화면에 접속하술 수 있습니다. (CloudFormation 템플릿이 URL을 만들어 줍니다.)

이 기능 또한, 추가 요금이 없습니다. 이 기능을 활용하기 위한 기본적인 DynamoDB 리소스(미리 설정된 입출력 한도, 복제 테이블의 저장 용량, 리전간 데이터 전송 비용, 스트림으로 데이터 읽기 및 애플리케이션을 제어하는데 필요한 EC2 인스턴스 및 SQS 서비스 이용 비용 등)에 대해서만 과금이 됩니다. 더 자세한 것은 DynamoDB 요금페이지를 참고하시기 바랍니다.

리전 간 복제에 대한 더 자세한 정보는 Cross Region Replication를 참고하시기 바랍니다.

Jeff;

이 글은 DynamoDB Update – Triggers (Streams + Lambda) + Cross-Region Replication App의 한국어 번역입니다.

AWS Lambda 동경 리전에 출시!

오늘 부터 AWS Lambda가 아시아 태평양(동경) 리전에서 사용할 수 있습니다.

AWS Lambda는 AWS 서비스 이벤트에 따라 코드를 실행하고 컴퓨팅 리소스를 자동으로 관리하는 클라우드 서비스이며, 서버 없이도 신속하게 기능을 수행할 수 있는 애플리케이션 구축을 쉽게 개발할 수 있습니다. 예를 들어, AWS Lambda는 S3에 이미지를 업로드하면, 이에 따라 썸네일을 만든다던지 백업을 한다던지 하는 작업을 수 밀리초 내에 실행할 수 있습니다.

인프라 운영자들은 AWS Lambda를 통해 컴퓨팅 자원의 변화에 따라 실행하는 새로운 백엔드 서비스를 만드는 데 사용할 수 있으며, 개발자들은 서버 없이도 원하는 기능을 수행하는 모바일 서비스를 만들 수 있습니다. AWS Lambda는 처리 된 요청 수와 코드 실행에 필요한 된 컴퓨팅 시간에 대해서만 비용이 청구됩니다.

AWS Lambda는 현재 US East (N. Virginia), US West (Oregon), EU (Ireland) 그리고 Asia Pacific (Tokyo)의 지역에서 사용할 수 있습니다. 자세한 내용은 제품 페이지를 참조하십시오.

본 글은 AWS Lambda Available in Asia Pacific (Tokyo)를 번역 및 편집하였습니다.

Alexa Skills Kit, Alexa Voice Service 및 Alexa Fund 소개

Amazon Echo는 음성 인식을 위해 만들어진 새로은 기기입니다. Echo는 AWS 기반 클라우드 음성 서비스인 Alexa와 연결됩니다. Alexa에게 질문에 대한 답을 얻거나, 음악을 재생하거나 뉴스 검색 결과 등을 요청할 수 있습니다.

Amazon Echo 근처에서 부팅 단어(Alexa 또는 Amazon 중 하나)를 말하고 질문이나 요청을 할 수 있는데 예를 들어, “Alexa 시애틀 매리너스의 다음 경기는 언제에요?” 혹은 “Alexa 시애틀에 비가 오고 있나요?”라고 물어보면, 클라우드기반 음성 인식 소프트웨어가 여러분의 질문을 이해하고 처리합니다.

오늘 Alexa Skills Kit(ASK)를 발표하여 Alexa 위한 새로운 음성 기반(음성 구동) 기능을 구현할 수 있게 되었습니다. 개발자들이 몇 줄의 코드로 몇 분만에 기존 서비스를 Alexa에 연결할 수 있습니다. 대화 인식과 자연어 처리에 대해 아무것도 배경 지식이 없다하더라도 몇 시간 만에 완전히 새로운 음성 인식 환경을 구축 할 수 있습니다.

이를 위해 미리보기 형태로 개발자 대상으로 Alexa Voice Service (AVS)을 공개합니다. 하드웨어 제조 업체와 Internet of Things (IoT) 관심자들께서는 오늘 등록해 주십시오. 스피커, 마이크 및 인터넷 연결이 되는 모든 장치는 몇 줄의 코드로 Alexa와 통합 할 수 있습니다.

여러분의 상상력을 자극하는 데 도움이 될 음성 기술 관련 혁신을 촉진하기 위해 Alexa Fund도 시작합니다. Alexa Fund는 개발자와 제조 업체, 그리고 고객의 삶을 향상시키기 위해 사람 목소리에 대해 새로운 프로젝트를 지원하기 위해 최대 1억 달러를 투자합니다.

ASK와 AWS Lambda
AWS Lambda를 사용하여 Alexa위한 새로운 기술을 만들 수 있습니다. Node.js를 사용하여 코드를 쓰고, AWS Management Console을 통해 Lambda에 업로드만 하면 됩니다. 업로드 콘솔에서 만든 샘플 이벤트를 사용하여 테스트를 한 후, Alexa Developer Portal에 로그인하거나 포털에서 (Alexa App 제작 과정을 따라) 코드 등록, ARN (Amazon Resource Name)을 응용 프로그램에 연결하는 데 사용할 수 있습니다. 테스트가 완료되면 응용 프로그램을 Echo의 소유자가 사용할 수 있도록 업로드 할 수 있습니다. Lambda는 확장 가능한 무장애 클라우드 환경에서 여러분의 코드를 호스팅하고 실행합니다. Alexa 기술을 지원하는 기능은 Lambda 무료 서비스 내에서 가능하며, Developing Your Alexa Skill as a Lambda Function을 참조하십시오.

웹 서비스로서 ASK
Amazon Elastic Compute Cloud (EC2)나 AWS Elastic Beanstalk 또는 기존 데이터 센터 서버에서도 응용 프로그램을 웹 서비스로 구축 할 수 있습니다. 음성 인식 서비스는 인터넷 접근이 가능해야하며, Alexa 응용 프로그램 인터페이스 사용을 준수해야합니다. 443 포트에서 HTTPS over SSL/TLS를 지원하고, 서비스 엔드 포인트의 도메인 이름과 일치하는 SSL 인증서를 제공하면 됩니다. 여러분의 코드에서는 실제로 Alexa에서 온 요청인지 확인하고, 시간 기반 메시지 서명을 확인할 필요가 있습니다. 이 옵션에 대한 자세한 정보는 Developing Your Alexa App as a Web Service를 참고하시기 바랍니다.

더 자세한 정보
ASK, AVS와 Alexa Fund에 관한 더 많은 정보는 아래 링크를 참고하시기 바랍니다.

– Jeff

이 글은 New – Alexa Skills Kit, Alexa Voice Service, Alexa Fund의 한국어 번역입니다.

AWS Lambda 자바 언어 지원 시작

많은 AWS 고객들이 AWS Lambda를 이용하여 깔끔하고 전향적인 애플리케이션을 만들고 있습니다. 문서나 이미지를 업로드 했을 때 처리나 AWS CloudTrail의 로그 처리, Amazon Kinesis의 실시간 데이터 처리 등에 활용되고 있습니다. 최근에 동기 데이터 처리가 가능해져서 Lambda는 모바일 및 웹 그리고 IoT 백엔드 클라우드 서비스로 각광을 받고 있습니다.

내부 메일링 리스트에서도 Lambda를 이용한 다양한 방법에 대한 토론이 있었는데, 많은 경우 전통적인 데이터 프로세스를 실제로 적용가능하다는 결론을 내렸습니다. 고객들 역시 호스팅이나 확장성의 관리에서 벗어나 애플리케이션에 집중할 수 있어서 매우 좋아하고 있습니다. 지금까지는 개발자들이 서버 기반 앱을 위한 자바스크립트 모듈인 Node.js를 이용해서 Lambda 함수를 만들었습니다.

자바(Java) 언어 지원
오늘 부터 Lambda 함수를 자바 언어를 통해 더 강력한 기능을 수행할 수 있게 되었습니다. 여기에 대해 많은 개발자들의 요구가 있었고, 이를 지원할 수 있게 되어 매우 기쁩니다. Lambda 개발자를 위한 계획 중 추가 프로그래밍 언어 지원의 첫 번째 장이 열린 것입니다.

여러분은 Javs 8 기반 코드를 작성할 수 있으며 (What’s New in JDK 8 참고), 이를 기반한 자바 라이브러리를 사용할 수 있습니다. AWS SDK for Java를 이용하여 AWS API를 호출할 수도 있습니다.

Lambda에 대한 두 가지 라이브러리를 제공합니다: aws-lambda-java-core: Lambda 함수 핸들러, 콘텍스트 객체, aws-lambda-java-events AWS 이벤트를 정의 (Amazon Simple Storage Service (S3), Amazon Simple Notification Service (SNS), Amazon DynamoDB, Amazon KinesisAmazon Cognito). 자세한 사용 방법은 Lambda programming model for Java 문서를 읽어보시면 됩니다.

Lambda 함수는 두 가지 방법을 이용할 수 있는데, 먼저 객체를 입출력하는 높은 수준의 모델(Java POJO나 프리미티브 입출력 형식 사용 가능)을 이용하는 것입니다.

public lambdaHandler( input, Context context) throws IOException; 
public lambdaHandler( input) throws IOException;

POJO를 사용하지 않거나, Lambda 시리얼리제이션 모델이 여러분의 요구를 충족하지 않는 경우, 스트림 모델을 쓸 수 있습니다.

public void lambdaHandler(InputStream input, OutputStream output, Context context) 
  throws IOException;

Lambda 함수가 정의한 클래스에는  인자가 없는 퍼블릭 컨스트럭터(public zero-argument constructor)나  정적 핸들러 메소드를 정의해야 합니다. 다른 방법으로 Lambda 코어 자바 라이브러리 내의 핸들러 인터페이스(RequestHandler::handleRequest or RequestStreamHandler::handleRequest)를 사용할 수도 있습니다.

패키징, 배포 및 업로드
현재 사용하는 개발 도구를 그대로 쓸 수 있습니다. 컴파일된 자바 코드를 Lambda에서 사용하시려면  ZIP 혹은 JAR 파일에 컴파일된 클래스 파일을 넣고 업로드하면 됩니다. (참고. Lambda 패키지 업로드 크기는 50MB로 제한되어 있음). 핸들러 함수는 자바 디렉토리 구조에 따라 구성되어 있어야 하며(예: com/mypackage/MyHandler.class), JAR 파일은 lib 서브 디렉토리에 있어야 합니다. 배포를 쉽게 하기 위해서는 Maven이나 Gradle같은 자바 개발 도구를 사용합니다.

ZIP 파일을 올릴 때는 “java8″이라고 지정해야 합니다. 만약 핸들러 인터페이스을 구현했다면, 클래스명을 넣어야 합니다. 그렇지 않다면 전체 메소드 레퍼런스를 입력합니다. (예: com.mypackage.LambdaHandler::functionHandler).

AWS Toolkit for Eclipse사용하기
AWS Toolkit for Eclipse 플러그인을 이용하면 자동으로 생성해서 ZIP 파일로 업로드할 수 있습니다. AWS 메뉴에서 Lambda 프로젝트를 만들 수 있습니다.

프로젝트에 대한 설명을 넣은 후 도구로 부터 템플릿을 생성할 수 있습니다.

함수를 만들고 나서 한번의 클릭으로 실행할 수 있습니다.

그리고 확인 가능합니다.

지금 부터 사용해 보기
바로 지금 부터 자바로 Lambda 함수를 실행해 볼 수 있습니다.

더 자세히 보시려면 Authoring Lambda Functions in Java 문서를 참고하세요.

Jeff;

이 글은 AWS Lambda Update – Run Java Code in Response to Events의 한국어 번역입니다. AWS Lambda에 대한 자세한 소개는 AWS Lambda – 클라우드에서 코드 실행을 참고하시기 바랍니다.