AWS Lambda - API Gateway로 S3 파일 업로드 API 만들기 #3 - API Gateway - Lambda 연결 및 테스트

이미지
안녕하세요. 남산돈가스입니다. AWS Lambda - API Gateway로 S3 파일 업로드 API 만들기 #1 , #2 에 이어 마지막 시간인 API Gateway - Lambda 연결 및 테스트가 남았습니다. 지난 포스팅까지 Lambda를 이용해 업로드 함수를 생성했고, API Gateway와 S3 기본설정을 통해 S3 파일 업로드 기능의 기본설정을 마무리했습니다. 오늘은 이 두 설정들을 연결하여 최종적으로 S3 업로드 Micro Service를 완성하겠습니다. 먼저 지난 포스팅에서 API Gateway를 생성했고, uploader라는 리소스까지 생성했습니다. 이번엔 이 uploader라는 리소스에 POST 매서드를 추가하고 작성했던 Lambda Function을 설정합니다. 통합 유형 - Lambda 함수 Lambda 리전 - 'Lambda함수를 생성한 리전' Lambda 함수 - '작성한 Lambda 함수명(리전 선택 시 자동완성으로 검색 가능)' 위와 같이 설정한 뒤 저장을 선택합니다. 저장을 선택 시 다음과 같이 uploader라는 리소스 밑에 post 매서드가 생성 된 것을 확인하실 수 있습니다. 다음으로, 우측 상단의 통합 요청을 선택하시면 아래와 같은 화면이 나옵니다. 그 중에서 하단의 본문 매핑 템플릿을 선택합니다. 요청 본문 패스스루에서 '정의된 템플릿이 없는 경우'를 체크하고 Content-Type에 매핑 템플릿 추가하여 multipart/form-data  을 추가하고 '템플릿 생성'에서 매서드 요청 패스스루를 클릭하시고 아래와 같은 패스스루가 나온 것을 확인하셨으면 저장을 누릅니다. 여기까지 설정을 완료하셨다면, API Gateway와 Lambda Function의 연결이 모두 완료 된 것입니다. 이제 실제 이 API Gateway를 배포하여 엔드포인트를 발급받고 실제 업로드가 되는지

android Multidex 적용

테스트 프로그램을 만들거나 프로젝트 초기에는 별문제 없지만 개발하는 소스와 라이브러리가 많아지면서 꼭 발생하는 오류가 있습니다. LEVEL EXCEPTION: com.android.dex.DexIndexOverflowException: method ID not in 바로 Dex 오류 입니다. 1. 오류 발생 원인  android apk에는 Dalvik Executable이라는 Dex 파일 존재합니다. 1개의 Dex파일 안에는 참조 될수 있는 함수의 개수는 65,536개 라고 합니다. 위의 에러는 함수가 총 65,536개 이상이 되었을때 발생하는 오류 입니다. 난 저렇게 많이 안썼는데 생각 하실수도 있지만 개발에 필요한 라이브러리 파일들의 함수들 까지 생각한다면 저 숫자는 어느정도 납득할수 있을 것입니다. 그래서 문제의 해결방법으로 Multidex를 적용하는 방법을 알아보도록 하겠습니다. 2. gradle 설정 android { defaultConfig { multiDexEnabled true } } dependencies { compile 'com.android.support:multidex:1.0.1' } Multidex를 사용하기위해서 defaultConfig 쪽에 사용하도록 설정 하고 dependecies 를 추가 합니다. 3. 소스 추가(Application이 있는 프로젝트) @Override protected void attachBaseContext(Context base) { super . attachBaseContext ( base ) ; MultiDex . install ( this ) ; } Application을 만들어서 작업하는 경우 Application 클래스안에서 MultiDex.install 함수를 추가 합니다. 3. 소스 추가(Application이 없는 프로젝트) < application android : name

[Xcode Tip] Git LFS 대용량 파일 다운받기

