AWS S3

allnight5·2023년 1월 13일
0

AWS

목록 보기
3/6

버킷 내가 파일을 저장해주는 장소를 폴더링(나눠놓는다) 해놓는것이다.
1번에는 이미지파일, 2번은 동영상파일 이렇게말이다
버킷은 파일을 저장하는 저장소 단위이다.

태그는 이버킷은 운영 이버킷은 테스트할때 사용할때쓰는버킷
이렇게 무슨 버킷인지 알아고기 위해서 태그를 사용하는경우도있는데
어느 방식으로 운영하느냐에 따라 태그의 사용방법은 달라진다

태깅이란?

업로드 파일에 객체 URL을 그냥 복사해서 넣어서 실행하면 Access Denied라는 에러가 발생하는데

Access Denied란 접근 권한이 문제가 생겨서(접근권한이없다.) 발생하는 에러다

업로드 파일에 권한 탭으로 이동하여
객체 소유자만 읽기,쓰기가 가능하다고 되어있는것을
모든사람이나 인증된 사용자 그룹만 볼수있도록 하기 둘중에 자신이 해야된느 부분에 필요한 권한을 부여해주면된다.
그런데 버킷 생성시 퍼블릭 엑세스 차단 설정에 모든 퍼블릭 엑세스 차단을
체크해두었다면 변경할수 없을것이다(disable되어있다.).

그러니 버킷에 가서 권한에 가서 퍼블렉 엑세스차단을 해제하고 차단해둔것을 해제하고 필요하다면 조절하면서 하면된다. 그런데 변경할때는 확인이라는 단어를 입력해야 변경이 가능하니 창이 나오면 입력해주면된다.
이제 차단을 해제하면 파일에 엑세스 권한을 변경해줄수있다.
이제 파일에 다른 사용자가 접근하겠다는것에 체크를 해준다면 아래에 확인한다는곳에도 체크하고 변경해주면 넣어둔 업로드 파일에 접근이 가능하다.

IAM를 사용한 S3에 파일 업로드

IAM에서 사용자를 생성하는데 프로그램방식 엑세스 유형을 이용한사용할것이기 때문에 체크해준다. 권한설정으로는
1.그룹에 사용자 추가
2.기존 사용자에게서 권한 복사
EC2는 어떠한 권한이 있고 S3는 어떠한 권한이 있고를 정해놓았을탠데 그 만들어둔 권한을 복사할수있게 해준다.
3.기존 정책 직접 연결
처음 만들때 사용하는 방법으로 권한이 많은데 S3를 검색하면 그 관련 권한들이 나온다. FullAccess는 읽기 쓰기가 다 되는 권한이다.

주고나면 태그추가(왜 만든거냐, 어디서 쓸건지를 알수있도록 적어주는것)가나온다.
이것까지 하고나면 이렇게 만드는게 맞는지 검토 페이지가 나오고 생성되게 되며
엑세스 키 ID과 비밀 엑세스 키가 발급된다.

AWS SDK를 설치하여 사용할것이다.
파이썬에서 aws configure을 입력 한다면
이제막 발급받은 엑세스 키 ID와 비밀엑세스 키를 입력하라고나오며
어느 리전에서 기본적으로 접속할건지 입력하라는것이 나오는데
자기가 할곳의 리전을 입력해주면된다.

aws s3 cp {파일명} s3://{버킷이름} --acl public-read
acl권한변경

aws s3 cp imags.jpg s3://spartatest9 --acl public-read

자바로 S3구현하기

S3 Endpoint URL
AWS SDK for Java를 사용하는 Amazon S3 예제

S3Util 구현

package com.sparta.aws;
 
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.List;
 
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.Bucket;
import com.amazonaws.services.s3.model.GeneratePresignedUrlRequest;
import com.amazonaws.services.s3.model.ObjectMetadata;
 
public class S3Util {
     
    private String accessKey = "put your access Key";
    private String secretKey = "put your secret Key";
     
    private AmazonS3 conn;
     
    public S3Util() {
        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        ClientConfiguration clientConfig = new ClientConfiguration();
        clientConfig.setProtocol(Protocol.HTTP);
        this.conn = new AmazonS3Client(credentials, clientConfig);
        conn.setEndpoint("s3-ap-northeast-1.amazonaws.com");
    }
     
    // Bucket List
    public List<bucket> getBucketList() {
        return conn.listBuckets();
    }
     
    // Bucket 생성 
    public Bucket createBucket(String bucketName) {
        return conn.createBucket(bucketName);
    }
     
    // 폴더 생성 (폴더는 파일명 뒤에 "/"를 붙여야한다.)
    public void createFolder(String bucketName, String folderName) {
        conn.putObject(bucketName, folderName + "/", new ByteArrayInputStream(new byte[0]), new ObjectMetadata());
    }
     
    // 파일 업로드
    public void fileUpload(String bucketName, File file) throws FileNotFoundException {
        conn.putObject(bucketName, file.getName(), new FileInputStream(file), new ObjectMetadata());
    }
     
    // 파일 삭제
    public void fileDelete(String bucketName, String fileName) {
        conn.deleteObject(bucketName, fileName);
    }
     
    // 파일 URL
    public String getFileURL(String bucketName, String fileName) {
        return conn.generatePresignedUrl(new GeneratePresignedUrlRequest(bucketName, fileName)).toString();
    }
     
}

위에 만든거 사용해보기

package com.sparta.aws;
 
import java.io.File;
import java.io.FileNotFoundException;
import java.util.List;
 
import com.amazonaws.services.s3.model.Bucket;
 
public class TestAWS {
 
    public static void main(String[] args) throws FileNotFoundException {
 
        S3Util s3 = new S3Util();
         
        List<bucket> list = s3.getBucketList();
         
        // 첫번째 Bucket
        String bucketName = list.get(0).getName().toString();
        System.out.println("Bucket Name : " + bucketName);
         
        // Bucket 생성(대문자는 포함되면 안됨.)
        for(int i = 0; i < 3; i++) {
            s3.createBucket("sparta-test-bucket" + i);
        }
         
        // 폴더 생성
        for(int i = 0; i < 3; i++) {
            s3.createFolder(bucketName, "sparta-test-folder" + i);
        }
         
        // 파일 업로드
        String fileName = "/Users/Downloads/sparta/test.zip";
        s3.fileUpload(bucketName, new File(fileName));
        System.out.println(s3.getFileURL(bucketName, "test.zip")); 
    } 
}

스프링 부트를 이용하여 사용하기

build.gradle에

runtimeOnly group: 'org.springframework.cloud', name: 'spring-cloud-starter-aws', version: '2.0.1.RELEASE'

를 추가하고

applicaiton.properties 에

##AWS S3
cloud.aws.credentials.accessKey=엑세스 키 ID (AWS S3에서 발급 받은 키)
cloud.aws.credentials.secretKey=비밀 엑세스 키 (AWS S3에서 발급 받은 키)
cloud.aws.stack.auto=false

#AWS S3 Service bucket
cloud.aws.s3.bucket=버킷이름 (자신이 설정한 버킷이름)
cloud.aws.region.static=ap-northeast-2 (버킷 지역(서울은 ap-northeast-2))

#AWS S3 Bucket URL
cloud.aws.s3.bucket.url=https://s3.ap-northeast-2.amazonaws.com/버킷이름

을 추가하면된다.

profile
공부기록하기

0개의 댓글