Category: 개발자


AWS CodeCommit을 위한 IAM 기반 아이디 생성 및 인증하기

HTTPS를 통해 AWS CodeCommit 저장소(repository)에 인증하는 간단한 방법을 소개합니다.

Git 자격 증명(Git Credentials)을 사용하면, 명령 줄이나 Git CLI, 혹은 HTTPS 인증을 지원하는 어떤 Git 도구에서든 AWS CodeCommit 저장소에 액세스하는데 사용 할 수 있는 정적 사용자 이름과 암호를 IAM (Identity and Access Management) 콘솔에서 생성 할 수 있습니다.이는 정적 자격 증명이기 때문에, 로컬 운영 체제에 포함된 암호 관리 도구를 사용하여 캐시하거나 자격 증명 관리 유틸리티에 저장할 수 있습니다. 이를 통해 수분 내에 AWS CodeCommit을 시작 할 수 있습니다.

HTTPS를 통해 AWS CodeCommit 저장소에 연결하기 위해 AWS CLI를 다운로드하거나 Git 클라이언트를 구성 할 필요가 없습니다. 또한 인기있는 Git GUI 클라이언트 (예 : TowerUI)와 IDE(예 : Eclipse, IntelliJ 및 Visual Studio)등 사용자 이름과 비밀번호를 이용한 인증을 지원하는 타사 도구에서 AWS CodeCommit 저장소를 손쉽게 연결할 수 있습니다.그러면 이 기능을 왜 추가했을까요? 이전까지 HTTPS 연결을 통해 AWS CodeCommit을 이용하려는 사용자는 인증을 위해 AWS credential helper를 구성해야했습니다.

일부 고객 분들은 이러한 credential helper가 가끔씩 Keychain Access와 Windows Vault 같은 암호 관리 도구를 방해하여 인증 실패를 발생시킨다고 말했습니다. 또한 많은 Git GUI 도구와 IDE는 원격 Git 저장소에 연결하기 위해 정적 사용자 이름과 암호가 필요하며 credential helper를 이용한 연결을 지원하지 않습니다.이번 블로그 게시물에서는 AWS CodeCommit 저장소 생성, Git 자격 증명 생성, AWS CodeCommit 저장소에 대한 CLI Access 설정 과정을 설명합니다.

Git Credentials 실습
Dave가 AWS CodeCommit에서 저장소를 만들고 그의 컴퓨터에서 로컬 액세스를 설정하려는 상황을 가정 해봅시다.

선행 조건: Dave가 이전에 로컬 컴퓨터에 AWS CodeCommit에 대한 credential helper를 구성한 경우, .gitconfig 파일을 편집하여 해당 정보를 제거해야 합니다. 또한 로컬 컴퓨터가 MacOS인 경우 Keychain Access에서 캐시된 자격 증명을 지워야 할 수 있습니다.

Git 자격 증명을 이용하면, Dave는 이제 4 단계의 간단한 작업으로 저장소를 만들고 AWS CodeCommit을 사용 할 수 있습니다.

1 단계: IAM 사용자에게 필수 권한이 ​​있는지 확인합니다.
Dave가 Git 자격 증명을 이용한 AWS CodeCommit 액세스 권한을 설정하려면 그의 IAM 사용자이 아래 관리 정책(managed policies)에 연결되어 있어야 합니다. (또는 이와 동등한 권한)

  • AWSCodeCommitPowerUser (or an appropriate CodeCommit managed policy)
  • IAMSelfManageServiceSpecificCredentials
  • IAMReadOnlyAccess

2 단계 : AWS CodeCommit 저장소를 생성합니다.
다음으로, AWS CodeCommit 콘솔에 로그인하고 저장소가 없는 경우 새로 저장소를 만듭니다. 액세스 권한이 있다면 AWS 계정 내 어떤 저장소를 선택하여도 괜찮습니다. Git 자격 증명을 만드는 방법은 도움말 패널에 나와 있습니다. (지시 사항이 표시되지 않으면 연결 단추를 선택하십시오.) IAM 사용자 링크를 클릭하면 IAM 콘솔이 열리며 자격 증명을 생성 할 수 있습니다. (역자주: 현재 AWS CodeCommit은 한국어 콘솔을 제공하고 있습니다.)

3 단계 : IAM 콘솔에서 HTTPS Git 자격 증명 만들기
IAM 사용자 페이지에서, Security Credentials 탭을 선택한 후 HTTPS Git credentials for AWS CodeCommit 영역의 Generate 버튼을 클릭합니다. 사용자 이름과 암호가 생성되고 표시됩니다. 자격 증명을 파일로 다운로드 할 수 있습니다.

GitCred_Blog2

Note: 이 단계에서만 암호를 확인하거나 다운로드할 수 있습니다.

4 단계 : 로컬 시스템 저장소에 복제합니다.
AWS CodeCommit 콘솔 페이지에서 Clone URL을 선택한 다음, 저장소 복제를 위한 HTTPS 링크를 복사합니다. 명령 행이나 터미널에서 방금 복사한 링크를 사용하여 저장소를 복제합니다. 예를 들어 다음과 같이 HTTP 링크를 복사하고,

그런 다음, 명령 줄이나 터미널에 아래와 같이 입력합니다.

$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/TestRepo_Dave

사용자 이름과 암호를 묻는 메시지가 나타나면 3 단계에서 생성 한 Git 자격 증명 (사용자 이름과 암호)을 제공합니다.

이제 코드를 새 저장소로 푸시할 준비가 되었습니다.

Git 자격 증명은 요구 사항에 따라 활성화하거나 비활성화 할 수 있습니다. 또한 필요한 경우, 암호를 재설정 할 수도 있습니다.

다음 단계

  1. 필요에 따라 Git 자격 증명 캐싱 명령(링크를 참조)을 사용하여 자격 증명을 캐시 할 수 있습니다 .
  2. 공동 작업자를 AWS CodeCommit 저장소에서 작업 할 수 있도록 초대하고 싶습니까? AWS 계정에 새 IAM 사용자를 만들고, 해당 사용자에 대한 Git 자격 증명을 만든 후 저장소 URL과 Git 자격 증명을 공동 작업하려는 사람과 안전하게 공유하기 만하면 됩니다.
  3. Git 자격 증명 (저장된 사용자 이름 및 비밀번호)을 통한 원격 Git 리포지토리 연결을 지원하는 타사 클라이언트(third-party client)에 연결합니다. 사실상 모든 도구와 IDE를 정적 자격 증명을 사용하여 연결할 수 있습니다. 우리는 다음을 테스트했습니다 :
    • Visual Studio (기본 Git plugin 사용)
    • Eclipse IDE (기본 Git plugin 사용)
    • Git Tower UI

자세한 내용은 AWS CodeCommit 설명서를 참조하십시오.

AWS CodeCommit에 연결하는 새로운 방법을 제공하게 된 것을 기쁘게 생각합니다. 더 많은 Tool과 IDE에서 AWS CodeCommit 저장소를 사용하실 수 있기를 바랍니다.

이 글은 AWS DevOps 블로그의 Introducing Git Credentials: A Simple Way to Connect to AWS CodeCommit Repositories Using a Static User Name and Password의 한국어 번역으로 강정희 솔루션즈 아키텍트께서 번역해 주셨습니다.

AWS Twitch 채널 – 클라우드 라이브 코딩 및 Maker를 위한 방송에 참여하세요!

트위치 (Twitch)는 개발자, 게이머 및 아티스트를 위한 글로벌 온라인 커뮤니티 스트리밍 비디오 플랫폼 중 하나입니다. 매일 열심히 실시간 방송을 하는 콘텐츠 창작자의 열정을 참여하고자, 수 백만명이 Twich에 참여하고 있습니다.

AWS 개발자 마케팅 부서에서는 작년 11월 부터 AWS Twitch Channel을 추가하여, 글로벌 에반젤리스트들이 Twitch에서 최신 AWS 기술 정보를 제공하고 있습니다. AWS 트위치 채널에서는 클라우드 기술 관심자를 대상으로 최신 소식 및 라이브 코딩 등의 다양한 생방송을 하고 있습니다.  자세한 정보는 https://aws.amazon.com/twitch/를 방문하십시오.

AWS Twitch 채널에는 연중 내내 다양한 ​​주제에 대해 생방송을 진행할 예정이며, AWS를 통한 라이브 코딩은 Randall Hunt, Julio Faerman, Abby Fuller등의 테크 에반젤리스트들이 개발자 관점에서 실제 AWS 서비스를 다루면서애플리케이션을 직접 만드는 것을 실제로 보여줍니다.

AWS Maker Studio는 5월 17일일 부터 첫 선을 보이는 프로그램으로 특히 Maker를 위한 프로젝트 및 솔루션을 포함합니다. Todd Varland, Trevor Hykes, Anupam Mishra 는 첫 번째 시즌 동안 클라우드 기반 로봇을 제작할 예정입니다.  관심 있는 분들은 꼭 참여해 보시기 바랍니다.

더 자세한 일정은 https://aws.amazon.com/ko/twitch/ 페이지를 참고하시거나 @awslcoud 트위터 계정을 팔로우 하시기 바랍니다.

Channy(윤석찬);

AWS 클라우드 에반젤리즘 2년을 돌아보며…

