Cloud Platform/AWS
AWS S3 객체 업로드 및 권한 설정 - JAVA
구티맨
2022. 1. 4. 17:12
목차
객체 업로드
S3에 객체를 업로드하는 코드 입니다.
업로드할 버킷의 지역, 버킷명, 객체명(파일명) 그리고 파일의 데이터를 byte로 하여
S3Client의 putObject함수를 이용하여 업로드 할 수 있습니다.
Region region = Region.AP_NORTHEAST_2;
S3Client s3 = S3Client.builder().region(region).build();
String bucketName = "bucket";
String objectKey = "test.csv";
putS3Object(s3, bucketName, objectKey, getObjectFile("path/of/file"));
private String putS3Object(S3Client s3,
String bucketName,
String objectKey,
byte[] objectData) {
try {
PutObjectRequest putOb = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.build();
PutObjectResponse response = s3.putObject(putOb,
RequestBody.fromBytes(objectData));
return response.eTag();
} catch (S3Exception e) {
System.err.println(e.getMessage());
}
return "";
}
private static byte[] getObjectFile(String filePath) {
FileInputStream fileInputStream = null;
byte[] bytesArray = null;
try {
File file = new File(filePath);
bytesArray = new byte[(int) file.length()];
fileInputStream = new FileInputStream(file);
fileInputStream.read(bytesArray);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return bytesArray;
}
<dependencyManagement>
<dependencies>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.17.102</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
</dependency>
객체 권한
버킷에 객체 소유권 ACL 정책이 활성화 되어 있으면,
객체 업로드시 객체는 업로드 하는 계정의 소유가 되어 다른 계정에서 접근이 불가능합니다.
다른 계정에서 접근하게 하기위해서는 객체 업로드시 ACL을 적용하거나
버킷에 객체 소유권 ACL 정책을 비활성화 하면 됩니다.
이는 보안 정책에 따라 어떤 방식을 사용할지 선택하면 됩니다.
객체 업로드시 ACL 적용하는 방법은 아래와 같습니다.
기존 코드에 원하는 ACL 정책을 설정해주면 됩니다.
( 참고로, ACL 설정을 하기 위해서는 계정에 WRITE_ACP 권한이 있어야 가능합니다. )
PutObjectRequest putOb = PutObjectRequest.builder()
.bucket(bucketName)
.key(objectKey)
.acl(ObjectCannedACL.AUTHENTICATED_READ)
.build();
Canned ACL
사용자별로 권한을 별도로 설정을 해줄수 있지만, 미리 제공된 ACL( Canned ACL )을 이용하여
사전 정의된 권한 부여 집합을 사용하여 좀 더 포괄적으로 권한을 지정해줄 수 있습니다.
미리 제공된 ACL | 적용대상 | ACL에 추가된 권한 |
private | 버킷과 객체 | 소유자는 FULL_CONTROL을 가집니다. 다른 누구도 액세스 권한이 없습니다(기본). |
public-read | 버킷과 객체 | 소유자는 FULL_CONTROL을 가집니다. AllUsers 그룹은(피부여자란? 참조) READ 액세스 권한을 가집니다. |
public-read-write | 버킷과 객체 | 소유자는 FULL_CONTROL을 가집니다. AllUsers 그룹은 READ와 WRITE에 대한 액세스 권한을 가집니다. 버킷에 이를 허용하는 것은 일반적으로 권장하지 않습니다. |
aws-exec-read | 버킷과 객체 | 소유자는 FULL_CONTROL을 가집니다. Amazon EC2는 Amazon S3에서 Amazon Machine Image(AMI) 번들을 GET하기 위해 READ 액세스 권한을 가져옵니다. |
authenticated-read | 버킷과 객체 | 소유자는 FULL_CONTROL을 가집니다. AuthenticatedUsers 그룹은 READ 액세스 권한을 가집니다. |
bucket-owner-read | 객체 | 객체 소유자는 FULL_CONTROL을 가집니다. 버킷 소유자는 READ 액세스 권한을 가집니다. 버킷 생성 시 미리 제공된 이 ACL을 지정하면 Amazon S3는 이를 무시합니다. |
bucket-owner-full-control | 객체 | 객체 소유자와 버킷 소유자 모두 객체에 대해 FULL_CONTROL을 가집니다. 버킷 생성 시 미리 제공된 이 ACL을 지정하면 Amazon S3는 이를 무시합니다. |
log-delivery-write | 버킷 | LogDelivery 그룹은 버킷에 대해 WRITE과 READ_ACP 권한을 가집니다. 로그에 대한 자세한 내용은 서버 액세스 로깅을 사용한 요청 로깅 단원을 참조하세요. |
참조
https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#canned-acl
https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html