...
AWS SDK Node.js
SDK(Software Development Kit) 란, 특정 서비스를 프로그래밍적으로 제어하기 편리하도록 제공되는 개발에 필요한 도구들을 의미한다.
SDK는 어떤 특정한 프로그래밍 언어를 지칭하는 것이 아니다.
라이브러리, 프레임워크, 모듈 같은 용어를 내포하는 상위권 용어라고 보면 된다.
좀더 쉽게 설명하자면 우리가 안드로이드 어플을 개발하기 위해선 Android-Studio를 사용하는데, 바로 이 안드로이드 스튜디오가 안드로이드 SDK 인 것이다. (안드로이드 어플을 개발하기 위한 도구)
그리고 이 안드로이드 SDK에서 지원하는 언어는 대표적으로 JAVA와 Kotlin 두개가 있고 이 언어를 이용해 어플을 개발한다.
이처럼 AWS SDK란 AWS을 프로그래밍적으로 유기적으로 다루기 위한 개발 도구를 말하며, 안드로이드를 개발하기 위해 자바나 코틀린을 쓰듯이, AWS 서비스와 연동(개발)하기위해 자바(스프링), 자바스크립트(노드), 루비 ..등 공식으로 지원하는 여러 프로그래밍 언어를 이용한다 라고 이해하면 된다.
이중에서 노드(자바스크립트)를 이용하여 AWS 서비스와 연동해 코드로 제어하는 방법을 알아보도록 하자.
Node.js 뿐만 아니라 브라우저 <script>태그 내에서도 AWS SDK 사용이 가능하다.
AWS SDK 모듈 설치
aws-sdk 패키지를 프로젝트에 설치해준다.
현재 최신 aws sdk js v3 버젼이 출시됬지만, 아직 많은 사람들이 v2 를 쓰고 있는 상황이다.
v2는 v1의 문제점을 개선한 버전이라고 보면 된다.
> npm install aws-sdk
AWS Credentials 세팅
우리가 AWS 서비스를 이용하기위해 아마존 웹사이트에 접속해서 아이디와 비밀번호를 입력하고 계정에 접속한 것 처럼, 서버단 코드에서 AWS 서비스와 연동하기위해선 자격증명(Credentials) Access Key(아이디)와 Secret Access Key(비밀번호)가 필요하다.
공식 가이드에선 서버단에서 AWS 서비스와 연동하기 위해 자격증명을 얻는 다음 5가지 방법을 소개한다.
- 서버(EC2)로부터 IAM Roles를 얻어 연동 (참고)
- 서버의 ~/.aws/credentials 경로의 파일에 자격증명 입력하여 연동 (참고)
- 환경변수에 자격증명을 저장하고 연동
- config.json 파일에 자격증명을 입력하여 연동 (권장되지 않음)
- 그냥 소스 코드에 직접 입력하여 연동 (권장되지 않음)
가장 이상적인 것은 1번의 임시자격증명(AssumeRole)을 얻어 사용하는 것이 보안적인 면에서 가장 안정적이다.
그래서 실무에서는 대부분 1번의 방법으로 사용한다.
두번째로는 2번의 AWS CLI를 이용해 서버 OS에 자격증명이 저장된 파일을 사용하는 것이다.
하지만 이들은 러닝커브가 높아 이를 이해하고 사용하기까지 충분한 지식을 요구하기 때문에, 이 포스팅에서는 관리하기 편한 3번의 노드 환경변수에 자격증명을 등록해 사용할 예정이다. (4,5번의 방법은 보안적인 면에서 추천되지 않는다)
다음 .env 파일에 IAM 계정에서 얻은 Access Key와 Secret Access Key를 넣어준다.
AWS-SDK 사용법
// 기본 ES6
import AWS from 'aws-sdk';
// 개별 서비스
import S3 from 'aws-sdk/clients/s3';
// 기본 commonJS
var AWS = require('aws-sdk');
// 개별 서비스
var S3 = require('aws-sdk/clients/s3');
만일 개별 AWS 서비스만 필요하다면, 위와 같이 import 경로를 지정해 개별 모듈만 로드 하는 것이 Node.js에서 로드 시간과 메모리 사용량이 줄어들어 좋다.
또한 webpack 등과 같은 번들링 도구를 사용해 수행하는 경우 개별 서비스만 필요로 하면 SDK가 전체 크기의 몇 분의 일 수준으로 줄어든다.
이는 IoT 디바이스 또는 Lambda 함수와 같이 메모리 또는 디스크 공간이 제한된 환경에서 유용하다.
간단하게 S3 버킷 리스트와 EC2 인스턴스 리스트를 출력해보자.
const AWS = require('aws-sdk');
const dotenv = require('dotenv');
dotenv.config();
// aws region 및 자격증명 설정
AWS.config.update({
accessKeyId: process.env.S3_ACCESS_KEY_ID,
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
region: 'ap-northeast-2',
});
// 자격증명 데이터를 따로 파일로 관리한다면 다음으로 호출할수 있다.
// AWS.config.loadFromPath('./config.json');
/* S3에 있는 버킷 리스트 출력 */
const s3 = new AWS.S3();
s3.listBuckets().promise().then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
});
/* EC2에 있는 인스턴스 리스트 출력 */
const ec2 = new AWS.EC2();
ec2.describeInstanceStatus().promise()
.then((data) => {
console.log('EC2 : ', JSON.stringify(data, null, 2));
});
dovenv로 위에서 환경변수로 저장했던 자격증명 데이터를 불러와 AWS config를 통해 등록해 주었다.
본래 AWS api들은 콜백기반의 메소드이지만 뒤에 .promise() 를 붙이면 프로미스 기반 메서드로 탈바꿈 할수 있다.
// 프로미스 기반 aws sdk api
s3.listBuckets().promise().then((data) => {
console.log('S3 : ', JSON.stringify(data, null, 2));
});
// 콜백 기반 aws sdk api
s3.listBuckets((err, data) => {
console.log(data);
}
자기가 편한걸 사용하면 되지만 요즘 자바스크립트의 대세는 프로미스 기반이니 프로미스 메서드로 사용되는걸 개인적으로 권장한다.
이제 코드를 실행해보자.
각 S3와 EC2 리스트들이 객체로 출력되는 것을 확인 할 수 있다. (실제로 나의 AWS 콘솔에 있는 리스트와 맞는지 비교해보자)
AWS SDK JavaScript v2 공식문서
공식문서에 듀토리얼 설명과 코드 예제가 잘 작성되어 있다.
추가적인 정보를 얻고싶다면 공식문서를 참고하기 바란다.
개발 안내서
AWS SDK 코드 예제
AWS SDK api 상세 정리
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.