AWS 코리아에서 한국 개발자들이 클라우드 기술을 좀 더 잘 배울 수 있도록 개발자 커뮤니티 활동을 돕고 있는 윤석찬입니다. 2015년 5월 9일에 AWS 클라우드 에반젤리스트 활동이라는 글로 정식 인사를 드린 지 엊그제 같은데, 벌써 만 2년이 흘렀습니다. 그동안 국내 클라우드 산업과 이를 통한 개발자들의 삶에 많은 변화가 있었습니다.

이 글에서는 그동안 저의 활동을 돌아보면서, 클라우드를 통해 어떻게 국내 IT 환경이 바뀌고 있는지 잠시 말씀드리고자 합니다.

총 150여회의 강연과 1만 8천여명과의 만남
우선 제가 2년전에 몇 가지 약속을 드렸습니다. 그중에 먼저  찾아가는 클라우드 컴퓨팅 – 에반젤리스트와의 만남이라는 프로그램과 아울러 다양한 온오프라인 행사에서 여러분을 찾아서 만나기로 하였습니다. 저는 지난 2년간 총 150여회의 강연을 통해 18,000여명의 고객, 개발자와 대학생 등과 함께 만났습니다. (이들 강연 중 주요 발표는 동영상 및 강연 자료 다운로드를 통해 만나보실 수 있습니다.)

이를 통해 AWS 주요 행사, 온라인 세미나, 개발자 커뮤니티 및 대학교 및 고객사 현장에서 다양한 분들을 만나면서 클라우드가 개발 현장을 바꾸고 있음을 몸소 체험할 수 있었습니다. 개발자들이 말하는 AWS 기반 ‘서버리스 아키텍처’를 비롯하여,매주 주간소식 모음의 AWS 고객 및 개발자 추천 콘텐츠에서 다양한 개발자가 직접 쓴 AWS 콘텐츠를 만나보실 수 있습니다.

AWS Summit 행사 중 AWSKRUG 커뮤니티 데이 참여 개발자들과…

특히, 올해 3월에 3일간 3천여명이 참여한 AWSomeDay 2017을 비롯해서, 4월 7천여명이 참여한 지난 AWS Summit 2017 등에서 클라우드 컴퓨팅이 이미 표준이 되었음을 동감하시리라 생각합니다.

총 450여개가 넘는 블로그 글과 다양한 콘텐츠 공유
또 다른 약속은 다양한 채널을 통해 AWS 관련 기술 정보를 빠르게 전달해 드리는 것이었습니다.

2년 전 시작한 AWS Korea 공식 블로그에는 총 450여개의 글이 올려졌으며, 소셜 미디어 채널인 공식 트위터페이스북에서 각각 1,500여명과 만 여명이 실시간으로 AWS 소식을 받아 보고 있습니다.  AWS 행사를 통해 생산된 470여개의 발표 자료 및 400여개 동영상이 올려졌으며, 2천여명이 넘는 분들이 공식 유튜브슬라이드쉐어를 팔로우하고 있습니다.

현재, AWS 코리아에서 소셜 미디어와 디지털 콘텐츠를 전담하실 디지털 마케팅 매니저를 찾고 있으니, 저와 함께 일하실 관심 있는 분들의 많은 지원 바랍니다.

1만 2천명의 AWSKRUG 회원과 20여개 대학 AWS Educate 가입
마지막 약속은 국내 개발자 커뮤니티들이 클라우드 기술에 대한 이해도를 높이고, 대학생들이 클라우드 기술을 활용하여 창의성 높은 서비스를 만들 수 있는 토대를 만들기 위한 다양한 지원 프로그램을 제공하는 것이었습니다.

제가 입사 때, 4천여명이던 AWS한국 사용자모임(AWSKRUG)는 3배가 늘어서, 현재 1만 2천여명이 되었으며, 리더인 정민영님박상욱님은 글로벌 AWS 전문가 그룹인 AWS Community Heroes에 선정되었습니다. 작년 하반기 부터, 강남, 판교 및 구로 디지털을 비롯 데이터 사이언스, 자격증 준비 모임 등 10여개의 소모임이 만들어져서 현재 매달 다수의 소모임이 운영되고 있습니다. (그동안 AWSKRUG의 행사 및 소모임 자료는 Github 페이지를 참고하세요.)

대학생들이 실습 수업 및 다양한 프로젝트를 수행할 때 AWS를 통해 현실적인 개발 업무를 체득할 수 있는 AWS Educate 프로그램은 총 20여개 대학이 가입하였습니다. 뿐만 아니라 비영리 대학생 교육 동아리인 멋쟁이 사자처럼 3기 부터 5기 및 대학생 연합 동아리 유니톤 등 수 천여명의 대학생 교육 및 해커톤에 직접 참여하고 AWS 클라우드 활용을 돕고 있습니다. (보다 관심 있는 대학생 여러분은 AWS Educate 대학생 가입 방법을 참고하세요.)

총 10여개 개발자 커뮤니티 및 비영리 단체 지원 중
2년 전 부터 자체 홈페이지를 가지고 있는 오픈소스 및 개발자 커뮤니티, 그리고 IT 관련 비영리 단체의 경우, 소정의 심사를 거쳐 매년 500달러 상당의 무료 AWS 크레딧을 제공하여 홈페이지 및 커뮤니티 운영을 돕고 있습니다. 현재, 나는 프로그래머다, 오픈앱콘테이너(구, 한국도커사용자모임), 생활코딩, 한국 Mozilla 커뮤니티 등 10여개 커뮤니티를 지원 중입니다.

지원 커뮤니티명 URL
나는프로그래머다 https://iamprogrammer.io
다음세대재단 (Daum Foundation) http://www.daumfoundation.org
멋쟁이 사자처럼 http://likelion.org
생활코딩 http://opentutorials.org
아마존웹서비스를 다루는 기술 http://pyrasis.com/book/TheArtOfAmazonWebServices/
코딩하는 디자이너 http://dxdseminar.com
AWSKRUG http://awskr.org
CODENAMU (구, CCKOREA) https://codenamu.org/
Mozilla 한국 커뮤니티 http://www.mozilla.or.kr
Remotty (OpenContainer, InfoVis) http://blog.remotty.com
TensorFlowKR https://www.facebook.com/groups/TensorFlowKR/
Textcube http://www.textcube.org
WEB-R http://web-r.org/

최근 인공 지능(AI)에 대한 관심이 매우 높아졌는데, 이는 클라우드 컴퓨팅과 빅 데이터의 확대 그리고 오픈 소스 딥러닝 프레임웍 등의 발전에 기인하고 있습니다. 다양한 클라우드 기반 인공 지능 서비스를 통해 스마트 애플리케이션을 개발할 수 있는 등 기술의 진입 장벽도 점차 낮아지고 있습니다. 작년 부터 매월 ZDNet에 클라우드 관련 컬럼을 쓰고 있는데, 그 중 몇 개를 소개합니다.

이러한 IT 기술 변화에 글로벌 기업들은 민감하지만 국내 클라우드 시장은 여전히 시작 단계이며, 더 많은 개발자들이 관심을 가지고 배우고 참여하셔야 합니다. 여러분이 다니는 회사 조직 뿐만 아니라 개발자 커뮤니티는 이러한 기술 민감성을 높일 수 있는 좋은 기회가 됩니다.

앞으로 AWS를 매개로 다양한 국내 개발자 커뮤니티가 하나로 만나는 기회와 서버리스(Serverless), 인공 지능(AI) 등 차세대 클라우드 기술을 위한 개발자 행사 (핸즈온랩 및 실습) 등에서 여러분을 만나 뵙기를 기대합니다.

혹시 상기 커뮤니티 지원 프로그램에 관심이 있으시거나, 개발자들의 클라우드 기술 배움을 위한 다양한 아이디어가 있으신 경우,  그리고 언제든지 저의 도움이 필요하시면 aws-korea-devsupport@amazon.com로 연락해 주시기 바랍니다.

Channy(윤석찬);

p.s. 오늘이 마침 19대 대통령 보궐 선거일입니다. 현명한 공약을 가진 후보에게 여러분의 귀중한 한표를 행사함으로서 좀 더 나은 세상을 만들 수 있습니다. 저도 여러분과 한 약속을 지키기 위해 앞으로도 계속 노력하겠습니다.

 

 

AWS CodeBuild – 완전 관리형 빌드 서비스 출시

모든 개발자는 소스 코드 변경이 일어날 때, 지속적인 통합 빌드(build) 생성 및 테스트를 실행하기 위해 공유 빌드 서버를 설정하고 운영 해야합니다. 유지 관리에 대한 부담으로 인해 다수 개발자들이 로컬 컴퓨터에서만 빌드를 만들어, 정식 서버에서 실행함으로서 한 명의 개발자에게는 동작하는데 다른 개발자에게는 동작하지 않는 상황을 초래합니다. 많은 개발 팀은 지속적 통합(Continuous Integration, CI) 및 배포 (Continuous Deployment, CD) 파이프 라인의 일부를 사용할 수 있습니다. 이러한 빌드팜의 설치 및 유지 보수 비용은 여전히 높으며 전혀 다른 운영 기술이 필요합니다. 사용률이 100%에 도달하고 빌드 요청 백 로그가 증가하는 경우를 제외하고는 가볍게 사용합니다.

