티스토리 뷰

개발일기

amazon S3 연결 해보기

dev_0hoon 2024. 4. 22. 18:51

1. 가입

2. 버킷 생성

 

 

권한은 따로 적어줄 것이기에 모두 해제한다.

 

만든 버킷 클릭

권한 > 버킷 정책에 정책을 적어서 넣어준다.

 

  1. "Version": "2012-10-17":
    • 이 부분은 정책의 버전을 나타냅니다. "2012-10-17"은 이 정책의 버전을 나타내는 표준 AWS 정책 버전입니다.
  2. "Statement":
    • 이 부분은 정책의 주요 선언을 포함하는 배열입니다. 여기에는 여러 개의 선언이 올 수 있습니다.
  3. "Sid": "PublicReadGetObject":
    • 이 부분은 선언의 식별자입니다. 각 선언에 대해 고유한 식별자를 제공하여 추후에 정책을 관리할 때 사용할 수 있습니다.
  4. "Effect": "Allow":
    • 이 부분은 이 선언의 효과를 나타냅니다. "Allow"는 해당 작업이 허용된다는 것을 의미합니다.
  5. "Principal": "*":
    • 이 부분은 이 선언이 적용되는 주체를 나타냅니다. 여기서 "*"는 모든 주체를 의미합니다. 따라서 누구나 이 권한을 가질 수 있습니다.
  6. "Action": "s3:GetObject":
    • 이 부분은 이 선언에서 허용하는 작업을 나타냅니다. 여기서는 S3 객체를 가져오는 작업인 "s3:GetObject" 작업을 허용합니다.
  7. "Resource": "arn:aws:s3:::mylooptest/*":
    • 이 부분은 이 선언이 적용되는 리소스를 나타냅니다. 여기서는 "mylooptest"라는 이름의 S3 버킷 내의 모든 객체를 가리킵니다. /*는 모든 객체를 의미합니다.

 

3. 관리자를 만들어야 한다.

IAM>사용자>사용자 생성

 

AWS Console > IAM > 엑세스 관리자 > 사용자 > 생성한 사용자 이름 클릭 > 보안 자격 증명 > 엑세스 키 만들기 클릭

 

 

2. 아무거나 클릭하고 다음을 클릭한다.

(클릭 하면 엑세스 키 사용사례와 대안을 하단에 띄워주는 기능만 하기때문에 뭘 골라도 상관없다.)

 

액세스 키와 비밀 액세스키는 csv파일로 저장해 두거나, 어디에 적어놓아야 한다.

스프링 연동

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

 

cloud:
	aws:
		s3:
      bucket: <버킷이름>
		stack.auto: false
		region.static: ap-northeast-2
		credentials:
			accessKey: <발급받은 accessKey>
			secretKey: <발급받은 secretKey>

 

accessKey 와 같은 보안 설정 정보는 깃허브에 노출되면 해킹되어 과금 위험이 있으므로 별도의 설정 파일로 분리하고 깃허브에 올리면 안된다. 설정 파일에 있는 정보는 스프링이 지원하는 @Value 어노테이션을 사용하여 불러올 수 있다.

 

cloud.aws.stack.auto=false

EC2에서 Spring Cloud 프로젝트를 실행시키면 기본으로 CloudFormation 구성을 시작하기 때문에 설정한 CloudFormation이 없으면 프로젝트 실행이 되지 않는다. 해당 기능을 사용하지 않도록 false로 설정.

 

cloud.aws.region.static:ap-northeast-2

지역을 한국으로 고정한다.

 

S3config


@Configuration
public class S3Config {
    @Value("${cloud.aws.credentials.access-key}")
    private String accessKey;
    @Value("${cloud.aws.credentials.secret-key}")
    private String secretKey;
    @Value("${cloud.aws.region.static}")
    private String region;

    @Bean
    public AmazonS3Client amazonS3Client() {
        BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
        return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                .withRegion(region)
                .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                .build();
    }
}

 

사용예시

    @PostMapping("/fileTest")
    public ResponseEntity<String> awsUploadFile(@RequestParam("file")MultipartFile file) {
        try {
            String fileName=file.getOriginalFilename();
            String fileUrl= "https://" + bucket + "/loop/" +fileName;
            ObjectMetadata metadata= new ObjectMetadata();
            metadata.setContentType(file.getContentType());
            metadata.setContentLength(file.getSize());
            amazonS3Client.putObject(bucket,fileName,file.getInputStream(),metadata);
            return ResponseEntity.ok(amazonS3Client.getUrl(bucket,fileName).toString());
        } catch (IOException e) {
            e.printStackTrace();
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
        }
    }
    
    public void deleteAwsUploadFile(String fileName){
        log.info("AWS파일 삭제--------------------------------start");
        DeleteObjectRequest request = new DeleteObjectRequest(bucket, fileName);
        amazonS3Client.deleteObject(request);
        log.info("AWS파일 삭제--------------------------------end");
    }

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함