728x90
반응형

ListObjects/ListObjectsV2 API 사용 설정에 대한 주의 사항

 

S3 Bucket 접근 시 권한을 설정할 때 Bucket에 대한 권한인지 Object에 대한 권한인지에 따라 아래 스샷처럼 별도 설정이 필요하다.

위의 제목에서 보듯이 ListObjects 라고 명명된 API지만 작업 목록에 ListObjects라는 권한은 존재하지 않으며, ListBucket 권한을 할당해야 정상적으로 사용 가능하다. 이에 대한 상세한 내용은 이 링크를 참고하기 바란다.

 

ListBucket 이라는 API가 별도 존재하기 때문에 혼동될 수 있으니 주의가 필요하다. 이렇게 설정되지 않으면 Access Denied 에러를 볼 수 있으며, ListBucket 권한을 GetObject와 같이 설정하면 (위 스샷의 붉은 동그라미에서 보듯이) 리소스 지정이 달라 정상적으로 사용할 수 없으므로 이 또한 주의가 필요하다.

 

ListObjects/ListObjectsV2 API 에 대한 파라미터 정보

 

상세 내용은 이 링크에서 확인할 수 있으며, 하단에 각 언어 별 sdk api 상세 링크가 있으니 그곳을 참고해야 한다.

 

언어별로 파라미터 설정 방법이 다르기 때문에 주의가 필요하다. 특히 C++은 ... -_-++

 

반응형
728x90
반응형

json, 별도 포멧의 파일에 데이터를 입력하고 사용하려면 데이터 가공 및 배포에 대한 허들이 발생합니다. 

 

트래픽이 많이 발생하지 않는다면 spreadsheet에서 데이터를 일괄 관리하고, 필요한 곳에서 spreadsheet 접속하여 갱신된 최신 데이터를 가져와 사용한다면 데이터 가공/배포에 대한 비용을 극적으로 줄일 수 있습니다. 

 

모듈은 google-spreadsheet를 사용하여 Google Spread Sheet API를 사용하며, document는 theoephraim.github.io/node-google-spreadsheet/#/ 를 참고하시면 됩니다.

 

API 사용을 위해서는 console.developers.google.com/에서 API 사용 허가를 설정해야 합니다. 

 

sheet 사용을 위한 프로젝트를 새로 만들어 보겠습니다. 

상단 프로젝트를 선택하고 "새 프로젝트"를 생성합니다. 

 

 프로젝트를 생성했다면 좌측 메뉴에서 라이브러리를 선택합니다. 

 

API 라이브러리 검색 란에 'sheet'를 입력한 후 "Google Sheets API" 를 선택, 그리고 "사용"버튼을 눌러주시기 바랍니다. 

 

이제 문서 사용을 위한 "사용자 인증 정보"를 세팅해야 합니다. 화면 좌측에서 "사용자 인증 정보"를 클릭한 후 "사용자 인증 정보 만들기"를 선택합니다.

 

 

 

 

 

'sheet-user'라는 이름을 입력 한 후 "완료" 버튼을 선택하여 계정 생성을 마무리 합니다.

 

다음으로 인증에 사용할 키를 생성하겠습니다.

 

서비스 계정 정보 중 우측의 작업 버튼을 누르면 "키 만들기" 메뉴가 있습니다. 이 메뉴를 선택하면 키 유형을 선택하는 다이얼로그가 뜹니다. 

JSON 을 선택 후 "만들기" 버튼을 누르면 키가 생성됩니다. 생성된 json 파일은 코드에서 인증을 위해 사용하게 됩니다.

 

이제 접근하고자 하는 spreadsheet 문서로 가서 "공유"버튼을 눌러 생성된 계정 ( 이 예제에서는 sheet-user@... 로 생성했던 계정을 말합니다.) 사용자 그룹에 편집자로 추가합니다. 읽기만 할 경우 뷰어로 추가하셔도 무방합니다.

 

계정을 추가한 후 문서ID를 복사해 둬야 합니다. 해당 문서가 열린 화면의 주소창에 아래 이미지 중 파락색으로 칠해진 부분이 해당 문서의 ID입니다. 이 값만 별로도 복사해 두시기 바랍니다. 