AWS CodeBuild 서비스 소개
오늘 이러한 문제를 해결 해줄 AWS CodeBuild를 출시합니다. 빌드 서버를 설치, 설정 및 확장 및 패치 등에 신경쓰지 않고, CodeBuild를 활용하여 개발 과정에서 유연상을 보장하고 여러 형태의 빌드 상태나 호환성의 불일치 문제를 해결할 수 있습니다.

CodeBuild를 사용 하면, 사전에 빌드 서버를 프로비저닝 할 필요가 없으며, 대기중인 빌드를 쌓아 두는 대신에 빌드 볼륨을 활용할 수 있도록 자동으로 확장됩니다. 분당 $0.005부터 시작하는 가격으로 분당 기준으로 빌드 리소스에 비용을 지불하기 때문에 사용한 시간만 비용을 지불합니다.

CodeBuild는 완전 관리형 빌드 서비스로서, 탄력성과 확장 가능하며 사용하기 쉽습니다. 처음 빌드 서비스를 시작하려면 빌드를 수행하는 데 필요한 정보가 들어있는 빌드 프로젝트를 만들기만 하면 됩니다 빌드 프로젝트에 다음 요소가 포함됩니다.

  • 소스 레포지터리 – 소스 코드 위치 (AWS CodeCommit, GitHub 또는 S3 bucket).
  • 빌드 환경 – 언어 및 런타임 환경 (Android, Java, Python, Ruby, Go, Node.js, Docker).
  • IAM 역할 – 다른 AWS 자원으로 부터 CodeBuild  접근 허용.
  • 빌드 스펙 – YAML 양식 빌드 명령어.
  • 컴퓨팅 사양 – 사용할 컴퓨팅 및 메모리 사양  (최대 8vCPU 및 15 GB 메모리).

CodeBuild는 완전히 격리된 신규 콘테이너 기반 환경에서 각 빌드를 수행합니다. 빌드를 시작하면 아래와 같이 진행합니다.

  1. CodeBuild는 빌드 프로젝트에서 지정한 빌드 환경을 기반으로 콘테이너를 시작합니다. Android, Java, Python, Ruby, Go, Node.js 및 Docker (Docker 이미지 작성용)에 대한 맞춤형 발드 환경을 제공합니다. Docker 허브 또는 EC2 Container Registry를 참조할 수 있습니다. 선별된 빌드 환경에는 AWS SDK 및 AWS 명령 줄 인터페이스 (CLI)를 사용할 수 있습니다.
  2. CodeBuild는 빌드 도중 생긴 모든 커맨드 라인을 모아서 AWS 관리 콘솔에서 볼수 있습니다.
  3. CodeBuild는 빌드 프로젝트에 지정된 소스 저장소에서 코드를 가져옵니다.
  4. CodeBuild는 빌드 프로젝트에서 지정한 명령을 실행합니다. 각 명령은 프로젝트 빌드 스펙에서 식별된 설치, 사전 빌드, 빌드 및 빌드 후 단계를 포함 할 수 있습니다.
  5. CodeBuild 생성된 실행 파일 또는 결과물(artfacts)를 S3에 업로드합니다. AWS Key Management Service (KMS) 암호화는 선택 사항입니다.
  6. CodeBuild는 빌드에 사용 된 콘테이너를 삭제합니다.

AWS CodePipeline 빌드 서비스 공급자 중 하나로 CodeBuild를 사용할 수 있습니다. 기존 CI/CD 프로세스를 도입하고 있는 경우, 개발 프로세스를 완전히 자동화 할 수 있습니다. CodeBuild는 S3 및 AWS Identity and Access Management (IAM)와 같은 다른 AWS 서비스를 사용합니다.

선별된 빌드 환경에는 AWS CLI 및 AWS SDK가 포함됩니다. 이를 통해 CodePipelineAWS SAM를 사용하여 서버가 필요없는 응용 프로그램을 위한 완전 자동화된 CI/CD 워크 플로우를 만들 수 있습니다. npm 또는 pip 패키지를 만들고 AWS CLI를 사용하여 패키징 및 배포할 수 있습니다.

CodeBuild의 모든 기능은 AWS 관리 콘솔, API 또는 AWS 명령 줄 인터페이스(CLI)를 통해 실행할 수 있습니다.

AWS CodeBuild 사용해 보기
우선 전체 빌드 작업을 다 해 보기 보다는 우선 AWS CodeBuild  스크린샷을 통애 주요 기능에 대해 먼저 알려드리겠습니다.

아래는 빌드 목록 입니다.

하나의 빌드에 대한 상세 정보를 볼 수 있습니다.

빌드 기록도 볼 수 있습니다.

AWS CodeBuildAWS CodePipeline 빌드 서비스 제공자로 사용 가능합니다.

정식 출시
AWS CodeBuild는 정식 출시 되어 오늘부터 사용할 수 있습니다. 현재 리눅스 빌드 지원이 되며 향후 윈도 지원도 추가할 예정입니다.

Jeff;

이 글은 AWS re:Invent 2016 신규 출시 소식으로 AWS CodeBuild – Fully Managed Build Service의 한국어 번역입니다. re:Invent 출시 소식에 대한 자세한 정보는 12월 온라인 세미나를 참고하시기 바랍니다.

AWS 서버리스 챗봇 경진대회에 참여하세요!


유명 인기 협업 메신저인 Slack과 함께 AWS Serverless Chatbot Competition 행사를 개최합니다.

여러분이 AWS LambdaAmazon API Gateway 서비스를 활용하여, Slack용  챗봇 개발에 관심이 있으시다면 많이 참여해 주시기 바랍니다.  Slack Events API  및 다른 AWS  서비스와 데이터 소스를 활용하여 슬랙 사용자에게 도움이 될만한 창의적이고 독특한 서비스를 제출 하시면 됩니다.

AWS 무료 티어를 활용하시면, AWS Lambda, API Gateway 및 다른 AWS 서비스를 무료로 개발 시 활용하실 수 있습니다. 신규 및 기존 사용자는 AWS Lambda에 대해 월 백만 회 및  400,000 GB-초당 컴퓨팅이 무료입니다. 신규 사용자에 대해서 월 1백만 API 호출이 12개월 동안 무료이기도 하구요.

챗봇 제작 및 알리기
여러분이 만든 챗봇을 다른 사람들이 이해하기 쉽게 좀 더 잘 설명하고, 알릴 수 있도록 아래와 같은 과정을 거치기를 권장 드립니다.

  • 챗봇이 동작하는 데모 동영상 만들기
  • 무엇이 독창적인지 간단한 설명 문서 만들기
  • 챗봇을 동작시키기 위한 코드와 설치 방법을 GitHub에 올리기
  • 챗봇을 테스트할 수 있는 간단한 웹 사이트와 방법 알리기

여러분이 만든 챗봇은 신규 혹은 기존 애플리케이션이라도 무방하나, AWS Lambda와 API Gateway  서비스를 활용해야 하며, 동영상 및 내용은 영문으로 만들어 주셔야 합니다.

수상작 선정 및 시상
개인별, 팀별, 그리고 50인 이하의 소규모 단체 참가자는 Serverless Chatbot Hero Award를 받으실 수 있습니다. 본 수상작에 선정되시면 AWS re:Invent 무료 등록 티켓 및 호텔 할인 비용을 제공 받을 수 있습니다. 또한, Serverless State of the Union에 선정되고, 다양한 선물 및 AWS $100 크레딧을 드립니다. 큰 규모 기업 참가자는 현물 지원 없는 혜택이 지원됩니다.

좀 더 자세한 부분은 FAQ 를 참고하시기 바랍니다.

진행 일정
아래는 주요 일정입니다.:

  • 8월 10일 – 9월 29일 – 제출 기간
  • 10월 3-7일 – AWS 심사 기간
  • 10월 15일 – 수상작 발표

시작 하기
여기에 시작하기 위한 가이드라인이 있습니다

  1. 행사 관련 규칙 및 가이드라인 읽어 보기
  2. AWS Serverless Chatbot Competition 등록하기
  3. AWSSlack 개발자 계정 만들기
  4. 각 API 및 서비스를 활용한 챗봇 개발 문서 살펴 보기
  5. 챗봇 샘플 코드 (aws-serverless-chatbot-sample) 활용하기
  6. 접수를 위한 데모 동영상 및 문서를 만들기
  7. 9월29일 오후 5시(태평양 시간)까지 접수하기

여러분의 독창적이고 재미있는 아이디어를 기다립니다!

관련 온라인 세미나 정보
아래에 여러분에게 도움이 될 만한 온라인 세미나 행사가 있습니다.:

기존의 녹화 영상도 참고하세요.

고성능 애플리케이션 제작을 위한 AWS C++ SDK 커스터마이징

게임과 같은 고성능 애플리케이션 제작의 경우, 가상머신(VM)기반의 언어 사용시 성능상 제약이 있기에 C++와 같은 네이티브 바이너리를 직접 생성하는 언어를 쓰게 됩니다. C++의 경우 가비지 컬렉션(Garbage Collection)기능이 없는 언어이기 때문에 사용자가 직접 메모리 관리를 해주어야 합니다. 빈번히 메모리를 할당(new)하고 해제(delete)하는 일은 실행 시간 비용 측면에서도 상당히 비싼 편에 속합니다.

