A pod to interact with AWS using babashka.
The API is the same as the Java/Python/Go sdks, with clojurized function name, e.g BatchGetItem
becomes batch-get-item
.
This file contains the code around receiving/sending bencoded messages from/to babashka.
Then this generates all the code to use the golang sdk. That might be a bit hacky but allows to have access to most of the AWS sdk really quickly and I believe this is relatively common in Go to get around the lack of generics.
The current release contains most of the sdk for dynamodb, s3, athena, glue, kafka, kinesis, lambda, sqs and ssm.
The code can be re-generated for other services by changing this and then running make generate
and go build
to build the new binary.
Get the latest release and then:
(require '[babashka.pods])
(babashka.pods/load-pod ["./pod-tzzh-aws"])
(require '[pod.tzzh.dynamodb :as d])
(require '[pod.tzzh.podconfig :as config]')
(require '[pod.tzzh.s3 :as s3])
(require '[pod.tzzh.glue :as g])
(require '[pod.tzzh.paginator :as p])
;; Optional
(config/set-creds {:Profile "default" :Region "us-east-1"})
(d/list-tables)
(d/batch-get-item {:RequestItems
{"AmazingTable" {:Keys [{:some-property {:S "SomeValue"}
:something-else {:S "SomethingSomething"}}]}}})
(d/batch-write-item {:RequestItems
{"AmazingTable" [{:PutRequest {:Item {:some-property {:S "abxdggje"}
:something-else {:S "zxcmbnj"}
:another-thing {:S "asdasdsa"}}}}]}})
(d/get-item {:Key {:lalala {:S "zzzzzzzz"}
:bbbbbb {:S "abxbxbxx"}}
:TableName "SomeTable"})
(d/describe-table {:TableName "SomeTable"})
(s3/list-buckets)
;; Paginators example
(let [s3-paginator (p/get-paginator s3/list-objects-v2-pages)]
(s3-paginator {:Bucket "some-bucket"
:Prefix "some-prefix/something/"}))
;; this returns a list of all the pages i.e a list of ListObjectsV2Output that are lazily fetched
(let [glue-paginator (p/get-paginator g/list-crawlers)]
(glue-paginator))
To allow for the targeting of multiple credentials an optional call to pod.tzzh.podconfig/set-session-options
will result in all subsequent function calls to use the set session option.
In the Go sdk paginators take a function argument which is called on each page and returns a boolean that tells when to stop iterating, and the paginator itself doesn't return anything.
For example the signature of ListObjectsV2Pages
is
func (c *S3) ListObjectsV2Pages(input *ListObjectsV2Input, fn func(*ListObjectsV2Output, bool) bool) error
Whereas in the Python sdk, the paginators are instead generators that lazily loads the pages.
This approach is more functional and has been copied here.
To use it you need to use the get-paginator
fn from the pod.tzzh.paginator
namespace and pass the fn you need to use as an argument to get-paginator
as shown in the example above.
The functions that use either NextContinuationToken
, NextToken
and NextMarker
to paginate can currently be paginated.
For debugging set the environment variable POD_TZZH_AWS_DEBUG=true
and the logs will show in stderr.