-
Notifications
You must be signed in to change notification settings - Fork 0
/
s3.clj
55 lines (49 loc) · 2.15 KB
/
s3.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(ns clj-sqs-extended.aws.s3
(:require [clj-sqs-extended.aws.configuration :as aws])
(:import [com.amazonaws.services.s3 AmazonS3ClientBuilder]
[com.amazonaws.services.s3.model
BucketLifecycleConfiguration
BucketLifecycleConfiguration$Rule
ListVersionsRequest]))
(defn s3-client
[sqs-ext-config]
(let [endpoint (aws/configure-s3-endpoint sqs-ext-config)
creds (aws/configure-credentials sqs-ext-config)
builder (-> (AmazonS3ClientBuilder/standard)
(.withPathStyleAccessEnabled true))
builder (if endpoint (.withEndpointConfiguration builder endpoint) builder)
builder (if creds (.withCredentials builder creds) builder)]
(.build builder)))
(defn configure-bucket-lifecycle
[status expiration-days]
(let [expiration (-> (BucketLifecycleConfiguration$Rule.)
(.withStatus status)
(.withExpirationInDays expiration-days))]
(.withRules (BucketLifecycleConfiguration.) [expiration])))
(defn create-bucket!
([s3-client name]
(create-bucket! s3-client name (configure-bucket-lifecycle "Enabled" 14)))
([s3-client name lifecycle]
(doto s3-client
(.createBucket name)
(.setBucketLifecycleConfiguration name lifecycle))
name))
(defn purge-bucket!
[s3-client bucket-name]
(letfn [(delete-objects [objects]
(doseq [o objects]
(let [key (.getKey o)]
(.deleteObject s3-client bucket-name key))))
(delete-object-versions [versions]
(doseq [v versions]
(let [key (.getKey v)
id (.getVersionId v)]
(.deleteVersion s3-client bucket-name key id))))]
(loop [objects (.listObjects s3-client bucket-name)]
(delete-objects (.getObjectSummaries objects))
(when (.isTruncated objects)
(recur (.listNextBatchOfObjects objects))))
(let [version-request (-> (ListVersionsRequest.) (.withBucketName bucket-name))
versions (->> (.listVersions s3-client version-request) (.getVersionSummaries))]
(delete-object-versions versions))
(.deleteBucket s3-client bucket-name)))