그래서, 고성능을 요구하는 게임 애플리케이션의 경우, 빈번한 메모리 할당과 파편화(memory fragmentation) 문제를 막기 위해서 메모리 풀링(pooling)을 주로 사용하게 됩니다. 이러한 기능을 제공하는 잘 알려진 tcmalloc이나 jemalloc과 같은 범용 메모리 관리자를 사용하는 경우가 많지만, 게임 엔진이나 서버 프레임워크의 경우에는 자체적으로 메모리 관리자를 제공하는 경우가 많습니다. 이러한 환경에서 AWS C++ SDK를 사용하기 위해서는 별도의 커스터마이징 작업이 필요합니다. 그래서, 지난 글에 이어 이번에는 AWS C++ SDK를 사용자의 상황에 맞게 커스터마이징하는 방법에 대해 다루겠습니다.

AWS C++ SDK는 메모리 관리자뿐만 아니라 HTTP 클라이언트, 작업 실행용 스레드(worker thread), 로그 에이전트(log agent)등 여러 부분에 대해 직접 커스터마이징 할 수 있는 인터페이스를 제공합니다.  이번 글에서는 커스텀 메모리 관리자 구현 방법 및 작업 실행을 위한 커스텀 스레드풀(worker thread pool)을 사용하는 방법에 대해 설명 드리겠습니다.

1. 커스텀 메모리 관리자 사용을 위한 AWS C++ SDK 빌드
커스텀 메모리 관리자를 사용하기 위하여 AWS C++ SDK를 동적 라이브러리 형태(DLL)로 빌드해 보도록 하겠습니다.  시작하기 전에 AWS C++ SDK의 코드를 최신 상태로 업데이트 하시기 바랍니다. 이후 AWS C++ SDK의 루트 폴더로 이동한 후, 빌드의 결과물이 생성될 폴더를 하나 만들고 cmake 명령을 통하여 Visual Studio용 솔루션 환경을 생성합니다. 동적 라이브러리 형태로 빌드하기 위해 이번에는 STATIC_LINKING 옵션을 주지 않습니다. 대신, 커스텀 메모리 관리자 사용을 알려주기 위하여CUSTOM_MEMORY_MANAGEMENT옵션을 주었습니다.

PS>  md sdk-dynamic-64
PS>  cd sdk-dynamic-64
PS> cmake .. -G "Visual Studio 14 2015 Win64" -DCUSTOM_MEMORY_MANAGEMENT=1 

위의 명령이 완료되면 sdk-dynamic-64 폴더 내에 AWS C++ SDK 빌드를 위한 Visual Studio 솔루션 파일이 생성되어 있을 것입니다. 솔루션 파일을 열고 빌드를 하기 전에, 커스텀 메모리 매니저를 사용하기 위해서 전처리 선언을 하나 추가해주어야 합니다. AWSMemory.cpp 파일에 대해 Property Pages를 열고 전처리 선언 부분에서USE_AWS_MEMORY_MANAGEMENT를 추가한 후에 빌드를 하시기 바랍니다. 빌드가 완료되면 해당 폴더 하위에 동적 라이브러리의 형태로 AWS C++ SDK가 생성이 됩니다. 생성된 DLL 파일들(예: aws-cpp-sdk-core.dll 등)은 추후에 애플리케이션 실행 시 필요하기에 따로 복사해 두시기 바랍니다.

<< AWSMemory.cpp에서 USE_AWS_MEMORY_MANAGEMENT 선언 추가 >>

2.커스텀 메모리 관리자를 사용하는 애플리케이션 작성
앞 단계에서 빌드한 AWS C++ SDK 동적 라이브러리를 사용하는 애플리케이션(ddb-sample: DynamoDB에 테이블을 생성하고 아이템을 대량으로 추가하고 읽어오는 프로그램)을 작성해보도록 하겠습니다.  프로그램 본체에 해당하는 main.cpp를 작성하면 다음과 같습니다. (동작 과정에 대한 자세한 내용은 주석을 참고)

#include <aws/core/Aws.h>
#include <aws/core/client/AsyncCallerContext.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/client/CoreErrors.h>
#include <aws/core/http/HttpTypes.h>
#include <aws/core/utils/Outcome.h>
#include <aws/core/utils/ratelimiter/DefaultRateLimiter.h>
#include <aws/dynamodb/DynamoDBClient.h>
#include <aws/dynamodb/DynamoDBErrors.h>
#include <aws/dynamodb/model/CreateTableRequest.h>
#include <aws/dynamodb/model/DeleteTableRequest.h>
#include <aws/dynamodb/model/DescribeTableRequest.h>
#include <aws/dynamodb/model/ListTablesRequest.h>
#include <aws/dynamodb/model/UpdateTableRequest.h>
#include <aws/dynamodb/model/PutItemRequest.h>
#include <aws/dynamodb/model/GetItemRequest.h>
#include <aws/dynamodb/model/ScanRequest.h>
#include <aws/dynamodb/model/UpdateItemRequest.h>
#include <aws/dynamodb/model/DeleteItemRequest.h>
#include <aws/core/utils/threading/Executor.h>

// 커스텀 메모리 관리자
#include "MyCustomMemoryManager.h"

using namespace Aws;
using namespace Aws::Auth;
using namespace Aws::Http;
using namespace Aws::Client;
using namespace Aws::DynamoDB;
using namespace Aws::DynamoDB::Model;


// 생성할 테이블 이름 및 파티션 키 설정
static const char* HASH_KEY_NAME = "HashKey1";
static const char* SIMPLE_TABLE = "TestSimpleTable1";
static const char* ALLOCATION_TAG = "DynamoDbTest";

class DynamoDbTest
{
public:

	// 테스트용 클라이언트 생성
	void SetUpTest()
	{
		auto limiter = Aws::MakeShared<Aws::Utils::RateLimits::DefaultRateLimiter<>>(ALLOCATION_TAG, 200000);
	
		ClientConfiguration config;
		config.scheme = Scheme::HTTPS;
		config.connectTimeoutMs = 30000;
		config.requestTimeoutMs = 30000;
		config.readRateLimiter = limiter;
		config.writeRateLimiter = limiter;
		config.region = Region::AP_NORTHEAST_2;

		m_client = Aws::MakeShared<DynamoDBClient>(ALLOCATION_TAG, config);
	}
	
	// 테이블 생성 테스트
	void CreateTableTest()
	{
		CreateTableRequest createTableRequest;
		AttributeDefinition hashKey;
		hashKey.SetAttributeName(HASH_KEY_NAME);
		hashKey.SetAttributeType(ScalarAttributeType::S);
		createTableRequest.AddAttributeDefinitions(hashKey);
		KeySchemaElement hashKeySchemaElement;
		hashKeySchemaElement.WithAttributeName(HASH_KEY_NAME).WithKeyType(KeyType::HASH);
		createTableRequest.AddKeySchema(hashKeySchemaElement);
		ProvisionedThroughput provisionedThroughput;
		provisionedThroughput.SetReadCapacityUnits(10);
		provisionedThroughput.SetWriteCapacityUnits(10);
		createTableRequest.WithProvisionedThroughput(provisionedThroughput);
		createTableRequest.WithTableName(SIMPLE_TABLE);

		CreateTableOutcome createTableOutcome = m_client->CreateTable(createTableRequest);
		if (createTableOutcome.IsSuccess())
		{
			printf("[OK] CreateTable: %s\n", createTableOutcome.GetResult().GetTableDescription().GetTableName().c_str());
		}
		else
		{
			assert(createTableOutcome.GetError().GetErrorType() == DynamoDBErrors::RESOURCE_IN_USE);
		}

		// 테이블이 생성될 때까지 기다림
		DescribeTableRequest describeTableRequest;
		describeTableRequest.SetTableName(SIMPLE_TABLE);

		DescribeTableOutcome outcome = m_client->DescribeTable(describeTableRequest);

		while (true)
		{
			assert(outcome.IsSuccess());
			if (outcome.GetResult().GetTable().GetTableStatus() == TableStatus::ACTIVE)
			{
				break;
			}
			else
			{
				std::this_thread::sleep_for(std::chrono::seconds(1));
			}

			outcome = m_client->DescribeTable(describeTableRequest);
		}
	}

	// 테이블 삭제 테스트
	void DeleteTableTest()
	{
		DeleteTableRequest deleteTableRequest;
		deleteTableRequest.SetTableName(SIMPLE_TABLE);

		DeleteTableOutcome deleteTableOutcome = m_client->DeleteTable(deleteTableRequest);

		if (!deleteTableOutcome.IsSuccess())
		{
			assert(DynamoDBErrors::RESOURCE_NOT_FOUND == deleteTableOutcome.GetError().GetErrorType());
		}
		else
		{
			printf("[OK] DeleteTable: %s\n", deleteTableOutcome.GetResult().GetTableDescription().GetTableName().c_str());
		}
	}