이미지
지난번에는 svn에 있는 레파지토리를 Git허브로 옮겨보았는데요. 사용하고 있던 라이브러리 중 500MB가 넘은 파일이 있었습니다. 이파일은 업로드 하고 나서, git clone으로 다운받아서 빌드를 했는데. 빌드가 되지 않았습니다. 여기저기 구글링을 해보았는데, LFS 설정이 되지 않아서 였습니다. LFS란 large file handling을 하기 위해 github에서 만든 오픈 소스입니다. Git에서는 대용량 파일을 다루기가 적절하지 않기 때문에, 이부분을 지원하기 위해 나온 오픈소스입니다. Git에서 clone을 받은 프로젝트에는 해당파일이 134 바이트였습니다. git 허브 에는 525MB으로 확인됩니다. 사용법은 의외로 간단했습니다. 우선 Xcode로 clone을 받습니다.  (터미널이나, github에서 직접 다운받으면, clone받은 프로젝트 내에 git 폴더가 생기지 않을 수 있으니, xcode로 clone을 해주세요) 그다음 터미널을 열고, 해당 프로젝트로 가서 git lfs pull 명령어를 눌러주시면, 다운로드 받는걸 보실수 있습니다. 다운로드가 완료 된 뒤에, 빌드를 하니, 정상적으로 빌드가 되었습니다. lfs을 이용하면, 대용양 파일을 git에 저장하고 사용할수 있습니다. * 참고 URL https://docs.gitlab.com/ee/workflow/lfs/manage_large_binaries_with_git_lfs.html

[AWS] 통합결제를 위한 조직에 계정 초대

이미지
지난번 포스팅에서 AWS 통합결제 계정의 구성방법에 대해 확인 해 보았습니다. 이번 포스팅 에서는 실제 통합계정을 구성하는 방법에 대해 알아 보겠습니다. 통합계정 생성을 위해서는 AWS Organizations 을 활용합니다. 먼저 저희 팀에서는 실제로 진행 중인 서비스의 구성을 어떻게 적용하였는지 소개해 드리고자 합니다. 아래는 통합계정을 설정하기 전 운영 상황입니다. 위와 같이 각 서비스 별로 별도의 계정을 구성하였으며 대금은 동일한 계정에서 지급되고 있었습니다. 이런경우 단지  각각의 계정에서 청구서를 별도로 확인해야 하는 번거로움 뿐만 아니라 AWS 사용량 증가에 따른 할인률 적용도 불가능한 상황이었습니다. 통합결제 할인 적용 및 운영의 편의를 위하여 아래와 같이 통합계정 조직을 구성하였습니다. 이렇게 구성하면 iFriendsPet 계정에서 Namdopass 및 Fico2000 계정의 청구서를 통합관리 할 수 있으며 3개의 계정에서 사용되는  AWS 사용량을 합산하여 통합할인 적용이 가능하게 됩니다. 통합계정 생성을 위해서는 결제를 진행할 마스터 계정에서 조직을 생성해 주어야 합니다. AWS 콘솔의 상단 우측 사용자 명을 클릭하고  “내 조직” 으로 이동합니다. 조직 설정 페이지로 이동하여 Create organigation 을 선택합니다. All Feature 와 Consolidate Billing 선택 화면이 표출되는데 일단 All Feature를 선택하여 계정을 생성하겠습니다. 조직이 생성 되었습니다. 이제 조직에 계정을 추가하기 위해 Add Account  를 선택합니다. 계정 초대를 위한 화면이 표출되면 Invie Account 를 선택하고 아래 입력란에 초청하고자 하는 계정의 Master Account E-mail 주소를 입력한 후 Invite 를 선택합니다. 이제 연결 하고자 하는 계정에 초대 진행이 완료 되었습니다. 이제 초대받은

android의 SharedPreferences알아보기

android에서 최초실행 여부, 간단한 설정한 값등을 어디에 저장 하면 좋을까요? 로컬DB에 쓰기, 파일에 쓰기, SharedPreferences 사용하기등 다양한 방법이 존재합니다. 그중에 이러한 작업들은 android에서 기본적으로 제공하는 SharedPreferences를 활용하면 쉽게 쓰고 읽을수 있습니다. 1. SharedPreferences란?  - 간단하게 말해 xml파일에 필요한 데이터를 저장하여 쉽게 읽고 쓰게 하는 것 입니다.  - 경로 : data/data/패키지명/shared_prefs/SharedPreference 에 파일이 저장 2. 객체얻어오기  - getSharedPreferences(String name, int mode)   -> 위 함수를 통하여 SharedPrefrences 객체를 받아 올수 있습니다.   -> 첫번째 인자  name은 해당 SharedPreferences의 이름입니다. 특정 이름으로 생성할수 있고 해당 이름으로 xml 파일이 생성된다고 생각하시면 됩니다.   -> 두번째 인자 mode는 읽고 쓰기 권한 관련된 Mode라고 생각하시면 됩니다. 일단 MODE_PRIVATE만 생각하세요. 3. 저장하기 SharedPreferences pref = getSharedPreferences ( " pref " , MODE_PRIVATE ) ; SharedPreferences . Editor editor = pref . edit ( ) ; editor . putString ( " key1 " , " value " ) ; editor . putInt ( " key2 " , 10 ) ; editor . commit ( ) ; 저장 하는 소스입니다. SharedPreferences 객체를 생성하고 데이터를 저장하기 위해서 Editor 객체를 받아 옵니다. Editor 객체를

