s3fs 연결

IT/서버 2018. 11. 23. 00:12
서버에서 좀더 쉽게 S3에 파일을 업로드 하기 위해서 S3FS를 사용하자


  1. 설치 방법
  • On Debian 9 and Ubuntu 16.04 or newer:
    sudo apt-get install s3fs
  • On SUSE 12 or newer and openSUSE 42.1 or newer:
    sudo zypper in s3fs
  • On Fedora 27 and newer:
    sudo yum install s3fs-fuse
  • On RHEL/CentOS 7 and newer through EPEL repositories:
    sudo yum install epel-release
    sudo yum install s3fs-fuse
  • On macOS, install via Homebrew:
    $ brew cask install osxfuse
    $ brew install s3fs


  1. 의존성 패키지 설치
  2. sudo yum install automake fuse fuse-devel gcc-c++ git libcurl-devel libxml2-devel make openssl-devel

  1. s3fs 설치
    git clone https://github.com/s3fs-fuse/s3fs-fuse.git
    cd s3fs-fuse
    ./autogen.sh
    ./configure --prefix=/usr/local/s3fs
    make
    sudo make install
    ln -s /usr/local/s3fs/bin/* /usr/local/bin


  1. s3 엑세스키 설정
     - 기본적으로 mount의 경우 {사용자홈}/.passwd-s3fs 에서 파일을 로딩하고
    - fstab에서는 /etc/passwd-s3fs 에서 엑세스키에 대한 정보를 로딩한다.

    echo {엑세스키}:{시크릿키} > /etc/passwd-s3fs
    chmod 600 /etc/passwd-s3fs

  1. s3 마운트
    mkdir /data/s3fs
    s3fs {버킷이름} /data/s3fs -o passwd_file=/etc/passwd-s3fs
  2. fstab에 등록
    {버킷이름} /data/s3fs fuse.s3fs _netdev,allow_other 0 0

    <공개파일로 저장>
    {버킷이름} /data/s3fs fuse.s3fs  defaults,noatime,allow_other,uid=500,gid=48,use_cache=/tmp,default_acl=public-read,url=http://s3.amazonaws.com  0 0


해당권한이 퍼미션에 마스크로 들어간다.
777 -> 000  권한없음.

ISSUE
  • use_cache옵션을 사용했더니 어마어마하게 많은양의 캐쉬 데이터가 누적되어서 용량부족 현상이 발생했었다. 

  • mount에서 에러가 발생하지 않았는데 실제로 마운트가 되지 않은 현상이 발생하였다.
    s3fs에서 문제가 발생하였을 경우 로그를 확인해보면 그 원인을 좀더 쉽게 확인할수가 있다. 
    "-o dbglevel=info -f -o curldbg"

  • 버킷 이름이 Dot(.)가 있어서 마운트가 제대로 되지 않았다. -o use_path_request_style으로 해결하였다.
-o use_path_request_style 를 사용하면 유효하지 않은 옵션을 사용하지 않고 버킷 이름에 점들이있는 버킷에 액세스 할 수 있어야합니다.이 옵션 -o no_check_certificate은 유효성 검사 오류를 무시하므로 권장되지 않습니다.
  • 인증서 관련해서 에러가 발생하였다. 기본값이 https로 인증서가 없는 서버에서 접근하려면 url을 설정해 줘야 한다.

url (기본값 = " https://s3.amazonaws.com ")

  • Amazon S3에 액세스하는 데 사용할 URL을 설정합니다. HTTP를 사용하려면 "url = http://s3.amazonaws.com "을 설정할 수 있습니다 . 
    https를 사용하지 않는 경우 url 옵션을 사용하여 URL을 지정하십시오.


/etc/fstab에 설정한 다음 재부팅 하지 말고.

mount -a 로 설정값을 적용해보자. 만약에 fstab에 오타등 문제가 있을경우 부팅이 되지 않으니 조심해야 한다.



마운트 해제

$sudo fusermount -u /mnt/s3
sudo umount /mnt/s3fs







'IT > 서버' 카테고리의 다른 글

[SVN Server] E170001 : Authorization failed  (0) 2018.03.05
[MySQL] TimeStamp, DateTime 필드  (0) 2017.08.24
블로그 이미지

날기억해

Android / IOS / PHP / System Engineer / Service Architecture/ MongoDB / AWS / Mysql / Linux / Python / C++ / Vue.js / node.js / Java / Iot / BLE / Firebase / Bigdata Architecture / AD Server / SDK / Epub /

,

새로 구입한 NAS 장비에 SVN 서버를 설치하고


기존에 컴퓨터로 돌렸던 SVN Repository에서 폴더채로 Copy해서 연결했더니 정상적으로 CheckOut이동작하였다.


그래서 설정이 완료 된줄 알았는데,막상 사용하려고 하니 Commit할때 인증 에러가 발생하는것이였다.


다른 모든 권한들을 확인해봤으나 읽기만 가능한 옵션은 어디에도 설정되어 있지 않았다.



계속 삽질을 하던 결과 결국에는 svnserve.conf 파일이 읽기전용이라 그렇다는 글을 보았다. 


권한을 바꾸니 문제없이 해결이 되었다.


The E170001 error also appears for repository updates (commits) if svnserve has been invoked with the -R (--read-only) option.


'IT > 서버' 카테고리의 다른 글

s3fs 연결  (0) 2018.11.23
[MySQL] TimeStamp, DateTime 필드  (0) 2017.08.24
블로그 이미지

날기억해

Android / IOS / PHP / System Engineer / Service Architecture/ MongoDB / AWS / Mysql / Linux / Python / C++ / Vue.js / node.js / Java / Iot / BLE / Firebase / Bigdata Architecture / AD Server / SDK / Epub /

,

오랜만에 포스팅을 하게 되었다.


오늘 DB 쿼리를 짜게 되던중에 시간별로 되어 있는 리포트의 3시간 또는 12시간 등에 따라서 GroupBy를 해야 하는 상황이 발생하였다.



현재 Time 필드의 타입은 DateTime으로 되어 있었다.


따라서 쿼리로 Group By를 하기 위해서 리서치를 하던중에 다음과 같은 해법을 찾았다.



SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP('2017-08-11 11:00:00') / 10800) * 10800);


위의 쿼리를 간단하게 설명하자면,


1. (UNIX_TIMESTAMP('2017-08-11 11:00:00'))

현재 텍스트의 시간을 UNIX_TIMESTAMP로 변환한다.


2.  나누기 10800

3시간(60*60*3)으로 나눠서 분,초,밀리세컨드 등을 날려버린다. 


3. FLOOR 

나누기 전의 값을 찍어 보면 알겠지만 소수점 자리수등이 포함되어 있다. 


4. 곱하기 10800

원래 시간을 구하기 위해 다시 구하고자 하는 시간의 값을 곱해준다


EX) 68초의 시간을 10초단위로 묶는 다고 한다면,  68 / 10 = 6  그리고 다시 10을 곱해서 60을 만들어주는건다.




그런데 이때 문제가 발생했다. 


DB로 부터 읽어온 날짜를 계산하고 나면 결과날짜의 값이 +09:00 가 되어 있는것이다. 


이때 09:00 라는 숫자가 타임존을 의미하는것 같아서 이것저것 테스트 해보았다.




시간단위로 구할때는 문제를 발견하지 못하였다.


SELECT FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP('2017-08-11 11:00:00') / 3600) * 3600);



그런데 일자가 바뀌니까 같은 문제가 발생하는것이였다.


SELECT '2017-08-11 11:00:00', FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP('2017-08-11 11:00:00') / 86400) * 86400);



그래서 결론적으로 생각한것은


UNIX_TIMESTAMP로 변환한 값이 타임존에 영향을 받지 않고 그냥 들어가는데, 보일때만 타임존을 적용해서 보이는것 같았다.



무슨 말이냐면, 

UNIX_TIMESTAMP("2017-08-11 11:00:00") 을 하면 내가 원했던 타임의 값은 1502416800 인데,



실제로는 로컬 타임 기준이 아닌 GMT타임 기준으로 변환되어서 1502449200로 변환되는것같았다. 그래서 


SELECT FLOOR(UNIX_TIMESTAMP('2017-08-11 11:00:00'));


직접 타임스탬프를 찍어 보았으나 정상적으로 작동 하였다. 



 SELECT FLOOR(UNIX_TIMESTAMP('2017-08-11 11:00:00') / 86400) * 86400;


그래서 나눈다음에 버림을 하고 다시 곱하였더니 바로 문제의 +09:00시간이 추가되는것이다.



1502416800 / 86400 =  17389.0833


소수점 자리수가 버림 되면서 해당 문제가 발생한것으로 결론을 내렸다.


그래서 결론은 


SELECT '2017-08-11 11:00:00', FROM_UNIXTIME(FLOOR((UNIX_TIMESTAMP('2017-08-11 11:00:00')  + 32400) / 86400) * 86400 - 32400);


타임존을 더해주고 빼주었다.


사실 CONVERT_TZ 함수를 쓰는게 더 좋을것 같으나.. 그냥 9시간을 더해주고 빼주었따. 


도움이 되시는 분들이 있기를

'IT > 서버' 카테고리의 다른 글

s3fs 연결  (0) 2018.11.23
[SVN Server] E170001 : Authorization failed  (0) 2018.03.05
블로그 이미지

날기억해

Android / IOS / PHP / System Engineer / Service Architecture/ MongoDB / AWS / Mysql / Linux / Python / C++ / Vue.js / node.js / Java / Iot / BLE / Firebase / Bigdata Architecture / AD Server / SDK / Epub /

,