	// 테이블에 아이템을 집어넣고 읽기 테스트 (비동기 방식으로)
	void PutAndGetItemAsyncTest()
	{
		auto putItemHandler = std::bind(&DynamoDbTest::PutItemOutcomeReceived, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
		auto getItemHandler = std::bind(&DynamoDbTest::GetItemOutcomeReceived, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);

		/// 50개의 아이템을 비동기로 생성 요청
		Aws::String testValueColumnName = "TestValue";
		Aws::StringStream ss;

		for (int i = 0; i < 50; ++i)
		{
			ss << HASH_KEY_NAME << i;
			PutItemRequest putItemRequest;
			putItemRequest.SetTableName(SIMPLE_TABLE);
			AttributeValue hashKeyAttribute;
			hashKeyAttribute.SetS(ss.str());
			ss.str("");
			putItemRequest.AddItem(HASH_KEY_NAME, hashKeyAttribute);
			AttributeValue testValueAttribute;
			ss << testValueColumnName << i; 
                        testValueAttribute.SetS(ss.str()); 
                        putItemRequest.AddItem(testValueColumnName, testValueAttribute); 
                        ss.str(""); 
                        m_client->PutItemAsync(putItemRequest, putItemHandler);
		}

		// 모든 작업이 완료될 때까지 기다림
		std::unique_lock putItemResultLock(putItemResultMutex);
		putItemResultSemaphore.wait(putItemResultLock);

		// 기록된 아이템들을 다시 읽어와보기
		for (int i = 0; i < 50; ++i)
		{
			GetItemRequest getItemRequest;
			ss << HASH_KEY_NAME << i;
			AttributeValue hashKey;
			hashKey.SetS(ss.str());
			getItemRequest.AddKey(HASH_KEY_NAME, hashKey);
			getItemRequest.SetTableName(SIMPLE_TABLE);

			Aws::Vector attributesToGet;
			attributesToGet.push_back(HASH_KEY_NAME);
			attributesToGet.push_back(testValueColumnName);
			ss.str("");
			m_client->GetItemAsync(getItemRequest, getItemHandler);
		}

		std::unique_lock getItemResultLock(getItemResultMutex);
		getItemResultSemaphore.wait(getItemResultLock);

		for (int i = 0; i < 50; ++i)
		{
			GetItemOutcome outcome = getItemResultsFromCallbackTest[i];
			assert(outcome.IsSuccess());

			GetItemResult result = outcome.GetResult();
			auto returnedItemCollection = result.GetItem();

			printf("%s\n", returnedItemCollection[testValueColumnName].GetS().c_str());
		}

	}


public:
	// 아이템 집어넣기에 관한 핸들러
	void PutItemOutcomeReceived(const DynamoDBClient* sender, const PutItemRequest& request, const PutItemOutcome& outcome, const std::shared_ptr<const AsyncCallerContext>& context)
	{
		std::lock_guard locker(putItemResultMutex);
		putItemResultsFromCallbackTest.push_back(outcome);

		if (putItemResultsFromCallbackTest.size() == 50)
		{
			putItemResultSemaphore.notify_all();
		}
	}

	// 아이템 읽어오기에 관한 핸들러
	void GetItemOutcomeReceived(const DynamoDBClient* sender, const GetItemRequest& request, const GetItemOutcome& outcome, const std::shared_ptr<const AsyncCallerContext>& context)
	{
		std::lock_guard locker(getItemResultMutex);
		getItemResultsFromCallbackTest.push_back(outcome);

		if (getItemResultsFromCallbackTest.size() == 50)
		{
			getItemResultSemaphore.notify_all();
		}
	}


private:

	std::shared_ptr<DynamoDBClient> m_client;

	std::mutex putItemResultMutex;
	std::condition_variable putItemResultSemaphore;

	std::mutex getItemResultMutex;
	std::condition_variable getItemResultSemaphore;

	Aws::Vector<PutItemOutcome> putItemResultsFromCallbackTest;
	Aws::Vector<GetItemOutcome> getItemResultsFromCallbackTest;
};


int main()
{
	// 커스텀 메모리 관리자 선언
	MyCustomMemorySystem memorySystem;
	
	// SDK를 사용하기 위한 초기화
	Aws::SDKOptions options;
	options.memoryManagementOptions.memoryManager = &memorySystem;
	options.loggingOptions.logLevel = Aws::Utils::Logging::LogLevel::Info;
	Aws::InitAPI(options);


	// DynamoDB Test Sample
	{
		DynamoDbTest test;
		test.SetUpTest();
		
		// 테이블 생성 테스트 
		test.CreateTableTest();

		// 아이템 put/get 테스트
		test.PutAndGetItemAsyncTest();

		// 테이블 삭제 테스트
		test.DeleteTableTest();
	}


	// SDK에서 사용하는 내부 자원 해제
	Aws::ShutdownAPI(options);
    return 0;  
}

main함수의 첫 부분에서 커스텀 메모리 관리자를 사용하고 있음을 확인할 수 있습니다. 커스텀 메모리 관리자의 구현을 위해서는 AWS C++ SDK의Aws::Utils::Memory::MemorySystemInterface를 상속받아 구현하여야 합니다. 위의 코드에서 사용된 MyCustomMemoryInterface는 다음과 같은 방식으로 구현할 수 있습니다.

// MyCustomMemoryManager.h

#include <aws/core/utils/memory/MemorySystemInterface.h>
#include <aws/core/utils/memory/AWSMemory.h>

class MyCustomMemorySystem : public Aws::Utils::Memory::MemorySystemInterface
{
public:
	MyCustomMemorySystem() {}
	virtual ~MyCustomMemorySystem() {}

	// 커스텀 메모리 매니저 시작과 끝에서 불리는 함수. 필요시 구현할 것
	virtual void Begin() override {}
	virtual void End() override {}

	// 할당(new)시 불리는 AllocateMemory 인터페이스 구현
	virtual void* AllocateMemory(std::size_t blockSize, std::size_t alignment, const char *allocationTag = nullptr) override
	{
		// 여기에 메모리 할당 로직 직접 구현
		// 예: tcmalloc을 사용한다면, tc_malloc(blocksize);
		// 예: UnrealEngine에서 제공하는 할당자를 사용한다면, FMemory::Malloc()

		return _aligned_malloc(blockSize, alignment);
	}

