aws s3 스토리지를 그누보드5와 영카트5에 사용하기 정보
aws s3 스토리지를 그누보드5와 영카트5에 사용하기첨부파일
본문
1. AWS S3 는 무엇인가요?
Amazon 에서 서비스하는 웹 스토리지 서비스입니다. ( 아래 URL 참고 )
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/Welcome.html
2. 본 자료의 적용방법
첨부파일을 그대로 덮어쓰기 해 주시면 됩니다. ( 본 첨부파일에 aws sdk php 라이브러리가 같이 첨부되어 있습니다. )
aws sdk php 의 github.com 저장소를 보면은
https://github.com/aws/aws-sdk-php
해당 페이지의 중간에 Minimum requirements PHP >= 5.5 라고 나와 있습니다.
그렇습니다. 본 자료의 최소 php 최소버전의 요구사항은 5.5 이상입니다.
그누보드5 버전은 5.4.0.4 이상이어야 사용할수 있습니다.
적용되는 대상은 아래와 같습니다.
게시판 에디터 이미지,
게시판 첨부파일,
게시판 첨부파일 view 썸네일( 게시판 리스트 썸네일은 제외 됩니다. 리스트 썸네일은 체크하는 과정이 많아서 비효율적인 것 같아서 넣지 않았습니다. )
쇼핑몰 이미지와 썸네일
영향받는 물리적인 경로
data/editor
data/file
data/item
3. AWS S3 저장소 만들기
AWS 에 가입후에 S3 에 버킷을 생성합니다. ( 버킷이름 을 잘 기억하고 있어야 합니다. )
해당 버킷의 권한 탭에서
"임의의 퍼블릭 버킷 정책을 통해 부여된 버킷 및 객체에 대한 퍼블릭 및 교차 계정 액세스 차단" 만 체크한 상태로 설정합니다.
객체 소유권 편집은 ACL을 활성화 해야 합니다. ACL을 활성화하고 객체 라이터로 체크하여 저장합니다.
이 부분을 하지 않으면 파일 업로드시 The bucket does not allow ACLs 오류가 나게 됩니다.
4. AWS S3 용 IAM 사용자 키와 비밀키를 발급 후 설정하기
본 자료를 적용하려면 AWS 에 가입후에 IAM 사용자를 생성후 필요한 권한만 부여한 후에,
해당 IAM 사용자의 키와 비밀키를 발급한 후에, 그누보드5 관리자 메뉴에서 IAM 사용자의 키와 비밀키를 적용합니다.
IAM이란 ?
AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다. ( 아래 URL 참고 )
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html
간단히 설명하자면 루트사용자로 키와 비밀키를 발급하여 사용한다면, 루트사용자와 키와 비밀키가 외부에 유출된다면 어마어마한 피해를 받을수 있습니다. 이를 방지하고자 서브사용자를 생성하여 각각 서비스에 대한 최소한의 권한만 부여하여, 서브사용자의 키와 비밀키가 외부에 노출되어도 피해를 최소한으로 줄이기 위해서 IAM 사용자를 생성 후에 최소한의 권한을 부여하는 것을 이야기 하는것입니다.
루트키를 발급받아 외부에 유출되어 피해를 본 사례들 :
그러니 절대로 루트키를 발급받지 마세요. 만약에 루트키를 발급받았다면 전부 삭제하세요.
루트키를 발급받아서 사용하다가 위와 같은 최악의 상황을 맞을수 있습니다.
본 자료를 사용하려고 루트키를 발급받은 사용자들은 아예 사람 취급을 안하겠습니다. ( 이런 표현은 쓴 이유는 정말로 루트키를 발급하는 행동이 위험하기 때문입니다. )
반드시 IAM 사용자를 생성 후에 각 서비스에 맞게 최소한의 권한을 부여한 후에 사용해주세요.
( 이 부분은 너무나 중요한 부분이기 때문에 본문 내용에서 여러번 언급을 하겠습니다. )
IAM 사용자 생성하기 및 정책 그룹 생성
1 ) S3 스토리지를 사용할수 있는 최소한의 권한을 부여하는 정책을 생성합니다.
아래 정책은 스토리지 내 자료를 GET, PUT, DELETE 만 할수 있는 정책입니다.
AWS 사이트에서 로그인 후에 내 보안 자격증명 -> 정책을 선택 -> 정책 생성 버튼을 누릅니다.
2) 정책 생성에서 JSON 탭에 위에서 생성한 S3 버킷이름을 기억하여
아래 코드를 복사하여 S3 버킷이름만 수정하여 정책 검토 버튼을 누릅니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::위에서생성한S3버킷이름"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObjectAcl",
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::위에서생성한S3버킷이름/*"
]
}
]
}
3 ) 정책 검토에서 이름을 입력후에 정책 생성을 합니다. ( 생성한 정책이름을 잘 기억하고 있어야 합니다. ) 정책 이름은 마음대로 지을수 있습니다.
4 ) AWS 사이트에서 로그인 후에 내 보안 자격증명 -> 그룹을 선택 -> 새로운 그룹 생성 버튼을 누릅니다.
5 ) 그룹 이름 설정 에서 그룹 이름을 지정합니다.
그룹 이름은 사용자 마음대로 편집할수 있습니다.
6 ) 생성한 그룹에 정책을 위에서 생성한 정책을 연결하여 그룹을 생성합니다.
7 ) 사용자 메뉴에서 사용자 추가 버튼을 클릭합니다. ( IAM 사용자 생성하는 것입니다. )
8 ) 사용자 이름을 입력 후에 엑세스 유형은 프로그래밍 방식 액세스 를 체크 합니다.
9 ) 위에서 생성한 그룹에 사용자를 추가 합니다.
10 ) 태그 추가는 건너뛰기 한 후에 검토 화면에서 생성될 IAM 사용자를 확인 후에 사용자 만들기 버튼을 클릭합니다.
11 ) IAM 사용자가 생성되었으며, S3 를 사용할수 있는 최소한의 권한이 부여되었습니다.
.csv 다운로드 버튼을 눌러서 액세스 키 ID 와 비밀 액세스 키를 확인해 주세요.
이 키는 외부에 유출이 되면 안됩니다. 만약에 외부에 노출되었다면 해당 사용자를 삭제 후에 위의 과정을 보고 다시 재 생성 해서 설정해 주세요.
12 ) 이제 그누보드5 관리자 -> aws S3 설정 메뉴에서 여러 키 값을 설정합니다.
4. 위의 과정을 잘 하셨다면 게시판이나 쇼핑몰에 첨부파일을 업로드시 aws s3 에 동시에 업로드 되게 됩니다.
위의 과정 중 하나라도 틀렸다면, 파일 업로드시 에러가 일어납니다.
aws s3 설정 중 버킷이름, 리전 유저키, 유저 비밀키 하나라도 틀리면 당연히 에러가 일어납니다.
업로드 되는 과정은
내 사이트 서버에 업로드 -> AWS S3 스토리지에 업로드 -> 내 사이트 서버에 원본 파일 삭제
이렇게 이루어집니다.
관리자 페이지의 aws_s3 설정에서
내 서버에 파일 저장 여부에 체크가 되어 있다면
내 사이트 서버에 업로드 -> AWS S3 스토리지에 업로드 과정만 하게 되어 사이트의 물리서버에도 같이 저장이 되게 됩니다.
5. AWS 계정 보안에 대해서 설명해둔 유용한 영상입니다.
보시면 AWS 과금 또는 계정 보안에 대해 매우 도움이 됩니다.
6. 기존자료를 aws s3 로 업로드하기
aws S3 스토리지에 업로드 하지 못한 자료들은 S3 Browser 툴을 이용하여 아래 방법으로 할수 있습니다.
기존 자료가 없으시고, 그누보드5를 최근에 처음 설치했다면 이 6번 부분을 하실 필요가 없습니다.
( 제가 아래에 써 놓은 방법보다 더 좋은 방법이 있으신 분들은 댓글로 알려주세요. )
1) 그누보드5와 영카트5의 경우 첨부파일이 보통 data 폴더에 쌓입니다.
data 폴더에서 editor, file, item 폴더를 복사해서 한 폴더에 붙여넣기 합니다. 해당 3개 폴더만 복사하세요. 나머지 폴더들은 작동 안되며 올려도 무용지물입니다.
( 그누보드5인 경우에는 editor, file 폴더 2개 이며, 영카트5 인 경우는 editor, file, item 폴더 3개 입니다. )
2) AWS 사이트에서 AmazonS3FullAccess 권한을 가진 IAM 계정을 임시로 생성할 것입니다. 생성하여 S3 Browser 툴을 이용하여 복사한 자료를 S3 스토리지에 업로드 하고 난 후에, 업로드가 다 끝났으면 보안을 위해서 임시로 생성한 IAM 계정을 삭제합니다.
AmazonS3FullAccess 권한을 가진 IAM 계정을 임시로 생성하기
사용자 에서 사용자 추가를 누릅니다.
사용자이름과 프로그래밍 방식 엑세스를 클릭 후 진행합니다.
권한 설정 탭에서 기존 정책 직접 연결을 선택한 후에 정책 필터에서 s3 를 입력 후에 AmazonS3FullAccess 정책이름을 체크 한 후에 다음:태그 로 넘어갑니다.
태그입력란은 생략해도 됩니다. 건너뛰기 한 후에 최종적으로 사용자 만들기를 합니다.
.csv 다운로드 버튼을 누르거나 또는 비밀엑세스 키 표시를 눌러서 액세스 키 ID와 비밀 액세스 키를 조회합니다. 해당 키는 절대로 외부로 유출이 되면 안됩니다.
3) 이제 S3 Browser 툴을 다운로드 받습니다. 업로드 하는 방식은 FTP툴과 매우 유사합니다.
다운주소 :
https://s3browser.com/external-buckets-how-to-use-shared-bucket.aspx
다운 받았다면 설치 -> 실행하여 account 를 추가합니다. AmazonS3FullAccess 권한을 준 임시계정의 액세스키와 비밀 액세스키를 입력합니다.
접속해서 조회후 data 폴더가 없으면 만든 다음에 해당 폴더에 editor, file, item 폴더를 업로드 합니다.
->
data/editor
data/file
data/item
이런 형식으로 업로드 하면 됩니다.
업로드를 다 했다면,
aws s3 사이트에서
위의 폴더들을 체크한 다음에 퍼블릭으로 설정 합니다. ( 퍼블릭으로 설정 안하면 이미지파일이 외부접근을 못해서 엑박이 뜹니다. )
그런 다음
그누보드5 관리자 -> aws s3 설정 에서
"첨부된 데이터경로를 무조건 aws s3으로 할시에 체크" 란에 체크 합니다.
다 되었다면 사이트에서 첨부파일 또는 이미지들의 경로가 https://버킷이름.s3.리전.amazonaws.com 으로 나오는지 확인합니다.( 게시판 리스트 썸네일은 제외입니다. 게시판 리스트 썸네일들만 내 서버 도메인으로 출력됩니다. )
다 업로드 된것을 확인했다면 보안을 위해서 임시로 AmazonS3FullAccess권한을 준 IAM 계정을 삭제합니다.
더 좋은 방법이나 좋은 의견이 있으시면 댓글로 알려주세요~
파일 수정 내역
2019-10-29 최초 업로드
2020-06-30 쇼핑몰 GIF 이미지가 안나오는 오류와 쇼핑몰 상품삭제 코드 추가
17
댓글 전체
그누보드 5.4가 얼른 정식버전 나왔으면
감사합니다
그런데 되게 어렵고 복잡하고, 위험(?) 한것 같은데 (글은 너무 쉬워요)
이렇게 까지해서 아마존을 사용할 필요가 있나요?? ㄷㄷㄷ
그누보드5 5.4.0.4 버전 이상에서만 됩니다.
AWS s3 와 AWS Session DynamoDB 를 같이 사용하려고 하면 아래 처럼 오류가 발생 합니다.
Fatal error: Cannot redeclare Aws\constantly() (previously declared in /home/admin/web/도메인.co.kr/public_html/plugin/aws_s3/Aws/functions.php:19) in /home/admin/web/도메인.co.kr/public_html/plugin/aws_s3/Aws/functions.php on line 22
어떻게 해야 되나요? ㅠ
AWS CloudFront 와 같은 CDN 서비스를 이용해서 s3 를 적용하려고 하고 있습니다.
올려주신 파일로 진행했을 때 사진이나, 파일의 주소 앞자리를 지정해두려면 어디를 수정해야 되나요?
https://s3.ap-northeast-2.amazonaws.com/s3버킷명/data/editor/2109/9f4c6dc32d0bd82e29ae79f1a1dbc878_1632365274_8209.jpg
처럼 되어 있는 것을
https://cf.abc.com/data/editor/2109/9f4c6dc32d0bd82e29ae79f1a1dbc878_1632365274_8209.jpg
처럼 수정되어서 보여주게 처리해야 합니다.
1. 이 플러그인을 사용하면 aws 로드밸런서 아래 여러개의 호스트를 붙여놓고 같은 php를 돌려도 유져한테 보여지는 웹사이트는 똑같나요?
2. 그누보드를 aws ec2 에서 돌리고 있습니다. IAM user 대신 IAM role 로 assumeRole 로 s3 에 연결할수 있을까요?
무조건 aws s3 로 하기 선택하고 상품이미지 등록했는데 서버로 저장이 되고
상품정보 수정페이지에서 사진등록부분 이하로는 아무것도 뜨지 않게 됩니다
공유에 감사드립니다. 1년 이상 경과된 글이라 추천이 안되는게 아쉽습니다.
감사합니다. 많은 도움 됐습니다. 이총님 굿
적용을 했는데 파일 업로드를 할 때 특정한? 이미지를 업로드하면 오류가 나서 살펴보니 thumbnail 생성이 안돼서 오류가 나는 부분이 있네요 단순히 aws.s3.gnu.class.php 에다가 lib/thumbnail.lib.php를 가져왔습니다. 그 외에 이미지를 업로드 하거나 파일을 업로드 할 때 s3 반환값이 아마존 주소 입니다. (xxxx.s3.ap-northeast-2.amazonaws.com)
저같은 경우는 이걸 바꾸려고 editor_upload_url 함수에서 return str_replace('https://'.$this->config['s3_bucket_name'].'.s3.'.$this->config['region'].'.amazonaws.com', $this->thumb_url, $result['ObjectURL']);
이렇게 따로 문자열을 바꿨습니다. $this->thumb_url은 파일 상단에서
private $config = array(); 밑에
private $thumb_url = 'https://image.example.com';
이런식으로 했습니다. cdn을 하려면 cloudfront를 때리면 됩니다.
이미지를 파일로 업로드시 생기는 문제 (추가적으로 발견됨)
aws.s3.gnu.class.php
upload_file함수에서
$exif = @exif_read_data($upload_file);
부분 위에 $upload_file = $filepath; 추가
jpg 업로드 시 500 error 반환됩니다. 해결을 위해 아래와 같은 간단한 수정 작업이 필요합니다.
aws.s3.gnu.class.php
thumbnail 함수 호출 시 함수가 정의되지 않아 오류가 발생합니다.
파일 최상단에 include_once(G5_LIB_PATH.'/thumbnail.lib.php'); 라인을 추가하여 해결합니다.
aws.s3.gnu.class.php
exif_read_data() 함수 호출 시 $uploadfile 변수가 정의되지 않아 에러가 발생합니다.
$uploadfile 변수를 $filepath 로 수정하여 해결합니다.