모든 준비가 마무리 되었습니다. 이제 코드로 해당 문서를 접근해 보겠습니다.

 

const {GoogleSpreadsheet} = require("google-spreadsheet");
const gs_creds = require("./eco-test-d2asdf22849b5bb4.json"); // 키 생성 후 다운된 json파일을 지정합니다.
const doc = new GoogleSpreadsheet("문서ID를 입력하세요.");

async function authGoogleSheet(){
	try{
		await doc.useServiceAccountAuth(gs_creds);
		await doc.loadInfo()
	}catch(err){
		console.log( "AUTH ERROR ", err)
	}
}
authGoogleSheet(); // 처음 시작할 때 문서 접속에 대한 인증을 처리하고 해당 문서를 로드합니다.

.
.
.

async function readFirstSheetRow(){ 
	var sheet = doc.sheetsByIndex[0]; // 첫번째 시티를 가져옵니다.
    var rows = await sheet.getRows({offset:3, limit:100}); // 세 번째 row 부터 100개 row를 가져옵니다.
    rows.forEach((ele)=>{
    	console.log( ele._rawData[0] , ele._rawData[1] ) // 읽어온 rows 중 현재row에서 첫 번째 컬럼과 두 번째 컬럼을 출력합니다.
    });
}
readFirstSheetRow();

 

위 코드를 실행해 보시면 해당 문서의 첫번째 sheet의 세번째 row 부터 100개를 읽어와 각 row의 첫 번째, 두 번째 컬럼의 정보를 화면에 출력합니다. 

 

더 많은 API는 이 문서를 참고하시기 바랍니다.

 

도움이 되셨길 바라며 이상 마치겠습니다.

반응형
728x90
반응형

테스트 용 툴 제작하다 재밌어 보여서 동영상만 공개해 봅니다. 

 

Amazon Polly : aws.amazon.com/ko/polly/ , docs.aws.amazon.com/ko_kr/polly/latest/dg/API_Reference.html , pypi.org/project/boto3/

Google Translate API : pypi.org/project/googletrans/

 

엑셀 문서에 한글을 등록한 후 툴에서 오픈해 번역하고 싶은 언어를 추가 후 번역을 시도하면,

Google Translate API로 텍스트로 번역을 하고, Amazon Polly로 음성 파일을 만들어 저장합니다. 

해당 셀을 선택하면 음성 파일을 들을 수 있습니다.

 

 

 

반응형
728x90
반응형

POST로 json데이터를 전달할 때,


서버 트리를 가지는 구조를 전달하면 400 bad request 를 리턴한다.


문제가 되는 구조는 아래와 같다. 


{ "msg" : { "to": "you", "from":"me"}}


text/plain으로 지정해서 보내봤지만 에러는 계속 발생한다. 



이를 아래와 같은 단일 구조로 만들어서 보내야 한다.


{"msgTo": "you", "msgFrom":"me"}




반응형
728x90
반응형

인증을 설정하지 않았어도 일반적인 웹브라우져에 주소를 입력하는 방식으로는 


{"message":"Missing Authentication Token"}  


이라는 메세지만 볼 수 있다.


Unity c# 코드를 기준으로 테스트를 해 보았다. 


----- UntyWebRequest 사용 시


WWWForm form = new WWWFrom();

form.AddField("test", "value");

UnityWebRequest www = UnityWebRequest.Post(apiAddr , form);

yield return www.SendWebRequest();     >> 실패. API 문서를 봐도 이 코드가 실패할 이유는 없는 듯 한데.. 안됨.


(* 참고 코드 : https://docs.unity3d.com/Manual/UnityWebRequest-SendingForm.html )



----- WWW 사용 시


string dataString ="json format data";

var encoding = new System.Text.UTF8Encoding();

Hashtable header = new Hashtable();

header.Add("Content-Type", "text/json");

header.Add("Content-Length", dataString.Length);

WWW www = new WWW(apiAddr, encoding.GetBytes(dataString));

yield return www;         >> 성공. 



음.. 무슨 차이지.. 당연히 UnityWebRequest API 공식 메뉴얼을 보고 코드를 작성했는데, 수동으로 헤더 설정해서 보낸 것과 무슨 차이가 발생하는걸까. 


-_-+++++++



반응형

+ Recent posts