service/s3/api_op_RestoreObject.go (220 lines of code) (raw):
// Code generated by smithy-go-codegen DO NOT EDIT.
package s3
import (
"context"
"fmt"
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
"github.com/aws/aws-sdk-go-v2/aws/signer/v4"
internalChecksum "github.com/aws/aws-sdk-go-v2/service/internal/checksum"
s3cust "github.com/aws/aws-sdk-go-v2/service/s3/internal/customizations"
"github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/aws/smithy-go/middleware"
smithyhttp "github.com/aws/smithy-go/transport/http"
)
// This operation is not supported for directory buckets.
//
// # Restores an archived copy of an object back into Amazon S3
//
// This functionality is not supported for Amazon S3 on Outposts.
//
// This action performs the following types of requests:
//
// - restore an archive - Restore an archived object
//
// For more information about the S3 structure in the request body, see the
// following:
//
// [PutObject]
//
// [Managing Access with ACLs]
// - in the Amazon S3 User Guide
//
// [Protecting Data Using Server-Side Encryption]
// - in the Amazon S3 User Guide
//
// Permissions To use this operation, you must have permissions to perform the
// s3:RestoreObject action. The bucket owner has this permission by default and can
// grant this permission to others. For more information about permissions, see [Permissions Related to Bucket Subresource Operations]
// and [Managing Access Permissions to Your Amazon S3 Resources]in the Amazon S3 User Guide.
//
// Restoring objects Objects that you archive to the S3 Glacier Flexible Retrieval
// or S3 Glacier Deep Archive storage class, and S3 Intelligent-Tiering Archive or
// S3 Intelligent-Tiering Deep Archive tiers, are not accessible in real time. For
// objects in the S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive storage
// classes, you must first initiate a restore request, and then wait until a
// temporary copy of the object is available. If you want a permanent copy of the
// object, create a copy of it in the Amazon S3 Standard storage class in your S3
// bucket. To access an archived object, you must restore the object for the
// duration (number of days) that you specify. For objects in the Archive Access or
// Deep Archive Access tiers of S3 Intelligent-Tiering, you must first initiate a
// restore request, and then wait until the object is moved into the Frequent
// Access tier.
//
// To restore a specific object version, you can provide a version ID. If you
// don't provide a version ID, Amazon S3 restores the current version.
//
// When restoring an archived object, you can specify one of the following data
// access tier options in the Tier element of the request body:
//
// - Expedited - Expedited retrievals allow you to quickly access your data
// stored in the S3 Glacier Flexible Retrieval storage class or S3
// Intelligent-Tiering Archive tier when occasional urgent requests for restoring
// archives are required. For all but the largest archived objects (250 MB+), data
// accessed using Expedited retrievals is typically made available within 1–5
// minutes. Provisioned capacity ensures that retrieval capacity for Expedited
// retrievals is available when you need it. Expedited retrievals and provisioned
// capacity are not available for objects stored in the S3 Glacier Deep Archive
// storage class or S3 Intelligent-Tiering Deep Archive tier.
//
// - Standard - Standard retrievals allow you to access any of your archived
// objects within several hours. This is the default option for retrieval requests
// that do not specify the retrieval option. Standard retrievals typically finish
// within 3–5 hours for objects stored in the S3 Glacier Flexible Retrieval storage
// class or S3 Intelligent-Tiering Archive tier. They typically finish within 12
// hours for objects stored in the S3 Glacier Deep Archive storage class or S3
// Intelligent-Tiering Deep Archive tier. Standard retrievals are free for objects
// stored in S3 Intelligent-Tiering.
//
// - Bulk - Bulk retrievals free for objects stored in the S3 Glacier Flexible
// Retrieval and S3 Intelligent-Tiering storage classes, enabling you to retrieve
// large amounts, even petabytes, of data at no cost. Bulk retrievals typically
// finish within 5–12 hours for objects stored in the S3 Glacier Flexible Retrieval
// storage class or S3 Intelligent-Tiering Archive tier. Bulk retrievals are also
// the lowest-cost retrieval option when restoring objects from S3 Glacier Deep
// Archive. They typically finish within 48 hours for objects stored in the S3
// Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive tier.
//
// For more information about archive retrieval options and provisioned capacity
// for Expedited data access, see [Restoring Archived Objects] in the Amazon S3 User Guide.
//
// You can use Amazon S3 restore speed upgrade to change the restore speed to a
// faster speed while it is in progress. For more information, see [Upgrading the speed of an in-progress restore]in the Amazon
// S3 User Guide.
//
// To get the status of object restoration, you can send a HEAD request.
// Operations return the x-amz-restore header, which provides information about
// the restoration status, in the response. You can use Amazon S3 event
// notifications to notify you when a restore is initiated or completed. For more
// information, see [Configuring Amazon S3 Event Notifications]in the Amazon S3 User Guide.
//
// After restoring an archived object, you can update the restoration period by
// reissuing the request with a new period. Amazon S3 updates the restoration
// period relative to the current time and charges only for the request-there are
// no data transfer charges. You cannot update the restoration period when Amazon
// S3 is actively processing your current restore request for the object.
//
// If your bucket has a lifecycle configuration with a rule that includes an
// expiration action, the object expiration overrides the life span that you
// specify in a restore request. For example, if you restore an object copy for 10
// days, but the object is scheduled to expire in 3 days, Amazon S3 deletes the
// object in 3 days. For more information about lifecycle configuration, see [PutBucketLifecycleConfiguration]and [Object Lifecycle Management]
// in Amazon S3 User Guide.
//
// Responses A successful action returns either the 200 OK or 202 Accepted status
// code.
//
// - If the object is not previously restored, then Amazon S3 returns 202
// Accepted in the response.
//
// - If the object is previously restored, Amazon S3 returns 200 OK in the
// response.
//
// - Special errors:
//
// - Code: RestoreAlreadyInProgress
//
// - Cause: Object restore is already in progress.
//
// - HTTP Status Code: 409 Conflict
//
// - SOAP Fault Code Prefix: Client
//
// - Code: GlacierExpeditedRetrievalNotAvailable
//
// - Cause: expedited retrievals are currently not available. Try again later.
// (Returned if there is insufficient capacity to process the Expedited request.
// This error applies only to Expedited retrievals and not to S3 Standard or Bulk
// retrievals.)
//
// - HTTP Status Code: 503
//
// - SOAP Fault Code Prefix: N/A
//
// The following operations are related to RestoreObject :
//
// [PutBucketLifecycleConfiguration]
//
// [GetBucketNotificationConfiguration]
//
// [PutBucketLifecycleConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html
// [Object Lifecycle Management]: https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html
// [Permissions Related to Bucket Subresource Operations]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources
// [Configuring Amazon S3 Event Notifications]: https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html
// [Managing Access with ACLs]: https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html
// [Protecting Data Using Server-Side Encryption]: https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html
// [GetBucketNotificationConfiguration]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html
// [PutObject]: https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html
// [Restoring Archived Objects]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html
// [Managing Access Permissions to Your Amazon S3 Resources]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html
// [Upgrading the speed of an in-progress restore]: https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html#restoring-objects-upgrade-tier.title.html
func (c *Client) RestoreObject(ctx context.Context, params *RestoreObjectInput, optFns ...func(*Options)) (*RestoreObjectOutput, error) {
if params == nil {
params = &RestoreObjectInput{}
}
result, metadata, err := c.invokeOperation(ctx, "RestoreObject", params, optFns, c.addOperationRestoreObjectMiddlewares)
if err != nil {
return nil, err
}
out := result.(*RestoreObjectOutput)
out.ResultMetadata = metadata
return out, nil
}
type RestoreObjectInput struct {
// The bucket name containing the object to restore.
//
// Access points - When you use this action with an access point for general
// purpose buckets, you must provide the alias of the access point in place of the
// bucket name or specify the access point ARN. When you use this action with an
// access point for directory buckets, you must provide the access point name in
// place of the bucket name. When using the access point ARN, you must direct
// requests to the access point hostname. The access point hostname takes the form
// AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com. When using this
// action with an access point through the Amazon Web Services SDKs, you provide
// the access point ARN in place of the bucket name. For more information about
// access point ARNs, see [Using access points]in the Amazon S3 User Guide.
//
// S3 on Outposts - When you use this action with S3 on Outposts, you must direct
// requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the
// form AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com . When
// you use this action with S3 on Outposts, the destination bucket must be the
// Outposts access point ARN or the access point alias. For more information about
// S3 on Outposts, see [What is S3 on Outposts?]in the Amazon S3 User Guide.
//
// [What is S3 on Outposts?]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html
// [Using access points]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html
//
// This member is required.
Bucket *string
// Object key for which the action was initiated.
//
// This member is required.
Key *string
// Indicates the algorithm used to create the checksum for the object when you use
// the SDK. This header will not provide any additional functionality if you don't
// use the SDK. When you send this header, there must be a corresponding
// x-amz-checksum or x-amz-trailer header sent. Otherwise, Amazon S3 fails the
// request with the HTTP status code 400 Bad Request . For more information, see [Checking object integrity]
// in the Amazon S3 User Guide.
//
// If you provide an individual checksum, Amazon S3 ignores any provided
// ChecksumAlgorithm parameter.
//
// [Checking object integrity]: https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html
ChecksumAlgorithm types.ChecksumAlgorithm
// The account ID of the expected bucket owner. If the account ID that you provide
// does not match the actual owner of the bucket, the request fails with the HTTP
// status code 403 Forbidden (access denied).
ExpectedBucketOwner *string
// Confirms that the requester knows that they will be charged for the request.
// Bucket owners need not specify this parameter in their requests. If either the
// source or destination S3 bucket has Requester Pays enabled, the requester will
// pay for corresponding charges to copy the object. For information about
// downloading objects from Requester Pays buckets, see [Downloading Objects in Requester Pays Buckets]in the Amazon S3 User
// Guide.
//
// This functionality is not supported for directory buckets.
//
// [Downloading Objects in Requester Pays Buckets]: https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html
RequestPayer types.RequestPayer
// Container for restore job parameters.
RestoreRequest *types.RestoreRequest
// VersionId used to reference a specific version of the object.
VersionId *string
noSmithyDocumentSerde
}
func (in *RestoreObjectInput) bindEndpointParams(p *EndpointParameters) {
p.Bucket = in.Bucket
}
type RestoreObjectOutput struct {
// If present, indicates that the requester was successfully charged for the
// request.
//
// This functionality is not supported for directory buckets.
RequestCharged types.RequestCharged
// Indicates the path in the provided S3 output location where Select results will
// be restored to.
RestoreOutputPath *string
// Metadata pertaining to the operation's result.
ResultMetadata middleware.Metadata
noSmithyDocumentSerde
}
func (c *Client) addOperationRestoreObjectMiddlewares(stack *middleware.Stack, options Options) (err error) {
if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil {
return err
}
err = stack.Serialize.Add(&awsRestxml_serializeOpRestoreObject{}, middleware.After)
if err != nil {
return err
}
err = stack.Deserialize.Add(&awsRestxml_deserializeOpRestoreObject{}, middleware.After)
if err != nil {
return err
}
if err := addProtocolFinalizerMiddlewares(stack, options, "RestoreObject"); err != nil {
return fmt.Errorf("add protocol finalizers: %v", err)
}
if err = addlegacyEndpointContextSetter(stack, options); err != nil {
return err
}
if err = addSetLoggerMiddleware(stack, options); err != nil {
return err
}
if err = addClientRequestID(stack); err != nil {
return err
}
if err = addComputeContentLength(stack); err != nil {
return err
}
if err = addResolveEndpointMiddleware(stack, options); err != nil {
return err
}
if err = addComputePayloadSHA256(stack); err != nil {
return err
}
if err = addRetry(stack, options); err != nil {
return err
}
if err = addRawResponseToMetadata(stack); err != nil {
return err
}
if err = addRecordResponseTiming(stack); err != nil {
return err
}
if err = addSpanRetryLoop(stack, options); err != nil {
return err
}
if err = addClientUserAgent(stack, options); err != nil {
return err
}
if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil {
return err
}
if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil {
return err
}
if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil {
return err
}
if err = addPutBucketContextMiddleware(stack); err != nil {
return err
}
if err = addTimeOffsetBuild(stack, c); err != nil {
return err
}
if err = addUserAgentRetryMode(stack, options); err != nil {
return err
}
if err = addIsExpressUserAgent(stack); err != nil {
return err
}
if err = addRequestChecksumMetricsTracking(stack, options); err != nil {
return err
}
if err = addCredentialSource(stack, options); err != nil {
return err
}
if err = addOpRestoreObjectValidationMiddleware(stack); err != nil {
return err
}
if err = stack.Initialize.Add(newServiceMetadataMiddleware_opRestoreObject(options.Region), middleware.Before); err != nil {
return err
}
if err = addMetadataRetrieverMiddleware(stack); err != nil {
return err
}
if err = addRecursionDetection(stack); err != nil {
return err
}
if err = addRestoreObjectInputChecksumMiddlewares(stack, options); err != nil {
return err
}
if err = addRestoreObjectUpdateEndpoint(stack, options); err != nil {
return err
}
if err = addResponseErrorMiddleware(stack); err != nil {
return err
}
if err = v4.AddContentSHA256HeaderMiddleware(stack); err != nil {
return err
}
if err = disableAcceptEncodingGzip(stack); err != nil {
return err
}
if err = addRequestResponseLogging(stack, options); err != nil {
return err
}
if err = addDisableHTTPSMiddleware(stack, options); err != nil {
return err
}
if err = addSerializeImmutableHostnameBucketMiddleware(stack, options); err != nil {
return err
}
if err = addSpanInitializeStart(stack); err != nil {
return err
}
if err = addSpanInitializeEnd(stack); err != nil {
return err
}
if err = addSpanBuildRequestStart(stack); err != nil {
return err
}
if err = addSpanBuildRequestEnd(stack); err != nil {
return err
}
return nil
}
func (v *RestoreObjectInput) bucket() (string, bool) {
if v.Bucket == nil {
return "", false
}
return *v.Bucket, true
}
func newServiceMetadataMiddleware_opRestoreObject(region string) *awsmiddleware.RegisterServiceMetadata {
return &awsmiddleware.RegisterServiceMetadata{
Region: region,
ServiceID: ServiceID,
OperationName: "RestoreObject",
}
}
// getRestoreObjectRequestAlgorithmMember gets the request checksum algorithm
// value provided as input.
func getRestoreObjectRequestAlgorithmMember(input interface{}) (string, bool) {
in := input.(*RestoreObjectInput)
if len(in.ChecksumAlgorithm) == 0 {
return "", false
}
return string(in.ChecksumAlgorithm), true
}
func addRestoreObjectInputChecksumMiddlewares(stack *middleware.Stack, options Options) error {
return addInputChecksumMiddleware(stack, internalChecksum.InputMiddlewareOptions{
GetAlgorithm: getRestoreObjectRequestAlgorithmMember,
RequireChecksum: false,
RequestChecksumCalculation: options.RequestChecksumCalculation,
EnableTrailingChecksum: false,
EnableComputeSHA256PayloadHash: true,
EnableDecodedContentLengthHeader: true,
})
}
// getRestoreObjectBucketMember returns a pointer to string denoting a provided
// bucket member valueand a boolean indicating if the input has a modeled bucket
// name,
func getRestoreObjectBucketMember(input interface{}) (*string, bool) {
in := input.(*RestoreObjectInput)
if in.Bucket == nil {
return nil, false
}
return in.Bucket, true
}
func addRestoreObjectUpdateEndpoint(stack *middleware.Stack, options Options) error {
return s3cust.UpdateEndpoint(stack, s3cust.UpdateEndpointOptions{
Accessor: s3cust.UpdateEndpointParameterAccessor{
GetBucketFromInput: getRestoreObjectBucketMember,
},
UsePathStyle: options.UsePathStyle,
UseAccelerate: options.UseAccelerate,
SupportsAccelerate: true,
TargetS3ObjectLambda: false,
EndpointResolver: options.EndpointResolver,
EndpointResolverOptions: options.EndpointOptions,
UseARNRegion: options.UseARNRegion,
DisableMultiRegionAccessPoints: options.DisableMultiRegionAccessPoints,
})
}