createSession method
Creates a session that establishes temporary security credentials to support fast authentication and authorization for the Zonal endpoint API operations on directory buckets. For more information about Zonal endpoint API operations that include the Availability Zone in the request endpoint, see S3 Express One Zone APIs in the Amazon S3 User Guide.
To make Zonal endpoint API requests on a directory bucket, use the
CreateSession API operation. Specifically, you grant
s3express:CreateSession permission to a bucket in a bucket
policy or an IAM identity-based policy. Then, you use IAM credentials to
make the CreateSession API request on the bucket, which
returns temporary security credentials that include the access key ID,
secret access key, session token, and expiration. These credentials have
associated permissions to access the Zonal endpoint API operations. After
the session is created, you don’t need to use other policies to grant
permissions to each Zonal endpoint API individually. Instead, in your
Zonal endpoint API requests, you sign your requests by applying the
temporary security credentials of the session to the request headers and
following the SigV4 protocol for authentication. You also apply the
session token to the x-amz-s3session-token request header for
authorization. Temporary security credentials are scoped to the bucket and
expire after 5 minutes. After the expiration time, any calls that you make
with those credentials will fail. You must use IAM credentials again to
make a CreateSession API request that generates a new set of
temporary credentials for use. Temporary credentials cannot be extended or
refreshed beyond the original specified interval.
If you use Amazon Web Services SDKs, SDKs handle the session token refreshes automatically to avoid service interruptions when a session expires. We recommend that you use the Amazon Web Services SDKs to initiate and manage requests to the CreateSession API. For more information, see Performance guidelines and design patterns in the Amazon S3 User Guide.
-
You must make requests for this API operation to the Zonal endpoint. These
endpoints support virtual-hosted-style requests in the format
https://bucket-name.s3express-zone-id.region-code.amazonaws.com. Path-style requests are not supported. For more information about endpoints in Availability Zones, see Regional and Zonal endpoints for directory buckets in Availability Zones in the Amazon S3 User Guide. For more information about endpoints in Local Zones, see Concepts for directory buckets in Local Zones in the Amazon S3 User Guide. -
CopyObjectAPI operation - Unlike other Zonal endpoint API operations, theCopyObjectAPI operation doesn't use the temporary security credentials returned from theCreateSessionAPI operation for authentication and authorization. For information about authentication and authorization of theCopyObjectAPI operation on directory buckets, see CopyObject. -
HeadBucketAPI operation - Unlike other Zonal endpoint API operations, theHeadBucketAPI operation doesn't use the temporary security credentials returned from theCreateSessionAPI operation for authentication and authorization. For information about authentication and authorization of theHeadBucketAPI operation on directory buckets, see HeadBucket.
- Permissions
-
To obtain temporary security credentials, you must create a bucket policy
or an IAM identity-based policy that grants
s3express:CreateSessionpermission to the bucket. In a policy, you can have thes3express:SessionModecondition key to control who can create aReadWriteorReadOnlysession. For more information aboutReadWriteorReadOnlysessions, seex-amz-create-session-mode. For example policies, see Example bucket policies for S3 Express One Zone and Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone in the Amazon S3 User Guide.To grant cross-account access to Zonal endpoint API operations, the bucket policy should also grant both accounts the
s3express:CreateSessionpermission.If you want to encrypt objects with SSE-KMS, you must also have the
kms:GenerateDataKeyand thekms:Decryptpermissions in IAM identity-based policies and KMS key policies for the target KMS key. - Encryption
-
For directory buckets, there are only two supported options for
server-side encryption: server-side encryption with Amazon S3 managed keys
(SSE-S3) (
AES256) and server-side encryption with KMS keys (SSE-KMS) (aws:kms). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in yourCreateSessionrequests orPUTobject requests. Then, new objects are automatically encrypted with the desired encryption settings. For more information, see Protecting data with server-side encryption in the Amazon S3 User Guide. For more information about the encryption overriding behaviors in directory buckets, see Specifying server-side encryption with KMS for new object uploads.For Zonal endpoint (object-level) API operations except CopyObject and UploadPartCopy, you authenticate and authorize requests through CreateSession for low latency. To encrypt new objects in a directory bucket with SSE-KMS, you must specify SSE-KMS as the directory bucket's default encryption configuration with a KMS key (specifically, a customer managed key). Then, when a session is created for Zonal endpoint API operations, new objects are automatically encrypted and decrypted with SSE-KMS and S3 Bucket Keys during the session. In the Zonal endpoint API calls (except CopyObject and UploadPartCopy) using the REST API, you can't override the values of the encryption settings (
x-amz-server-side-encryption,x-amz-server-side-encryption-aws-kms-key-id,x-amz-server-side-encryption-context, andx-amz-server-side-encryption-bucket-key-enabled) from theCreateSessionrequest. You don't need to explicitly specify these encryption settings values in Zonal endpoint API calls, and Amazon S3 will use the encryption settings values from theCreateSessionrequest to protect new objects in the directory bucket. - HTTP Host header syntax
-
Directory buckets - The HTTP Host header syntax is
Bucket-name.s3express-zone-id.region-code.amazonaws.com.
May throw NoSuchBucket.
Parameter bucket :
The name of the bucket that you create a session for.
Parameter bucketKeyEnabled :
Specifies whether Amazon S3 should use an S3 Bucket Key for object
encryption with server-side encryption using KMS keys (SSE-KMS).
S3 Bucket Keys are always enabled for GET and
PUT operations in a directory bucket and can’t be disabled.
S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects
from general purpose buckets to directory buckets, from directory buckets
to general purpose buckets, or between directory buckets, through CopyObject,
UploadPartCopy,
the
Copy operation in Batch Operations, or the
import jobs. In this case, Amazon S3 makes a call to KMS every time a
copy request is made for a KMS-encrypted object.
Parameter sSEKMSEncryptionContext :
Specifies the Amazon Web Services KMS Encryption Context as an additional
encryption context to use for object encryption. The value of this header
is a Base64 encoded string of a UTF-8 encoded JSON, which contains the
encryption context as key-value pairs. This value is stored as object
metadata and automatically gets passed on to Amazon Web Services KMS for
future GetObject operations on this object.
General purpose buckets - This value must be explicitly added
during CopyObject operations if you want an additional
encryption context for your object. For more information, see Encryption
context in the Amazon S3 User Guide.
Directory buckets - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported.
Parameter sSEKMSKeyId :
If you specify x-amz-server-side-encryption with
aws:kms, you must specify the
x-amz-server-side-encryption-aws-kms-key-id header with the ID (Key
ID or Key ARN) of the KMS symmetric encryption customer managed key to
use. Otherwise, you get an HTTP 400 Bad Request error. Only
use the key ID or key ARN. The key alias format of the KMS key isn't
supported. Also, if the KMS key doesn't exist in the same account that't
issuing the command, you must use the full Key ARN not the Key ID.
Your SSE-KMS configuration can only support 1 customer
managed key per directory bucket's lifetime. The Amazon
Web Services managed key (aws/s3) isn't supported.
Parameter serverSideEncryption :
The server-side encryption algorithm to use when you store objects in the
directory bucket.
For directory buckets, there are only two supported options for
server-side encryption: server-side encryption with Amazon S3 managed keys
(SSE-S3) (AES256) and server-side encryption with KMS keys
(SSE-KMS) (aws:kms). By default, Amazon S3 encrypts data with
SSE-S3. For more information, see Protecting
data with server-side encryption in the Amazon S3 User Guide.
S3 access points for Amazon FSx - When accessing data stored in
Amazon FSx file systems using S3 access points, the only valid server side
encryption option is aws:fsx. All Amazon FSx file systems
have encryption configured by default and are encrypted at rest. Data is
automatically encrypted before being written to the file system, and
automatically decrypted as it is read. These processes are handled
transparently by Amazon FSx.
Parameter sessionMode :
Specifies the mode of the session that will be created, either
ReadWrite or ReadOnly. If no session mode is
specified, the default behavior attempts to create a session with the
maximum allowable privilege. It will first attempt to create a
ReadWrite session, and if that is not allowed by permissions,
it will attempt to create a ReadOnly session. If neither
session type is allowed, the request will return an Access Denied error. A
ReadWrite session is capable of executing all the Zonal
endpoint API operations on a directory bucket. A ReadOnly
session is constrained to execute the following Zonal endpoint API
operations: GetObject, HeadObject,
ListObjectsV2, GetObjectAttributes,
ListParts, and ListMultipartUploads.
Implementation
Future<CreateSessionOutput> createSession({
required String bucket,
bool? bucketKeyEnabled,
String? sSEKMSEncryptionContext,
String? sSEKMSKeyId,
ServerSideEncryption? serverSideEncryption,
SessionMode? sessionMode,
}) async {
final headers = <String, String>{
if (bucketKeyEnabled != null)
'x-amz-server-side-encryption-bucket-key-enabled':
bucketKeyEnabled.toString(),
if (sSEKMSEncryptionContext != null)
'x-amz-server-side-encryption-context':
sSEKMSEncryptionContext.toString(),
if (sSEKMSKeyId != null)
'x-amz-server-side-encryption-aws-kms-key-id': sSEKMSKeyId.toString(),
if (serverSideEncryption != null)
'x-amz-server-side-encryption': serverSideEncryption.value,
if (sessionMode != null) 'x-amz-create-session-mode': sessionMode.value,
};
final $result = await _protocol.sendRaw(
method: 'GET',
requestUri: '/${Uri.encodeComponent(bucket)}?session',
headers: headers,
exceptionFnMap: _exceptionFns,
);
final $elem = await _s.xmlFromResponse($result);
return CreateSessionOutput(
credentials:
SessionCredentials.fromXml(_s.extractXmlChild($elem, 'Credentials')!),
bucketKeyEnabled: _s.extractHeaderBoolValue(
$result.headers, 'x-amz-server-side-encryption-bucket-key-enabled'),
sSEKMSEncryptionContext: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-context'),
sSEKMSKeyId: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-aws-kms-key-id'),
serverSideEncryption: _s
.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption')
?.let(ServerSideEncryption.fromString),
);
}