Glacier

Amazon also calls them "storage classes"[1]. Will call it "s3 storage class" here.

https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html

https://docs.aws.amazon.com/sdk-for-go/api/service/s3/

Can do PutObject directly to Glacier or you can use CopyObject to change the s3 storage class of an existing object from "standard" to "glacier". (The docs are unclear but I guess you copy the object to itself?)

https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-howtoset

Objects in Glacier do appear in index listing. Listing includes s3 storage class for each object.

Returns a 403 error if you try GetObject on an archived object.

Use RestoreObject to make it available for GetObject on a temporary basis (you specify number of days in the request). The s3 storage class of the object is still "glacier".

A successful [RestoreObject] operation returns either the 200 OK or 202 Accepted status code.
If the object copy is not previously restored, then Amazon S3 returns 202 Accepted in the response.
If the object copy is previously restored, Amazon S3 returns 200 OK in the response.

GetObject/HeadObject include restore status in "x-amz-restore" response header. Does not appear that listing includes restore status.

Unclear from documentation if you can use CopyObject to change the s3 storage class back to "standard" after being restored.

https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html

Use S3 Batch operation to operate on many objects at once.

[1] https://aws.amazon.com/s3/storage-classes/