Reference:
| Legend | |
|---|---|
| π’ | Supported |
| π‘ | Partially supported |
| π΅ | Not supported yet, but will be in future |
| π΄ | Not applicable or will never be supported |
| Method | Comments | |
|---|---|---|
| π’ | CopyObject | Done on gateway side |
| π’ | DeleteObject | |
| π’ | DeleteObjects | aka DeleteMultipleObjects |
| π’ | GetObject | |
| π΄ | GetObjectTorrent | We don't plan implementing BT gateway |
| π’ | HeadObject | |
| π’ | ListParts | Parts loaded with MultipartUpload |
| π’ | ListObjects | |
| π’ | ListObjectsV2 | |
| π’ | PutObject | Content-MD5 header deprecated |
| π΅ | SelectObjectContent | Need to have some Lambda to execute SQL |
| π΅ | WriteGetObjectResponse | Waiting for Lambda to be developed |
| π’ | GetObjectAttributes |
- DeleteObjects limited by max amount of objects which can be deleted per request. See
max_object_to_delete_per_requestparameter. - For calculating object ETag, we use SHA256 hash instead of MD5.
- PutObject into a container with public-write permissions as an anonymous user (for instance, with CLI option --no-sign-request) is impossible, if try to set custom ACL for the object. It happens because container ACL rules may be changed only by container owner.
There are some limitations:
- Bucket policy supports only one
PrincipalperStatement. Principal must be"AWS": "*"or"*"(to refer all users) or"CanonicalUser": "NiskPF9pfRMzg7V7PeB4d6ogLzu74a1L2Q"(base58 encoded address of desired user).
{
"Statement": [
{
"Principal": "*"
}
]
}{
"Statement": [
{
"Principal": {
"AWS": "*"
}
}
]
}- Resource in bucket policy is a string value or array of strings. Each item MUST contain bucket name, CAN contain object name (wildcards are not supported):
{
"Statement": [
{
"Resource": "arn:aws:s3:::bucket"
}
]
}{
"Statement": [
{
"Resource": [
"arn:aws:s3:::bucket",
"arn:aws:s3:::bucket/some/object"
]
}
]
}
- Action is a string value or array of strings:
{
"Statement": [
{
"Action": "s3:PutObject"
}
]
}{
"Statement": [
{
"Action": ["s3:PutObject", "s3:PutObjectAcl"]
}
]
}- AWS conditions and wildcard are not supported in resources
- Only
CanonicalUser(with hex encoded public key) andAll Users Groupare supported in ACL.Authenticated Users groupis not supported. It is a part ofAll Users Groupand can't be separated from it. - It is not possible to remove GRANTS from container owner. Using PutObjectAcl with empty grants has no effect to GRANTS for container owner, despite method completes without error.
{
"Owner": {"DisplayName": "NiskPF9pfRMzg7V7PeB4d6ogLzu74a1L2Q","ID": "NiskPF9pfRMzg7V7PeB4d6ogLzu74a1L2Q"},
"Grants": []
}Given that ACLs are disabled by default now and users are expected to use alternative mechanisms to manage access improving ACL support is not a priority.
| Method | Comments | |
|---|---|---|
| π‘ | GetObjectAcl | See Limitations |
| π‘ | PutObjectAcl | See Limitations |
For now there are some limitations:
- Retention period can't be shortened, only extended.
- You can't delete locks or object with unexpired lock. This means PutObjectLegalHold with OFF status raise Unsupported error.
| Method | Comments | |
|---|---|---|
| π‘ | GetObjectLegalHold | |
| π’ | GetObjectLockConfiguration | GetBucketObjectLockConfig |
| π‘ | GetObjectRetention | |
| π‘ | PutObjectLegalHold | |
| π’ | PutObjectLockConfiguration | PutBucketObjectLockConfig |
| π‘ | PutObjectRetention |
| Method | Comments | |
|---|---|---|
| π’ | AbortMultipartUpload | |
| π’ | CompleteMultipartUpload | |
| π’ | CreateMultipartUpload | |
| π’ | ListMultipartUploads | |
| π’ | ListParts | |
| π’ | UploadPart | Part size, 5 MiB to 4 GiB |
| π’ | UploadPartCopy | Part size, 5 MiB to 4 GiB |
UploadPart, UploadPartCopy
According to S3 multipart upload limits, the part size must be in the 5 MiB to 5 GiB range. The gate has an additional limitation on the maximum part size, which is 4 GiB.
| Method | Comments | |
|---|---|---|
| π’ | DeleteObjectTagging | |
| π’ | GetObjectTagging | |
| π’ | PutObjectTagging |
See also GetObject and other method parameters.
| Method | Comments | |
|---|---|---|
| π’ | ListObjectVersions | ListBucketObjectVersions |
| π΅ | RestoreObject | Related to lifecycles and tiering. |
In some cases ListObjectVersions may return fewer elements than max-keys requested.
| Method | Comments | |
|---|---|---|
| π’ | CreateBucket | PutBucket |
| π’ | DeleteBucket | |
| π’ | GetBucketLocation | |
| π’ | HeadBucket | |
| π’ | ListBuckets | |
| π΅ | PutPublicAccessBlock | |
| π΅ | GetPublicAccessBlock | Related to ACL management, not a priority. |
CreateBucketmethod allows you to select a placement policy using theLocationConstraintparameter in the AWS CLI. The policy name should be passed as a value.- Policies mapping can be defined via:
- Authmate during bucket creation. These policies are available only for generated credentials.
- Gate configuration. These policies are shared and available for all gate clients.
- Example: aws s3api create-bucket --bucket $BUCKET --endpoint $S3HOST --create-bucket-configuration LocationConstraint=$POLICY_NAME
- Policies mapping can be defined via:
| Method | Comments | |
|---|---|---|
| π΄ | GetBucketAccelerateConfiguration | GetBucketAccelerate |
| π΄ | PutBucketAccelerateConfiguration |
| Method | Comments | |
|---|---|---|
| π‘ | GetBucketAcl | See ACL limitations |
| π‘ | PutBucketAcl | See ACL Limitations |
Bucket ACLs are disabled, by default. See details here. See Ownership section for details.
Requires a separate entity to generate/upload data daily.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketAnalyticsConfiguration | |
| π΅ | GetBucketAnalyticsConfiguration | |
| π΅ | ListBucketAnalyticsConfigurations | |
| π΅ | PutBucketAnalyticsConfiguration |
| Method | Comments | |
|---|---|---|
| π’ | DeleteBucketCors | |
| π’ | GetBucketCors | |
| π’ | PutBucketCors |
Methods below are related to AWS SSE-S3 and SSE-KMS encryption. S3 gateway supports SSE-C only for now.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketEncryption | |
| π΅ | GetBucketEncryption | |
| π΅ | PutBucketEncryption |
Requires a separate entity to generate/upload data regularly.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketInventoryConfiguration | |
| π΅ | GetBucketInventoryConfiguration | |
| π΅ | ListBucketInventoryConfigurations | |
| π΅ | PutBucketInventoryConfiguration |
In general requires a separate entity to manage uploaded objects. Without it can be only partially supported.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketLifecycle | |
| π‘ | GetBucketLifecycle | It always returns NoSuchLifecycleConfiguration error |
| π΅ | GetBucketLifecycleConfiguration | |
| π΅ | PutBucketLifecycle | |
| π΅ | PutBucketLifecycleConfiguration |
Doesn't make much sense in non-AWS case.
| Method | Comments | |
|---|---|---|
| π΅ | GetBucketLogging | |
| π΅ | PutBucketLogging |
Doesn't make much sense in non-AWS case.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketMetricsConfiguration | |
| π΅ | GetBucketMetricsConfiguration | |
| π΅ | ListBucketMetricsConfigurations | |
| π΅ | PutBucketMetricsConfiguration |
Can't be exactly the same as in AWS. AMQP/NATS/etc can be supported, but it's not exactly the gateway job. It also requires metadata synchronization.
| Method | Comments | |
|---|---|---|
| π΅ | GetBucketNotification | |
| π΅ | GetBucketNotificationConfiguration | |
| π΅ | ListenBucketNotification | non-standard? |
| π΅ | PutBucketNotification | |
| π΅ | PutBucketNotificationConfiguration |
| Method | Comments | |
|---|---|---|
| π’ | DeleteBucketOwnershipControls | |
| π’ | GetBucketOwnershipControls | |
| π’ | PutBucketOwnershipControls |
In case you need to disable ACLs manually (for instance your bucket has ACLs enabled) you should use PutBucketOwnershipControls command:
$ aws s3api put-bucket-ownership-controls --endpoint $S3HOST --bucket $BUCKET --ownership-controls "Rules=[{ObjectOwnership=BucketOwnerEnforced}]"Switch to Preferred mode with the next command:
$ aws s3api put-bucket-ownership-controls --endpoint $S3HOST --bucket $BUCKET --ownership-controls "Rules=[{ObjectOwnership=BucketOwnerPreferred}]"Switch to ObjectWriter mode with the next command:
$ aws s3api put-bucket-ownership-controls --endpoint $S3HOST --bucket $BUCKET --ownership-controls "Rules=[{ObjectOwnership=ObjectWriter}]"Note: ObjectWriter mode means fully enabled ACL.
Pay attention to the fact that object owner in NeoFS is bucket owner in any case.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketPolicy | |
| π΅ | DeleteBucketReplication | |
| π΅ | DeletePublicAccessBlock | |
| π‘ | GetBucketPolicy | See ACL limitations |
| π΅ | GetBucketPolicyStatus | |
| π΅ | GetBucketReplication | |
| π’ | PostPolicyBucket | Upload file using POST form |
| π‘ | PutBucketPolicy | See ACL limitations |
| π΅ | PutBucketReplication | Hardly applicable to NeoFS |
You may set requiring the bucket-owner-full-control canned ACL for Amazon S3 PUT operations (bucket owner preferred):
$ aws s3api put-bucket-policy --endpoint $S3HOST --bucket $BUCKET --policy file://policy.jsonpolicy.json:
Note that S3 gate supports only
wildcardforPrincipalparameter see ACL section for details.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Only allow writes to my bucket with bucket owner full control",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": [
"s3:PutObject"
],
"Resource": "arn:aws:s3:::$BUCKET/*",
"Condition": {
"StringEquals": {
"s3:x-amz-acl": "bucket-owner-full-control"
}
}
}
]
}| Method | Comments | |
|---|---|---|
| π΄ | GetBucketRequestPayment | |
| π΄ | PutBucketRequestPayment |
| Method | Comments | |
|---|---|---|
| π’ | DeleteBucketTagging | |
| π’ | GetBucketTagging | |
| π’ | PutBucketTagging |
Tightly related to lifecycle support.
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketIntelligentTieringConfiguration | |
| π΅ | GetBucketIntelligentTieringConfiguration | |
| π΅ | ListBucketIntelligentTieringConfigurations | |
| π΅ | PutBucketIntelligentTieringConfiguration |
| Method | Comments | |
|---|---|---|
| π’ | GetBucketVersioning | |
| π’ | PutBucketVersioning |
| Method | Comments | |
|---|---|---|
| π΅ | DeleteBucketWebsite | |
| π΅ | GetBucketWebsite | |
| π΅ | PutBucketWebsite |
Each meta parameter value must be non-empty. If any parameter value is an empty, then "Your metadata headers are not supported." error will be returned on the object put operation.