AWS Lambda - API Gateway로 S3 파일 업로드 API 만들기 #2 - API Gateway, S3 셋팅

이미지
안녕하세요. 남산돈가스입니다. 지난 포스팅에 이어 오늘은 두번째 시간인 API Gateway와 S3 셋팅을 진행해보겠습니다. 먼저 API Gateway 콘솔로 이동해서 새로운 API Gateway를 생성합니다. 그 다음 API URL에 매칭 될 리소스를 생성합니다. 저 같은 경우는 리소스 명을 fileUpload로 생성했습니다.  리소스는 실제 API Gateway가 배포가 되면 엔드포인트 URL이 발급되는데 그 해당 {{URL}}/리소스명 으로 API 요청을 보내면 해당 리소스 내의 매서드들을 호출할 수 있게 됩니다. 리소스까지 생성이 되었다면, 해당 리소스에 대한 매서드는 다음시간에 다루어보기로 하고, 왼쪽 탭에 이진지원이라는 탭을 선택하시고 이진 미디어 형식에 'multipart/form-data'를 추가합니다. multipart/form-data 이 이진 미디어를 추가해준 이유는 해당 형식, 즉, multipart폼 형식으로 요청을 보낸 파일들을 API Gateway에서 받으면 자체적으로 파일데이터를 이진 바이너리 형식으로 변환하여 처리해준다는 것을 의미합니다.  개인적으로 이 부분을 알지못해서 많은 시간동안 헤맸던 기억이 납니다..ㅠ 여기까지 설정을 모두 마쳤다면, Lambda 함수 연결 전의 API Gateway 설정은 모두 마쳤습니다. 그럼 다음으로, 실제 파일이 업로드 될 스토리지인 S3의 권한 설정을 해보겠습니다. S3 콘솔로 이동하여 파일이 업로드 될 버킷을 선택합니다. 해당 버킷화면에서 권한 탭을 선택하시고 버킷 정책 메뉴를 선택합니다. 아래와 같이 권한을 부여합니다. { " Version " : " 2012-10-17 " , " Statement " : [ { " Sid " : " AddPerm &qu

AWS Lambda - API Gateway로 S3 파일 업로드 API 만들기 #1 - Lambda 함수 생성

이미지
안녕하세요. 남산돈가스입니다.  이번 포스팅에서는 웹을 개발하면서 가장 골칫거리지만 자주 쓰이게 될 수 있는 파일 업로드 기능 구현에 대해서 포스팅하려고합니다.  하지만 일반적인 파일업로드가 아닌, Lambda로 S3에 파일을 업로드 시키는 함수를 생성하고, 해당 Lambda함수를 API Gateway에 연결하여 multipart-form 형식으로 파일을 업로드하는 Serverless 파일업로드를 구현할 예정입니다.  이런 방식으로 업로드기능을 구현하게 되면, 추후에 어디든지 파일업로드 기능을 쓸 수 있는 Micro Service가 될 수 있습니다. 포스팅은 다음과 같이 3회에 걸쳐 진행되겠습니다. #1. Lambda 함수 생성 #2. API Gateway, S3 셋팅 #3. API Gateway - Lambda 연결 및 테스트 그렇다면 지금부터 그 첫번째 단계인 Lambda 함수 생성을 진행해보겠습니다. 먼저 Lambda 서비스에 접속한 뒤 Node.js 기반의 새로운 함수를 생성합니다. 함수를 생성하면 아래와 같이 트리거가 추가되지 않은 날것의 함수가 생성된 것을 확인하실 수 있습니다.  쥐도 새도 모르게 변하는 AWS 콘솔 덕분에(?) 매번 포스팅할 때마다 Lambdad의 콘솔화면이 다채롭게  변하고있네요...ㅎㅎ 기존의 포스팅에서는 위 사진처럼 인라인으로 편집하는 포스팅만 진행했었는데 금번 포스팅에서는 외부 node_module을 사용하는 경우라 로컬에서 작업한 소스를 ZIP파일 형식으로 업로드하여 함수를 생성해보겠습니다. 로컬 터미널에서 upload라는 폴더를 생성하고 index.js을 생성합니다. index.js 그리고 해당 함수에 필요한 node_module을 install 하기 위해서 npm install 명령어를 사용합니다. 필요 모듈 aws-sdk : AWS javascript sdk 모듈 parse-multipart : multipart형식으로