- 인쇄
- PDF
SDK 가이드
- 인쇄
- PDF
Java SDK for S3 API
AWS S3에서 제공하는 Java SDK를 이용하여 네이버 클라우드 플랫폼 Object Storage를 사용하는 방법을 설명합니다.
이 문서는 AWS Java SDK 1.11.238 버전을 기준으로 작성되었습니다.
설치
SDK 소스를 직접 다운로드하거나 Apache Maven을 이용해 사용할 수 있습니다.
소스 다운로드
AWS Java SDK GitHub : https://github.com/aws/aws-sdk-java/tree/master/aws-java-sdk-s3
Apache Maven으로 이용하기
pom.xml
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.238</version>
</dependency>
예제
예제에서 사용하는 accessKey, secretKey는 등록한 API 인증키 정보로 입력해야 합니다.
버킷 생성
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
try {
// create bucket if the bucket name does not exist
if (s3.doesBucketExistV2(bucketName)) {
System.out.format("Bucket %s already exists.\n", bucketName);
} else {
s3.createBucket(bucketName);
System.out.format("Bucket %s has been created.\n", bucketName);
}
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
버킷 목록 조회
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
try {
List<Bucket> buckets = s3.listBuckets();
System.out.println("Bucket List: ");
for (Bucket bucket : buckets) {
System.out.println(" name=" + bucket.getName() + ", creation_date=" + bucket.getCreationDate() + ", owner=" + bucket.getOwner().getId());
}
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
버킷 삭제
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
try {
// delete bucket if the bucket exists
if (s3.doesBucketExistV2(bucketName)) {
// delete all objects
ObjectListing objectListing = s3.listObjects(bucketName);
while (true) {
for (Iterator<?> iterator = objectListing.getObjectSummaries().iterator(); iterator.hasNext();) {
S3ObjectSummary summary = (S3ObjectSummary)iterator.next();
s3.deleteObject(bucketName, summary.getKey());
}
if (objectListing.isTruncated()) {
objectListing = s3.listNextBatchOfObjects(objectListing);
} else {
break;
}
}
// abort incomplete multipart uploads
MultipartUploadListing multipartUploadListing = s3.listMultipartUploads(new ListMultipartUploadsRequest(bucketName));
while (true) {
for (Iterator<?> iterator = multipartUploadListing.getMultipartUploads().iterator(); iterator.hasNext();) {
MultipartUpload multipartUpload = (MultipartUpload)iterator.next();
s3.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, multipartUpload.getKey(), multipartUpload.getUploadId()));
}
if (multipartUploadListing.isTruncated()) {
ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
listMultipartUploadsRequest.withUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
multipartUploadListing = s3.listMultipartUploads(listMultipartUploadsRequest);
} else {
break;
}
}
s3.deleteBucket(bucketName);
System.out.format("Bucket %s has been deleted.\n", bucketName);
} else {
System.out.format("Bucket %s does not exist.\n", bucketName);
}
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
오브젝트 업로드
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
// create folder
String folderName = "sample-folder/";
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(0L);
objectMetadata.setContentType("application/x-directory");
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folderName, new ByteArrayInputStream(new byte[0]), objectMetadata);
try {
s3.putObject(putObjectRequest);
System.out.format("Folder %s has been created.\n", folderName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
// upload local file
String objectName = "sample-object";
String filePath = "/tmp/sample.txt";
try {
s3.putObject(bucketName, objectName, new File(filePath));
System.out.format("Object %s has been created.\n", objectName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
오브젝트 목록 조회
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
// list all in the bucket
try {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withMaxKeys(300);
ObjectListing objectListing = s3.listObjects(listObjectsRequest);
System.out.println("Object List:");
while (true) {
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" name=" + objectSummary.getKey() + ", size=" + objectSummary.getSize() + ", owner=" + objectSummary.getOwner().getId());
}
if (objectListing.isTruncated()) {
objectListing = s3.listNextBatchOfObjects(objectListing);
} else {
break;
}
}
} catch (AmazonS3Exception e) {
System.err.println(e.getErrorMessage());
System.exit(1);
}
// top level folders and files in the bucket
try {
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
.withBucketName(bucketName)
.withDelimiter("/")
.withMaxKeys(300);
ObjectListing objectListing = s3.listObjects(listObjectsRequest);
System.out.println("Folder List:");
for (String commonPrefixes : objectListing.getCommonPrefixes()) {
System.out.println(" name=" + commonPrefixes);
}
System.out.println("File List:");
for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries()) {
System.out.println(" name=" + objectSummary.getKey() + ", size=" + objectSummary.getSize() + ", owner=" + objectSummary.getOwner().getId());
}
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
오브젝트 다운로드
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
String objectName = "sample-object";
String downloadPath = "/tmp/sample-object";
// download object
try {
S3Object s3Object = s3.getObject(bucketName, objectName);
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadPath));
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
while ((bytesRead = s3ObjectInputStream.read(bytesArray)) != -1) {
outputStream.write(bytesArray, 0, bytesRead);
}
outputStream.close();
s3ObjectInputStream.close();
System.out.format("Object %s has been downloaded.\n", objectName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
오브젝트 삭제
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
String objectName = "sample-object";
// delete object
try {
s3.deleteObject(bucketName, objectName);
System.out.format("Object %s has been deleted.\n", objectName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
ACL 설정
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
// set bucket ACL
try {
// get the current ACL
AccessControlList accessControlList = s3.getBucketAcl(bucketName);
// add read permission to anonymous
accessControlList.grantPermission(GroupGrantee.AllUsers, Permission.Read);
s3.setBucketAcl(bucketName, accessControlList);
} catch (AmazonS3Exception e) {
System.err.println(e.getErrorMessage());
System.exit(1);
}
String objectName = "sample-object";
String userId = "test-user-02";
// set object ACL
try {
// get the current ACL
AccessControlList accessControlList = s3.getObjectAcl(bucketName, objectName);
// add read permission to user by ID
accessControlList.grantPermission(new CanonicalGrantee(userId), Permission.Read);
s3.setObjectAcl(bucketName, objectName, accessControlList);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
멀티 파트 업로드
멀티 파트 업로드를 완료하지 않을 경우 잔여 파일이 버킷에 남게 되며 잔여 파일은 버킷 용량에 포함되어 과금됩니다. 아래 방법으로 불완전한 멀티파트 객체를 삭제하여 불필요한 과금이 되지 않도록 주의해 주십시오.
- 불완전한 멀티파트 객체 확인 및 삭제
- 취소 또는 완료되지 않은 멀티파트 업로드 정보 조회 : ListMultipartUploads API 참고
- 멀티파트 삭제: AbortMultipartUpload API 참고
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
String objectName = "sample-large-object";
File file = new File("/tmp/sample.file");
long contentLength = file.length();
long partSize = 10 * 1024 * 1024;
try {
// initialize and get upload ID
InitiateMultipartUploadResult initiateMultipartUploadResult = s3.initiateMultipartUpload(new InitiateMultipartUploadRequest(bucketName, objectName));
String uploadId = initiateMultipartUploadResult.getUploadId();
// upload parts
List<PartETag> partETagList = new ArrayList<PartETag>();
long fileOffset = 0;
for (int i = 1; fileOffset < contentLength; i++) {
partSize = Math.min(partSize, (contentLength - fileOffset));
UploadPartRequest uploadPartRequest = new UploadPartRequest()
.withBucketName(bucketName)
.withKey(objectName)
.withUploadId(uploadId)
.withPartNumber(i)
.withFile(file)
.withFileOffset(fileOffset)
.withPartSize(partSize);
UploadPartResult uploadPartResult = s3.uploadPart(uploadPartRequest);
partETagList.add(uploadPartResult.getPartETag());
fileOffset += partSize;
}
// abort
// s3.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, objectName, uploadId));
// complete
CompleteMultipartUploadResult completeMultipartUploadResult = s3.completeMultipartUpload(new CompleteMultipartUploadRequest(bucketName, objectName, uploadId, partETagList));
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
고객 제공 키를 사용한 암호화(SSE-C) 요청
SSE-C 기반으로 오브젝트를 암호화 할 경우 콘솔에서 일부 요청을 사용할 수 없습니다.
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
// create encryption key
KeyGenerator KEY_GENERATOR = KeyGenerator.getInstance("AES");
KEY_GENERATOR.init(256, new SecureRandom());
final SSECustomerKey SSE_KEY = new SSECustomerKey(KEY_GENERATOR.generateKey());
String bucketName = "sample-bucket";
// upload local file
String objectName = "sample-object";
String filePath = "/tmp/sample.txt";
try {
PutObjectRequest putRequest = new PutObjectRequest(bucketName, objectName, new File(filePath))
.withSSECustomerKey(SSE_KEY);
s3.putObject(putRequest);
System.out.format("Object %s has been created.\n", objectName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
// download object
String downloadPath = "/tmp/sample-object";
try {
GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, objectName)
.withSSECustomerKey(SSE_KEY);
S3Object s3Object = s3.getObject(getObjectRequest);
S3ObjectInputStream s3ObjectInputStream = s3Object.getObjectContent();
OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(downloadPath));
byte[] bytesArray = new byte[4096];
int bytesRead = -1;
while ((bytesRead = s3ObjectInputStream.read(bytesArray)) != -1) {
outputStream.write(bytesArray, 0, bytesRead);
}
outputStream.close();
s3ObjectInputStream.close();
System.out.format("Object %s has been downloaded.\n", objectName);
} catch (AmazonS3Exception e) {
e.printStackTrace();
} catch(SdkClientException e) {
e.printStackTrace();
}
CORS(Cross-Origin Resource Sharing) 설정
final String endPoint = "https://kr.object.fin-ncloudstorage.com";
final String regionName = "fin-standard";
final String accessKey = "ACCESS_KEY";
final String secretKey = "SECRET_KEY";
// S3 client
final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, regionName))
.withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
.build();
String bucketName = "sample-bucket";
// Create CORS rules.
List<CORSRule.AllowedMethods> methodRule = new ArrayList<CORSRule.AllowedMethods>();
methodRule.add(CORSRule.AllowedMethods.PUT);
methodRule.add(CORSRule.AllowedMethods.GET);
methodRule.add(CORSRule.AllowedMethods.POST);
CORSRule rule = new CORSRule().withId("CORSRule")
.withAllowedMethods(methodRule)
.withAllowedHeaders(Arrays.asList(new String[] { "*" }))
.withAllowedOrigins(Arrays.asList(new String[] { "*" }))
.withMaxAgeSeconds(3000);
List<CORSRule> rules = new ArrayList<CORSRule>();
rules.add(rule);
// Add rules to new CORS configuration.
BucketCrossOriginConfiguration configuration = new BucketCrossOriginConfiguration();
configuration.setRules(rules);
// Set the rules to CORS configuration.
s3.setBucketCrossOriginConfiguration(bucketName, configuration);
// Get the rules for CORS configuration.
configuration = s3.getBucketCrossOriginConfiguration(bucketName);
if (configuration == null) {
System.out.println("Configuration is null.");
} else {
System.out.println("Configuration has " + configuration.getRules().size() + " rules\n");
for (CORSRule getRule : configuration.getRules()) {
System.out.println("Rule ID: " + getRule.getId());
System.out.println("MaxAgeSeconds: " + getRule.getMaxAgeSeconds());
System.out.println("AllowedMethod: " + getRule.getAllowedMethods());
System.out.println("AllowedOrigins: " + getRule.getAllowedOrigins());
System.out.println("AllowedHeaders: " + getRule.getAllowedHeaders());
System.out.println("ExposeHeader: " + getRule.getExposedHeaders());
System.out.println();
}
}
Python SDK for S3 API
AWS S3에서 제공하는 Python SDK를 이용하여 네이버 클라우드 플랫폼 Object Storage를 사용하는 방법을 설명합니다.
이 문서는 AWS Python SDK 1.6.19 버전을 기준으로 작성되었습니다.
설치
pip install boto3==1.6.19
- boto3 1.6.19 버전은 python3.8 사용을 권장합니다. python3.9 이상 버전 사용 시 최신 버전 boto3을 사용해 주시기 바랍니다.
- boto3 관련 자료는 다음을 참조해 주십시오.
- AWS Python SDK 소스: https://github.com/boto/boto3
- 관련 문서: https://boto3.readthedocs.io/en/latest/reference/services/s3.html
예제
예제에서 사용하는 access_key
, secret_key
는 등록한 API 인증키 정보로 입력해야 합니다.
버킷 생성
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
s3.create_bucket(Bucket=bucket_name)
버킷 목록 조회
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
response = s3.list_buckets()
for bucket in response.get('Buckets', []):
print (bucket.get('Name'))
버킷 삭제
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
s3.delete_bucket(Bucket=bucket_name)
오브젝트 업로드
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
# create folder
object_name = 'sample-folder/'
s3.put_object(Bucket=bucket_name, Key=object_name)
# upload file
object_name = 'sample-object'
local_file_path = '/tmp/test.txt'
s3.upload_file(local_file_path, bucket_name, object_name)
오브젝트 목록 조회
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
# list all in the bucket
max_keys = 300
response = s3.list_objects(Bucket=bucket_name, MaxKeys=max_keys)
print('list all in the bucket')
while True:
print('IsTruncated=%r' % response.get('IsTruncated'))
print('Marker=%s' % response.get('Marker'))
print('NextMarker=%s' % response.get('NextMarker'))
print('Object List')
for content in response.get('Contents'):
print(' Name=%s, Size=%d, Owner=%s' % \
(content.get('Key'), content.get('Size'), content.get('Owner').get('ID')))
if response.get('IsTruncated'):
response = s3.list_objects(Bucket=bucket_name, MaxKeys=max_keys,
Marker=response.get('NextMarker'))
else:
break
# top level folders and files in the bucket
delimiter = '/'
max_keys = 300
response = s3.list_objects(Bucket=bucket_name, Delimiter=delimiter, MaxKeys=max_keys)
print('top level folders and files in the bucket')
while True:
print('IsTruncated=%r' % response.get('IsTruncated'))
print('Marker=%s' % response.get('Marker'))
print('NextMarker=%s' % response.get('NextMarker'))
print('Folder List')
for folder in response.get('CommonPrefixes'):
print(' Name=%s' % folder.get('Prefix'))
print('File List')
for content in response.get('Contents'):
print(' Name=%s, Size=%d, Owner=%s' % \
(content.get('Key'), content.get('Size'), content.get('Owner').get('ID')))
if response.get('IsTruncated'):
response = s3.list_objects(Bucket=bucket_name, Delimiter=delimiter, MaxKeys=max_keys,
Marker=response.get('NextMarker'))
else:
break
오브젝트 다운로드
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
object_name = 'sample-object'
local_file_path = '/tmp/test.txt'
s3.download_file(bucket_name, object_name, local_file_path)
오브젝트 삭제
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
object_name = 'sample-object'
s3.delete_object(Bucket=bucket_name, Key=object_name)
ACL 설정
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
# set bucket ACL
# add read permission to anonymous
s3.put_bucket_acl(Bucket=bucket_name, ACL='public-read')
response = s3.get_bucket_acl(Bucket=bucket_name)
# set object ACL
# add read permission to user by ID
object_name = 'sample-object'
owner_id = 'test-owner-id'
target_id = 'test-user-id'
s3.put_object_acl(Bucket=bucket_name, Key=object_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'ID': owner_id,
'Type': 'CanonicalUser'
},
'Permission': 'FULL_CONTROL'
},
{
'Grantee': {
'ID': target_id,
'Type': 'CanonicalUser'
},
'Permission': 'READ'
}
],
'Owner': {
'ID': owner_id
}
})
response = s3.get_object_acl(Bucket=bucket_name, Key=object_name)
Multipart Upload
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY_ID'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
object_name = 'sample-large-object'
local_file = '/tmp/sample.file'
# initialize and get upload ID
create_multipart_upload_response = s3.create_multipart_upload(Bucket=bucket_name, Key=object_name)
upload_id = create_multipart_upload_response['UploadId']
part_size = 10 * 1024 * 1024
parts = []
# upload parts
with open(local_file, 'rb') as f:
part_number = 1
while True:
data = f.read(part_size)
if not len(data):
break
upload_part_response = s3.upload_part(Bucket=bucket_name, Key=object_name, PartNumber=part_number, UploadId=upload_id, Body=data)
parts.append({
'PartNumber': part_number,
'ETag': upload_part_response['ETag']
})
part_number += 1
multipart_upload = {'Parts': parts}
# abort multipart upload
# s3.abort_multipart_upload(Bucket=bucket_name, Key=object_name, UploadId=upload_id)
# complete multipart upload
s3.complete_multipart_upload(Bucket=bucket_name, Key=object_name, UploadId=upload_id, MultipartUpload=multipart_upload)
고객 제공 키를 사용한 암호화(SSE-C) 요청
SSE-C 기반으로 오브젝트를 암호화 할 경우 콘솔에서 일부 요청을 사용할 수 없습니다.
import boto3
import secrets
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY_ID'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
# S3 client
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
# create encryption key
sse_key = secrets.token_bytes(32)
sse_conf = { "SSECustomerKey": sse_key, "SSECustomerAlgorithm": "AES256"}
bucket_name = 'sample-bucket'
object_name = 'sample-object'
# upload object
local_file_path = '/tmp/sample.txt'
s3.upload_file(local_file_path, bucket_name, object_name, sse_conf)
# download object
download_file_path = '/tmp/sample-download.txt'
s3.download_file(bucket_name, object_name, download_file_path, sse_conf)
CORS(Cross-Origin Resource Sharing) 설정
import boto3
service_name = 's3'
endpoint_url = 'https://kr.object.fin-ncloudstorage.com'
region_name = 'fin-standard'
access_key = 'ACCESS_KEY_ID'
secret_key = 'SECRET_KEY'
if __name__ == "__main__":
s3 = boto3.client(service_name, endpoint_url=endpoint_url, aws_access_key_id=access_key,
aws_secret_access_key=secret_key)
bucket_name = 'sample-bucket'
# Define the configuration rules
cors_configuration = {
'CORSRules': [{
'AllowedHeaders': ['*'],
'AllowedMethods': ['GET', 'PUT'],
'AllowedOrigins': ['*'],
'MaxAgeSeconds': 3000
}]
}
# Set CORS configuration
s3.put_bucket_cors(Bucket=bucket_name,
CORSConfiguration=cors_configuration)
# Get CORS configuration
response = s3.get_bucket_cors(Bucket=bucket_name)
print(response['CORSRules'])
Javascript SDK for S3 API
AWS S3에서 제공하는 Javascript SDK를 이용하여 네이버 클라우드 플랫폼 Object Storage를 사용하는 방법을 설명합니다.
이 문서는 AWS Javascript SDK 2.348.0 버전을 기준으로 작성되었습니다.
설치
npm install --save aws-sdk@2.348.0
AWS Javascript SDK
- 소스 : https://github.com/aws/aws-sdk-js
- 문서 : https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html
예제
예제에서 사용하는 access_key, secret_key는 등록한 API 인증키 정보로 입력해야 합니다.
버킷 생성
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
(async () => {
await S3.createBucket({
Bucket: bucket_name,
CreateBucketConfiguration: {}
}).promise()
})();
버킷 목록 조회
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
(async () => {
let { Buckets } = await S3.listBuckets().promise();
for(let bucket of Buckets) {
console.log(bucket.Name);
}
})();
버킷 삭제
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
(async () => {
await S3.deleteBucket({
Bucket: bucket_name
}).promise();
})();
오브젝트 업로드
const AWS = require('aws-sdk');
const fs = require('fs');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
const local_file_path = '/tmp/test.txt';
(async () => {
let object_name = 'sample-folder/';
// create folder
await S3.putObject({
Bucket: bucket_name,
Key: object_name
}).promise();
object_name = 'sample-object';
// upload file
await S3.putObject({
Bucket: bucket_name,
Key: object_name,
ACL: 'public-read',
// ACL을 지우면 전체공개가 되지 않습니다.
Body: fs.createReadStream(local_file_path)
}).promise();
})();
오브젝트 목록 조회
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
const MAX_KEYS = 300;
var params = {
Bucket: bucket_name,
MaxKeys: MAX_KEYS,
FetchOwner: true
};
(async () => {
// List All Objects
console.log("List All In The Bucket");
console.log("==========================");
while (true) {
let response = await S3.listObjectsV2(params).promise();
console.log(`IsTruncated = ${response.IsTruncated}`);
console.log(
`ContinuationToken = ${response.ContinuationToken ? response.ContinuationToken : null}`
);
console.log(
`NextContinuationToken = ${
response.NextContinuationToken ? response.NextContinuationToken : null
}`
);
console.log(` Object Lists`);
for (let content of response.Contents) {
console.log(
` Name = ${content.Key}, Size = ${content.Size}, Owner = ${content.Owner.ID}`
);
}
if (response.IsTruncated) {
params.ContinuationToken = response.NextContinuationToken;
} else {
break;
}
}
// List Top Level Folder And Files
params.Delimiter = "/";
console.log("Top Level Folders And Files In The Bucket");
console.log("==========================");
while (true) {
let response = await S3.listObjectsV2(params).promise();
console.log(`IsTruncated = ${response.IsTruncated}`);
console.log(
`ContinuationToken = ${response.ContinuationToken ? response.ContinuationToken : null}`
);
console.log(
`NextContinuationToken = ${
response.NextContinuationToken ? response.NextContinuationToken : null
}`
);
console.log(` Folder Lists`);
for (let folder of response.CommonPrefixes) {
console.log(` Name = ${folder.Prefix}`);
}
console.log(` File Lists`);
for (let content of response.Contents) {
console.log(
` Name = ${content.Key}, Size = ${content.Size}, Owner = ${content.Owner.ID}`
);
}
if (response.IsTruncated) {
params.ContinuationToken = response.NextContinuationToken;
} else {
break;
}
}
})();
오브젝트 다운로드
const AWS = require('aws-sdk');
const fs = require('fs');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
const object_name = 'sample-object';
const local_file_path = '/tmp/test.txt';
(() => {
let outStream = fs.createWriteStream(local_file_path);
let inStream = S3.getObject({
Bucket: bucket_name,
Key: object_name
}).createReadStream();
inStream.pipe(outStream);
inStream.on('end', () => {
console.log("Download Done");
});
})();
오브젝트 삭제
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
(async () => {
// Delete Folder
let object_name = 'sample-folder/';
await S3.deleteObject({
Bucket: bucket_name,
Key: object_name
}).promise();
// Delete File
object_name = 'sample-object';
await S3.deleteObject({
Bucket: bucket_name,
Key: object_name
}).promise();
})();
ACL 설정
const AWS = require('aws-sdk');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket'
const object_name = 'sample-object'
const owner_id = 'test-owner-id'
const target_id = 'test-user-id'
(async () => {
await S3.putObjectAcl({
Bucket: bucket_name,
Key: object_name,
AccessControlPolicy: {
'Grants': [
{
'Grantee': {
'ID': owner_id,
'Type': 'CanonicalUser'
},
'Permission': 'FULL_CONTROL'
},
{
'Grantee': {
'ID': target_id,
'Type': 'CanonicalUser'
},
'Permission': 'READ'
}
],
'Owner': {
'ID': owner_id
}
}
}).promise();
})();
Multipart Upload
const AWS = require('aws-sdk');
const fs = require('fs');
const endpoint = new AWS.Endpoint('https://kr.object.fin-ncloudstorage.com');
const region = 'fin-standard';
const access_key = 'ACCESS_KEY';
const secret_key = 'SECRET_KEY';
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId : access_key,
secretAccessKey: secret_key
}
});
const bucket_name = 'sample-bucket';
const local_file_name = '/tmp/sample.file';
const object_name = 'sample-large-object';
let options = {
partSize: 5 * 1024 * 1024
};
(async () => {
await S3.upload({
Bucket: bucket_name,
Key: object_name,
Body: fs.createReadStream(local_file_name)
}, options).promise();
})();
CORS(Cross-Origin Resource Sharing) 설정
const AWS = require("aws-sdk");
const endpoint = new AWS.Endpoint("https://kr.object.fin-ncloudstorage.com");
const region = 'fin-standard';
const access_key = "<ACCESS_KEY>";
const secret_key = "<SECRET_KEY>";
const S3 = new AWS.S3({
endpoint,
region,
credentials: {
accessKeyId: access_key,
secretAccessKey: secret_key,
},
});
const bucket_name = "sample-bucket";
const params = {
Bucket: bucket_name,
CORSConfiguration: {
CORSRules: [
{
AllowedHeaders: ["*"],
AllowedMethods: ["GET", "PUT"],
AllowedOrigins: ["*"],
MaxAgeSeconds: 3000,
},
],
},
};
(async () => {
// Set CORS
await S3.putBucketCors(params).promise();
// Get CORS
const response = await S3.getBucketCors({ Bucket: bucket_name }).promise();
console.log(JSON.stringify(response, null, 2));
})();
CLI
AWS S3에서 제공하는 CLI를 이용하여 네이버 클라우드 플랫폼 Object Storage를 사용하는 방법을 설명합니다.
자세한 내용은 Object Storage CLI 사용 가이드를 참고해 주십시오.