Amazon S3 REST API
AWS를 사용하는데 가장 좋은 방안은 SDK를 사용하는 것이다.
하지만 모든 SDK를 제공하지도 않으며 현재 테스트할 작업에서는 AWS REST API가 적절하다 생각하여 테스트를 했다.
하지만 짧은 영어탓과 제대로 이해하지 못하여 원하는 결과를 내지는 못했다.
그 과정을 정리해본다.
AWS REST API에서 첫번째 관문은 인증이다.
당연한 문제이기도 하다.
인증 방식 중 Signature Version 4를 사용하는 방법을 찾았다.
Authenticating Requests (AWS Signature Version 4)
위의 링크에서 확인할 수 있듯이 HTTP Authorization header과 Query string parameters를 사용할 수 있다.
query string 방식은 미리 인증된 URL을 사용하며 그 링크는 7일간 유효하다.
긴 시간 일관된 방식으로 서비스하기에는 적절하지 않다.
따라서 HTTP Authorization header를 사용하려고 시도하였다.
Authenticating Requests: Using the Authorization Header (AWS Signature Version 4)
인증의 시작은 바로 위의 링크의 내용을 따라 진행한다.
관련하여 Amazone S3 REST API with curl 의 블로그가 매우 잘 설명하고 있다.
인증을 위한 기본 키가 필요한데 해당 내용은 AWS IAM에서 진행한다
AWS IAM Service --> Users --> ID 선택 --> Security credentials 탭 --> Access Key 생성
저 과정을 통해서 KEY ID와 Security Key를 얻어서 사용할 수 있다.
아래의 내용은 위의 내용들과 인터넷에서 구한 쉘 스크립트를 이용해 "GET / "를 작동시켜보았다.
결과로 버킷 내의 모든 파일의 키값과 크기등의 정보를 XML로 반환한다.
#!/bin/bash function hmac_sha256 { key="$1" data="$2" echo -n "$data" | openssl dgst -sha256 -mac HMAC -macopt "$key" | sed 's/^.* //' } #filename=$1 #filesize=$(stat -c%s "$filename") date=$(date -u +"%Y%m%dT%H%M%SZ") datek=$(date -u +"%Y%m%d") reqmethod="GET" canonicaluri="/" canonicalquerystring="" canonicalheaders="host:ubikhan-vod3.s3.amazonaws.com\nx-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-amz-date:$date" signedheaders="host;x-amz-content-sha256;x-amz-date" #hashedpayload=$(openssl dgst -sha256 $filename | sed 's/^.* //') #echo "hashedpayload:"$hashedpayload hashedpayload="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" canonicalrequest=$reqmethod"\n"$canonicaluri"\n"$canonicalquerystring"\n"$canonicalheaders"\n\n"$signedheaders"\n"$hashedpayload echo -e $canonicalrequest keyid="XXXXXXXXXXXXXXXXXXX" secret="securityYYYYYYYYYYYYYYYYYYYY" region="ap-northeast-1" service="s3" awsreq="aws4_request" algorithm="AWS4-HMAC-SHA256" credentialscope=$datek/$region/$service/$awsreq hashedcanonicalrequest=$(echo -e -n "$canonicalrequest" | openssl dgst -sha256 | sed 's/^.* //') strtosign=$algorithm"\n"$date"\n"$credentialscope"\n"$hashedcanonicalrequest echo -e $strtosign # Four-step signing key calculation dateKey=$(hmac_sha256 key:"AWS4$secret" $datek) dateRegionKey=$(hmac_sha256 hexkey:$dateKey $region) dateRegionServiceKey=$(hmac_sha256 hexkey:$dateRegionKey $service) signingKey=$(hmac_sha256 hexkey:$dateRegionServiceKey "aws4_request") signature=$(hmac_sha256 hexkey:$signingKey $strtosign) echo $signature request="https://ubikhan-vod3.s3.amazonaws.com/ -H \"Authorization: AWS4-HMAC-SHA256 Credential=$keyid/$datek/ap-northeast-1/s3/aws4_request, SignedHeaders=$signedheaders, Signature=$signature\" -H \"x-amz-content-sha256: $hashedpayload\" -H \"x-amz-date: $date\" " echo $request curl -v $request
canonical request와 payload에 대한 명확하게 이해한다면 REST API를 이용하여 PUT을 해볼 수 있을 것이다.
다만 PUT을 위한 이 부분을 아직도 이해 못하고 있는 상황이다.
'프로그래밍??? > AWS' 카테고리의 다른 글
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 (0) | 2017.09.28 |
---|---|
고급 클라우드 아키텍처 방법론- 양승도 솔루션즈 아키텍트:: AWS Cloud Track 2 Advanced (0) | 2017.09.27 |
AWS EC2를 다른 리전으로 이전하기 (0) | 2017.08.29 |
AWS SDK for C++/Go and S3 upload time check (0) | 2017.05.29 |
시작~~~ (0) | 2017.04.21 |
시작~~~
AWS에 대해 한걸음씩 진행한다.
- 2017.04.21
- 회사 계정 수신
- 2017.04.24
- Lambda function 작성
- AWS Elastic Transcoder 테스트중 - 아직 안됨
- 2017.05.11
- 현재까지 진행상황
- S3 upload --> Lambda --> AWS Elastic Transcoder Test OK.
- S3 upload Test OK. -- aws cli
- REST API PUT: 테스트 실패 (제대로 된 명령을 만들지 못함)
- REST API GET 예제 성공
- aws IoT C SDK 테스트 OK --> 128KB 한계
- aws IoT C SDK sample --> aws iot --> s3 action OK
'프로그래밍??? > AWS' 카테고리의 다른 글
AWS 기반의 마이크로 서비스 아키텍쳐 구현 방안 (0) | 2017.09.28 |
---|---|
고급 클라우드 아키텍처 방법론- 양승도 솔루션즈 아키텍트:: AWS Cloud Track 2 Advanced (0) | 2017.09.27 |
AWS EC2를 다른 리전으로 이전하기 (0) | 2017.08.29 |
AWS SDK for C++/Go and S3 upload time check (0) | 2017.05.29 |
Amazon S3 REST API (0) | 2017.05.11 |
GOLANG 첫번째 프로젝트 완료!
GOLang으로 첫번째 프로젝트를 진행했다.
프로젝트라고 할것까지 없는 사실 C++로 했으면 두시간짜리를 거의 며칠에 걸쳐서 했다.
다음에는 빨라질꺼라 기대를 하며... 작업을 진행했다.
과정에서 느낀점 몇가지는 아래와 같다.
(매우 간단한 프로젝트였다는 점을 감안하자)
- File 관련 작업이 매우 편리하다
- JSON으로 출력하는 것도 매우 편리하다
- 기본 라이브러리만 가지고 한다면 이종(linux/windows)간에도 매우 편리하다
- 하나의 패키지 내에서 파일의 분포나 기능의 분할이 아직은 낯설다
- 파일 분리가 엉망으로 된 것 같다
- CentOS에서 인스톨할때 편리하다 - yum 사용
- yum으로 인스톨할 경우 GOROOT가 잡는게 난감했다(맞는건지 모르겠다) - /usr/lib/golang
- 간단하게나마 로그파일을 남겼다
- 스택오버플로우는 진리다!
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
read binary data from binary file and copy to struct (0) | 2017.02.01 |
인터페이스와 메서드 집합 그리고 포인터 (0) | 2017.01.12 |
테스트 프로젝트 시작 (0) | 2017.01.05 |
read binary data from binary file and copy to struct
아주 작은 프로젝트가 하나 생겼다.
파일에서 특정 데이터를 추출해내는 것이다.
기본적으로는 mpeg의 기본 구조를 따르는 것으로 보인다
go lang으로 작업을 진행하면서 보이는 자잘한 문제를 기술한다.
첫번째는 binary file에서 binary 데이터를 읽어 struct에 넣는 것이다
아래 코드와 같이 코딩하고 진행을 하면 이 지점에서 panic이 발생한다
err = binary.Read(buf, binary.LittleEndian, &riffHeader)
using value obtained using unexported field
package main import ( "os" "bytes" "encoding/binary" "fmt" ) type Header struct { //A int32 //B int32 //C int32 sID [4]byte size uint32 stype [4]byte } func readFile(filename string) { f, err := os.Open(filename) if err != nil { panic(err) } defer f.Close() b := make([]byte, 12) readsize, err := f.Read(b) if ( len(b) != readsize || err != nil) { panic(err) } riffHeader := Header{} buf := bytes.NewBuffer(b) err = binary.Read(buf, binary.LittleEndian, &riffHeader) if err != nil { fmt.Println("binary.Read failed:", err) } } func main() { readFile("e:/temp/20161101_105118_GE_2.avi") }
'프로그래밍??? > Go Lang' 카테고리의 다른 글
Defer를 이용한 코딩 패턴 - Deferred closure (0) | 2017.11.24 |
---|---|
필드 이름 없이 선언하는 것을 막아주는 방법 (0) | 2017.10.11 |
GOLANG 첫번째 프로젝트 완료! (0) | 2017.02.06 |
인터페이스와 메서드 집합 그리고 포인터 (0) | 2017.01.12 |
테스트 프로젝트 시작 (0) | 2017.01.05 |