	// 해제(delete)시 불리는 FreeMemory 인터페이스 구현
	virtual void FreeMemory(void* memoryPtr) override
	{
		// 여기에 메모리 해제 로직 직접 구현
		// 예: tcmalloc을 사용한다면, tc_free(memoryPtr)
		// 예: UnrealEngine의 경우는, FMalloc::Free()

		_aligned_free(memoryPtr);
	}

};

이런 방식으로 AWS C++ SDK에서 제공하는 메모리 시스템 인터페이스를 구현(override)하여 사용하면, 시스템 전역적인 기본 메모리 할당자 대신, 여러분이 직접 지정한 커스텀 메모리 관리자를 사용할 수 있습니다.  위의 샘플 코드에서는 직접 AllocateMemory 및 FreeMemory 멤버 함수를 구현한 내용을 담고는 있지는 않습니다만, Windows환경에서 제공하는 API를 이용한 고성능 커스텀 메모리 관리자의 구현 예제는 AWSTestSample의 LockFreeMemorySystem.h/.cpp 파일을 참고하시기 바랍니다.

그런데, 커스텀 메모리 관리자를 사용할 경우 주의할 점이 있습니다. AWS C++ SDK라이브러리로 (API 호출시) 전달되는 STL 객체의 경우, 표준 STL 컨테이너(std::vector 등)를 그대로 사용하면 안된다는 것입니다. 표준 STL 컨테이너는 기본적으로 시스템 전역 할당자(malloc/free)를 사용하기 때문입니다. 그래서, 커스텀 메모리 관리자를 사용하도록 (표준 STL 타입들을 wrapping한) 수정된STL 타입을 제공하고 있습니다. Aws::Vector, Aws::Map, Aws::String 등이 그 예입니다.  자세한 사용 예는 위의 샘플 코드(main.cpp)에서 확인하실 수 있습니다.

3. 애플리케이션을 위한 Visual Studio 솔루션 생성 및 실행
이전 단계에서 작성한 ddb-sample 애플리케이션용 Visual Studio 솔루션을 생성하기 위한 CMakeLists.txt를 작성하면 다음과 같습니다. 지난번 글과는 다르게AWS C++ SDK를 동적 라이브러리 형태로 사용하기 위해서 USE_IMPORT_EXPORT 선언을 추가하였습니다.

cmake_minimum_required(VERSION 2.8)
project(ddb-sample)
find_package(aws-sdk-cpp)
add_definitions(-DUSE_IMPORT_EXPORT)
add_executable(ddb-sample main.cpp MyCustomMemoryManager.h)
target_link_libraries(ddb-sample aws-cpp-sdk-dynamodb)

CMakeLists.txt 작성이 완료되었다면, 아래의 명령을 통하여 ddb-sample 애플리케이션용 Visual Studio 솔루션을 생성합니다.

PS > md ddb-sample
PS > cd ddb-sample
PS >  cmake –Daws-sdk-cpp_DIR=..\sdk-dynamic-64 -G "Visual Studio 14 2015 Win64" 

Ddb-sample 폴더 내에 생성되어 있는 솔루션(.sln)파일을 열어서 빌드를 하고 실행해보시기 바랍니다. (이전AWS C++ SDK 빌드 단계에서 생성된DLL파일이 필요합니다.) 테이블이 생성되고 50개의 아이템이 생성되는 것을 직접 확인하실 수 있습니다. 이 과정에서 커스텀 메모리 매니저의 사용 여부를 알고 싶다면, MyCustomMemorySystem클래스의 AllocateMemory/FreeMemory 멤버함수에 중단점(breakpoint)을 걸어보시기 바랍니다.

4. 커스텀 스레드 풀을 사용하여 애플리케이션 최적화하기
위의 ddb-sample 애플리케이션에서는 DynamoDB에 아이템 생성(put)을 요청할 때, 비동기 방식으로 하게 됩니다.  즉, AWS C++ SDK의 요청 API중 “Async”라는 접미어 (예: DynamoDBClient::GetItemAsync)가 붙은 API를 통해 요청하는 경우는 그 결과가 모두 오기 전까지 기다리지 않습니다. 결과는 콜백 함수(callback handler)를 통해서 받아야 합니다.

이러한 비동기 방식의 요청에 대해서는 내부적으로 Executor(ClientConfiguration::executor를 통해 지정 가능)라는 작업 실행기를 통해서 요청을 수행하게 되고 수행이 완료되면 콜백 함수를 불러(invoke)주게 됩니다. 그런데, 명시적으로 Executor를 따로 지정해주지 않게 되면, 내부적으로 기본 실행기(DefaultExecutor)를 사용하게 됩니다. DefaultExecutor의 구현은 아래와 같은 형태로 되어 있습니다.

bool DefaultExecutor::SubmitToThread(std::function<void()>&&  fx)
{
    std::thread t(fx);
    t.detach();
    return true;
}

보시다시피, 요청마다 일일이 스레드 생성을 통하여 함수를 실행하도록 구현되어 있습니다. 위의 ddb-sample 애플리케이션의 경우에는 DynamoDB에 50개의 아이템 생성을 비동기로 요청하게 되어 있는데, 이 경우에는 50개의 스레드를 생성해서 처리하게 됩니다.  빈번한 메모리 할당 요청과 마찬가지로 빈번한 스레드 생성 요청의 경우도 운영체제 입장에서는 꽤 비싼 것이 사실이고 성능에 감소에 영향을 주게 됩니다.

그래서, AWS C++ SDK는 이러한 Executor를 직접 구현해서 교체(override)할 수 있도록 인터페이스를 제공할 뿐만 아니라 기본적으로 스레드 풀링(thread pooling)을 사용하는 PooledThreadExecutor도 따로 제공해 드립니다. 아래 코드는 ddb-sample 애플리케이션에서 기본 실행기(DefaultExecutor)대신 PooledThreadExecutor를 사용하는 방법을 보여줍니다. SetUpTest멤버 함수의 ClientConfiguration::executor에 새로운 Executor를 지정하기만 하면 됩니다.

// ddb-sample 테스트를 위한 클라이언트 설정 부분
DynamoDbTest::SetUpTest()
{
	ClientConfiguration config;
              // … … …
              // 10개의 스레드를 사용하는 스레드풀 executor 생성후 지정하는 예
	config.executor = Aws::MakeShared<Aws::Utils::Threading::PooledThreadExecutor>(ALLOCATION_TAG, 10);

	m_client = Aws::MakeShared<DynamoDBClient>(ALLOCATION_TAG, config);
}

물론, 사용자의 환경에 따라 직접 구현한 것을 사용하거나 사용중인 프레임워크, 라이브러리 등에서 제공하는 스레드풀을 사용하는 방법도 가능합니다. Windows 환경에서 성능상의 이점을 위하여Executor를 직접 구현하여 사용하는 예는 이곳의 LockFreeExecutor.h/.cpp 파일을 참고하시기 바랍니다.

성능이 크게 문제가 안되거나 가상머신(VM)위에서 동작하는 일반적인 애플리케이션의 경우, 필요한 SDK나 라이브러리를 패키지 관리자로부터 바로 얻어서 기본 설정 그대로 사용할 수 있는 경우가 많습니다. 그러나, C++을 사용하여 애플리케이션을 작성하는 이유의 상당수가 성능 문제인 경우가 많기에 기본 설정 그대로 사용하기 부적합한 경우가 많습니다.  그래서, 이번에 다룬 내용을 토대로 필요한 경우 얼마든지AWS C++ SDK를 사용자의 환경에 맞게 직접 커스터마이징하여 사용하시기 바랍니다.

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

Chalice, Python 기반 서버리스 마이크로프레임웍 공개

서버리스 컴퓨팅(Serverless computing)은 AWS 고객 사이에 가장 인기있는 주제입니다. AWS가 제공하는 AWS LambdaAmazon API Gateway를 통해 개발자들이 확장성에 대한 걱정 없이 손쉽게 API 애플리케이션을 만들어 낼 수 있습니다. AWS 개발자 도구팀에서 개발한 Python 기반의 Serverless Microframework을 소개하고자합니다.

아래 3분 정도의 동영상을 보면 어떻게 chalice 커맨드 라인 모드를 통해 손쉽게 API 서비스를 만들 수 있는 지 볼 수 있습니다. 45초 정도에서 Hello World 프로젝트를 만들고 app.py를 수정한 후, curl을 통해 HTTP GET 요청을 체크할 수 있습니다.

그 이후에는 새로운 기능을 추가해서 새롭게 배포하는 방법을 알려드리게 됩니다. 아마 이러한 개발 방법에 익숙하시다면, 아마 여러분이 Flask를 써보셨을 거라고 생각합니다. Flask는 커뮤니티에서 매우 인기있는 Python 기반 마이크로프레임웍 중에 하나이고, 이러한 개발 스타일을 차용함으로서 Python 개발자들이 좀 더 쉽게 서버리스 컴퓨팅에 친숙하게 해드릴 수 있을 것 입니다.

동영상의 마지막 파트에는 Amazon CloudWatch 로그를 통해 AWS Lambda의 빌트인 로깅 기능을 만드는 것입니다. chalice logschalice deploy 명령어를 함께 써서, 테스트, 수정, 배포 등을 계속 하실 수 있습니다.

Python Serverless Microframework for AWS는 PyPI (pip install chalice) 및 GitHub (https://github.com/awslabs/chalice) 통해 사용해 볼 수 있으며, 아직 미리 보기로 제공하기 때문에 정식 서비스 보다는 테스트로 활용해 보시길 권해 드립니다.

또한, 다양한 제안 및 기능에 대한 답글을 남겨 주시면 감사하겠습니다.

– Peter Moon

이 글은 AWS Developer 블로그의 Preview the Python Serverless Microframework for AWS의 한국어 번역입니다.

윈도 Visual Studio 환경에서 AWS C++ SDK 활용하기

게임제작에 있어서 클라이언트 개발은 물론 서버 개발의 경우도 윈도 환경 하에서 C++을 사용하여 게임을 만드는 경우가 많을 것입니다. 온라인 게임뿐만 아니라 모바일 게임의 경우도 Cocos2d-x엔진을 쓰거나 Unreal Engine을 사용한다면 이와 같은 환경에서 개발하는 경우가 대부분일 것입니다.

AWS는 지난해 9월 AWS C++ SDK를 공개하였고, 이를 게임 엔진이나 게임서버에서 사용하게 되면 AWS의 다양한 서비스들을 게임에서 직접 활용하고 제어할 수 있습니다.

AWS C++ SDK의 경우, 타 언어 AWS SDK와는 다르게 설치 프로그램(installer)나 패키지 관리자(Nuget 등)를 통해서 설치하는 방법을 제공하지 않기 때문에 직접 소스 코드로부터 빌드하여 사용하여야 합니다. 게임 개발자들이 많이 쓰는 환경인 Windows 및 Visual Studio에서 AWS C++ SDK를 바로 빌드하여 사용하기에는 주의해야 할 점들이 존재합니다. 이 글에서는여러분이 AWS C++SDK을 Windows 환경의 Visual Studio 사용 단계 및 알아두시면 좋은 점 위주로 설명 드리고자 합니다.

1. 사전 준비 작업
AWS C++ SDK를 Windows 환경에서 빌드하기 위해서는 Visual Studio뿐만 아니라 플랫폼 독립적인 빌드 환경 생성 도구인 CMAKE가 필요합니다. 또한, AWS C++ SDK를 받기 위해서는 GIT 클라이언트도 미리 준비해두시기 바랍니다. 마지막으로, AWS상의 자원(S3 등)를 제어하기 위해서는 그에 맞는 권한이 있어야 합니다. 해당 권한을 갖는 IAM 사용자를 만드신 후, Access Key 및 Secret Key를 미리 설정해놓으시기 바랍니다. AWS C++ SDK가 자동으로 해당 Access Key를 검색하는 과정은 다음과 같습니다.

  1. 환경 변수 검색
    1. AWS_ACCESS_KEY_ID = < Access Key 값 >
    2. AWS_SECRET_ACCESS_KEY = < Secret Key 값 >
    3. AWS_DEFAULT_REGION= < 기본적으로 사용할 AWS리전, (예) ap-northeast-2 >
  2. 사용자 HOME디렉토리 내의 .aws 폴더 아래의 credentials 파일 검색
    1. 이 파일은 AWS CLI의 “aws configure”명령을 통해 생성이 가능합니다.
  3. EC2 인스턴스 위에서 동작하는 경우 기본적으로 EC2MetadataInstanceProfile을 검색
    1. 해당 권한을 갖고 있는 IAM Role이 있는지 찾음

본 글의 예시에서는 Visual Studio 2015 버전 및 CMAKE 3.x 버전 사용을 가정하고 예를 들겠습니다.  사전 준비를 마쳤다면, Github에서 AWS C++ SDK를 다음 명령을 통해 내려 받습니다.

PS > git clone https://github.com/aws/aws-sdk-cpp <sdk-root-folder>

명령 수행이 완료되면, 지정한 <sdk-root-folder>내에 AWS C++ SDK 소스 코드가 다운됩니다.

2. AWS C++ SDK를 정적 라이브러리 형태로 빌드하기
이제 본격적으로 AWS C++ SDK를 빌드해 보도록 하겠습니다. 우선 빌드 결과물(라이브러리 파일 등)이 생성될 폴더를 하나 만듭니다. 본 예제에서는 <sdk-root-folder>하위에 sdk-build-64 폴더를 만들고 이곳에서 빌드를 해보도록 하겠습니다. 아래 cmake명령은 <sdk-root-folder>에 있는 AWS C++ SDK의 CMakeLists.txt 파일을 참조하여Visual Studio 2015 버전 형태의 솔루션(.sln)파일 생성하여 줍니다. 정적 라이브러리 형태로 빌드하기 위해STATIC_LINKING 옵션을 주었습니다.

PS > md sdk-build-64
PS > cd sdk-build-64
PS > cmake .. -G "Visual Studio 14 2015 Win64" -DSTATIC_LINKING=1

참고로, -G옵션은 Visual Studio 솔루션 형태의 프로젝트 생성뿐만 아니라 다양한 형태의 프로젝트 파일을 생성(generation)할 수 있도록 해줍니다. 구체적으로 지원하는 형태는 cmake –G를 실행해보시면 확인하실 수 있습니다. STATIC_LINKING 옵션을 주지 않으면 기본적으로 동적 라이브러리(DLL)형태로 빌드가 되도록 구성 됩니다. (AWS C++ SDK를 동적 라이브러리 형태로 사용할 경우는 몇 가지 주의할 사항이 있습니다. 이 부분에 대해서는 아래에 따로 설명하겠습니다.)

위의 명령이 완료되면 sdk-build-64 폴더 내에 AWS C++ SDK 빌드를 위한 솔루션 파일이(aws-sdk-cpp-all.sln) 생성되어 있을 겁니다. 이 파일을 Visual Studio에서 열고 빌드를 하시면 됩니다.  빌드가 완료되면 sdk-build-64의 하위 디렉토리에 AWS C++ SDK의 라이브러리(.lib)파일들이 생성됩니다.

만일, 소스 코드 파일의 인코딩 타입 문제로 빌드가 되지 않는다면, 해당 코드 파일을 열어서 UTF-8 형태로 다시 저장하시기 바랍니다. Visual Studio에서 에러가 발생한 파일을 열고 File 메뉴에서Advanced Save Options항목을 선택한 다음에 “Unicode (UTF-8 with signature)”항목을 선택하고 저장하시면 됩니다. UTF-8형태로 바꿔야 하는 파일이 많다면 아래의 Powershell 스크립트를 활용하면 소스코드를 일괄적으로 UTF-8형태로 바꾸어 저장할 수 있습니다.

Function  SaveAsUtf8([string] $path)
{
  [String[]] $files = Get-ChildItem $path -Recurse -Include *.h, *.cpp;
  foreach ($file  in $files)
    {
      "Saving As $file...";
       [String]$s = [IO.File]::ReadAllText($file);
       [IO.File]::WriteAllText($file, $s, [Text.Encoding]::UTF8);
     }
}

Windows에 기본적으로 포함된 Powershell을 열고 <sdk-root-folder>로 이동한 후 에서 위의 파일(save_as_utf8.ps1)에 정의된 함수를 다음과 같은 방법으로 실행하게 되면 <sdk-root-folder>하위의 모든 소스 코드를 UTF-8의 형태로 재 저장하게 됩니다.

PS > . .\save_as_utf8.ps1 
PS > SaveAsUtf8 .

3. 샘플 프로그램을 통해 AWS C++ SDK 사용해보기
앞서 빌드한 AWS C++ SDK를 직접 사용하는 간단한 C++ 프로그램(S3에 특정 문자열이 포함된 파일을 업로드)을 제작해보도록 하겠습니다.  우선 편의를 위하여 <sdk-root-folder>하위에 app-test라는 폴더를 만들고 이곳에 해당 프로그램을 위한 프로젝트 파일들을 cmake를 통하여 생성해보도록 합니다. 우선, 프로그램 본체에 해당하는 main.cpp를 작성하고, cmake를 통하여 Visual Studio 솔루션 파일 생성을 위한 CMakeLists.txt를 작성하면 다음과 같습니다.

#include <aws/core/Aws.h>
#include <aws/s3/S3Client.h>
#include <aws/s3/model/PutObjectRequest.h>
#include <aws/s3/model/GetObjectRequest.h>
#include <aws/core/utils/memory/stl/AwsStringStream.h> 

using namespace Aws::S3;
using namespace Aws::S3::Model;

static const char* KEY = "s3_my_sample_key3";
static const char* BUCKET = "s3-demo-korea";

int main()
{
    // SDK를 사용을 위한 내부 자원 초기화 및 옵션 설정 (지금은 default)
    Aws::SDKOptions options;
    Aws::InitAPI(options);

    S3Client client;
    
    // s3에 put 요청 생성 
    PutObjectRequest putObjectRequest;
    putObjectRequest.WithKey(KEY).WithBucket(BUCKET);

    // 파일에 기록할 스트림 생성
    auto requestStream = Aws::MakeShared("s3-sample");
    *requestStream << "Hello World!";
    
    // 스트림을 put요청에 연결
    putObjectRequest.SetBody(requestStream);

    auto putObjectOutcome = client.PutObject(putObjectRequest);

    if (putObjectOutcome.IsSuccess())
    {
        std::cout << "Put object succeeded" << std::endl;
    }
    else
    {
        std::cout << "Error while putting Object " <<
               putObjectOutcome.GetError().GetExceptionName() << 
               " " << putObjectOutcome.GetError().GetMessage() << std::endl;
    }

    // S3에 기록된 파일 내용을 다시 GET해보는 요청 생성 
    GetObjectRequest getObjectRequest;
    getObjectRequest.WithBucket(BUCKET).WithKey(KEY);

    auto getObjectOutcome = client.GetObject(getObjectRequest);

    if(getObjectOutcome.IsSuccess())
    {
        std::cout << "Successfully retrieved object from s3 with value: " << std::endl;
        std::cout << getObjectOutcome.GetResult().GetBody().rdbuf() << std::endl 
        << std::endl;
    }
    else
    {
        std::cout << "Error while getting object " <<
             getObjectOutcome.GetError().GetExceptionName() <<
             " " << getObjectOutcome.GetError().GetMessage() << std::endl;
    }

    // SDK에서 사용된 내부 자원 해제
    Aws::ShutdownAPI(options);
    return 0;  
}

AWS C++ SDK를 사용하는 코드 작성시, main함수의 첫 부분에서 반드시”Aws::InitAPI(options);”를 호출하여SDK 초기화를 해주어야 합니다. 이 과정에서 SDK사용에 필요한 각종 옵션들(로깅 여부, 커스텀 메모리 관리자 설정, HTTP 클라이언트 설정 등)을 직접 지정할 수 있습니다. 사용할 수 있는 옵션에 관한 자세한 내용은 AWS C++ SDK 블로그를 참조하시기 바랍니다.

AWS C++ SDK를 사용하는 애플리케이션 코드를 작성하였다면, 이를 포함하는 Visual Studio 솔루션 파일을 생성하는 cmake용 프로젝트 파일(CMakeLIsts.txt)을 아래와 같이 생성하여야 합니다. 이 파일에서 라이브러리 의존성 관계를 설정할 수 있습니다.

cmake_minimum_required(VERSION 2.8)
# 생성될 프로젝트 이름 설정
project(s3-sample)

# 이 프로젝트에서 사용할 AWS C++ SDK 찾아서 의존성 설정
find_package(aws-sdk-cpp)

# 이 프로젝트에 실행파일로 생성될 대상 코드 지정
add_executable(s3-sample main.cpp)

#링크가 필요한 AWS C++ SDK 라이브러리 지정 (이 예에서는 S3관련 기능만 사용함)
target_link_libraries(s3-sample aws-cpp-sdk-s3)

CMakeList.txt를 작성하였다면 아래의 명령을 통하여 샘플 프로그램에 해당하는 Visual Studio용 솔루션 파일을 생성할 수 있습니다.

PS > md app-test
PS > cd app-test
PS > cmake -Daws-sdk-cpp_DIR=..\sdk-build-64 .  –G “Visual Studio 14 2015 Win64”

app-test 폴더 내에s3-sample.sln이 생성되어 있음을 확인하실 수 있습니다. Visual Studio로 s3-sample 프로젝트를 열어서 빌드를 하고 실행을 해보시기 바랍니다. 위의 main.cpp에서 작성한 코드가 제대로 실행되었는지 확인하기 위해AWS 콘솔에 접속하여 위의 코드에서 지정한 S3버킷 내에 파일이 생성되었는지 직접 확인해 보시기 바랍니다.

4. AWS C++ SDK 사용시 주의할 점
지금까지 AWS C++ SDK를 정적 라이브러리(static library) 형태로 빌드 하고 이를 사용하는 방법에 대해서 알아보았습니다. cmake를 통하여 AWS C++ SDK를 구성하는 과정에서 STATIC_LINKING 옵션을 주지 않으면 기본적으로 동적 라이브러리 형태로 AWS C++ SDK가 빌드가 되고, 추가적으로 DLL파일이 생성됩니다.

이 파일을 애플리케이션의 실행 파일과 함께 두거나 Windows시스템이 기본적으로 DLL파일을 찾는 폴더(Windows\System32 등)에 두어야 해당 애플리케이션이 실행이 됩니다.  또한, AWS C++ SDK를 사용하는 프로젝트의 속성 페이지에서 “USE_IMPORT_EXPORT” 전처리 선언을 다음과 같이 추가 해주어야 합니다.

또한, 동적 라이브러리의 형태로 AWS C++ SDK를 빌드하는 경우 자동으로 커스텀 메모리 관리자를 사용하도록 설정이 됩니다.  그 이유는 메모리 경계(boundary) 문제가 있기 때문입니다. 즉, AWS C++ SDK DLL내에서 할당한(new)메모리의 경우는 반드시 DLL내에서 해제(delete)되어야 하고, 애플리케이션(.EXE) 내에서 할당한 경우는 반드시 해당 애플리케이션 내에서 해제되어야 하기 때문입니다. 그런데, C++의 경우 STL컨테이너를 많이 활용하게 됩니다.

STL컨테이너 특성상 내부에서 자동으로 메모리가 할당되고 해제되는 경우가 많기 때문에, 애플리케이션과 라이브러리간 STL객체를 주고 받는다면, STL내부에서 일어나는 메모리 할당/해제를 명백히 제어하기 어렵습니다. 즉, 애플리케이션 내에서 자동 할당된 메모리가 DLL내부에서 해제되거나, 그 반대의 경우가 있을 수 있습니다. 그래서, 커스텀 메모리 관리자를 통하여 DLL 및 애플리케이션의 메모리 할당/해제가 한 곳에서 일어나게끔 일원화 할 수 있도록 한 것입니다.

커스텀 메모리 관리자는 다음과 같은 형식으로 “Aws::InitAPI()”시에 지정할 수 있습니다만, 동적 라이브러리 형태로 사용하는 경우 따로 커스텀 메모리 관리자를 명시적으로 구현하여 지정하지 않더라도 AWS C++ SDK에서 제공하는 기본(default) 커스텀 메모리 관리자가 자동으로 설정이 됩니다. 기본 커스텀 메모리 관리자는 메모리 할당/해제 시에 C++ 런타임 시스템의 기본 할당자(default new/delete)를 사용하게 되지만 위에서 설명한 DLL 경계 문제를 해결해 준다는 장점이 있습니다.

// 커스텀 메모리 관리자를 직접 구현하여 사용하는 경우,
// MemorySystemInterface를 상속받아 AllocateMemory및 FreeMemory 구현

class MyMemoryManager : public Aws::Utils::Memory::MemorySystemInterface
{
  public:
    // ...
    virtual void* AllocateMemory(std::size_t blockSize, std::size_t alignment,
                                 const char *allocationTag = nullptr) override;
    virtual void FreeMemory(void* memoryPtr) override;
};

// main함수의 첫 부분에서 다음과 같은 방식으로 사용
MyMemoryManager sdkMemoryManager;
Aws::SDKOptions options;
options.memoryManagementOptions.memoryManager = &sdkMemoryManager;
Aws::InitAPI(options);

사용자가 자체적으로 커스텀 메모리 관리자를 어떻게 구현하여 사용할 수 있는지에 관한 내용은 다음에 구체적으로 다루도록 하겠습니다.

추가적으로, 동적 라이브러리 형태로 사용하는 경우에 있어서, AWS C++ SDK (.DLL)를 빌드할 때 사용한 컴파일러 종류 및 버전과, 애플리케이션(.EXE)을 빌드할 때 사용한 컴파일러가 반드시 같아야 합니다. (이 예제의 경우 Visual Studio 2015, MSVC 14) 그 이유는 Application Binary Interface (ABI) 호환 문제가 발생할 수 있기 때문입니다.

동적 라이브러리 형태로 사용할 경우 이와 같이 고려해야 할 면들이 많습니다. 그래서, 특별한 경우(AWS C++ SDK DLL을 여러 프로세스에서 공유해서 사용하는 경우 또는 자체 구현한 커스텀 메모리 관리자 사용 등)가 아니면 정적 라이브러리의 형태로 빌드해서 사용하는 것을 추천합니다. (cmake를 통하여 정적 라이브러리로 구성해서 사용하는 경우는 자동으로 전처리 선언이 꺼지기 때문에 커스텀 메모리 매니저는 사용하지 않게 됩니다.)

본 글은 아마존웹서비스 코리아의 솔루션즈 아키텍트가 국내 고객을 위해 전해 드리는 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 SDK for C++ 출시

오늘 오픈 소스 기반의 AWS C++ SDK를 발표합니다. 이를 통해 Amazon Web Services와 연계하여 네이티브 응용 프로그램 개발에 큰 도움이 될 것입니다. AWS SDK for C++는 현대적인 C++ 인터페이스에서 낮은 의존성 및 저수준 및 고수준 인터페이스에서 완벽하게 작동하도록 설계했습니다. 하지만, 가능한 한 외부 의존성은 낮추어 플랫폼이 독립적으로 동작합니다. 동시에 Windows, OS X, Linux 모바일 플랫폼을 지원합니다.

본 SDK는 게임 개발자를 위해 좀 더 집중적으로 설계하였습니다. 또한, 시스템 엔지니어링 및 기타 네이티브 코드의 효율성을 필요로하는 프로젝트 등에도 사용할 수 있도록 인터페이스 제공합니다.

주요 기능

  • 표준 템플릿 라이브러리 (STL) 사용
  • 사용자 정의 메모리 관리 지원
  • C++ 11 기능을 사용 및 지원
  • CMake 이용 네이티브 컴파일러 사용
  • 낮은 외부 의존도
  • 안전한 예외 설계
  • 세부 설정 가능한 로깅
  • 기본 자격 증명 공급자
  • Amazon Cognito Identity를 통한 ID 관리
  • TransferClient을 통한 Amazon S3에 대한 높은 수준 인터페이스
  • 암호화 및 HTTP의 지원에 기본 OS의 API 이용

코드 샘플
아래 코드는 Amazon DynamoDB 테이블에 데이터를 저장하는 샘플 코드입니다.

 
Aws::DynamoDB::DynamoDBClient dynamoDbClient;
PutItemRequest putItemRequest;
putItemRequest.WithTableName("TestTableName");
AttributeValue hashKeyAttribute;
hashKeyAttribute.SetS("SampleHashKeyValue");
putItemRequest.AddItem("HashKey", hashKeyAttribute);
AttributeValue valueAttribute;
valueAttribute.SetS("SampleValue");
putItemRequest.AddItem("Value", valueAttribute);
auto putItemOutcome = dynamoDbClient.PutItem(putItemRequest);

if(putItemOutcome.IsSuccess())
{
    std::cout << "PutItem Success Using IOPS " << putItemOutcome.GetResult().GetConsumedCapacity();
}
else
{
    std::cout << "PutItem failed with error " << putItemOutcome.GetError().GetMessage();
}

Amazon Simple Storage Service (S3)에서 파일을 다운로드하는 샘플코드입니다.

 
Aws::S3::S3Client s3Client;
GetObjectRequest getObjectRequest;
getObjectRequest.SetBucket("sample_bucket");
getObjectRequest.SetKey("sample_key");
getObjectRequest.SetResponseStreamFactory(
    [](){
        return Aws::New(ALLOCATION_TAG, DOWNLOADED_FILENAME, std::ios_base::out | std::ios_base::in | std::ios_base::trunc);
    });
auto getObjectOutcome = s3Client.GetObject(getObjectRequest);
if(getObjectOutcome.IsSuccess())
{
    std::cout << "File downloaded from S3 to location " << DOWNLOADED_FILENAME;
}
else
{
    std::cout << "File download failed from s3 with error " << getObjectOutcome.GetError().GetMessage();
}

간단하지요? GitHub 오늘 다운로드하여 AWS를 통해 C++용 프로그램을 더 확장해 보세요.

현재 상태
AWS SDK for C++는 현재 실험적으로 제공합니다. 사용자 분들과 오픈 소스 커뮤니티에서 의견을 모아 API를 더 견고하게 만들고 있습니다. 또한 개별 서비스 지원을 추가하고 클라이언트가 제대로 프로토콜을 지원할 수 있도록 노력하고 있습니다. 의견과 아이디어를 GitHub의 Issue로 보내주세요.

Jonathan Henson, Software Development Engineer (SDE)

이 글은 Introducing the AWS SDK for C++의 한국어 번역입니다.