Soto is a Swift language SDK for Amazon Web Services (AWS), working on Linux, macOS and iOS. This library provides access to all AWS services. The service APIs it provides are a direct mapping of the REST APIs Amazon publishes for each of its services. Soto is a community supported project and is in no way affiliated with AWS.
The library consists of three parts
Soto uses the Swift Package Manager to manage its code dependencies. To use Soto in your codebase it is recommended you do the same. Add a dependency to the package in your own Package.swift dependencies.
dependencies: [
.package(url: "https://github.com/soto-project/soto.git", from: "6.0.0")
],
Then add target dependencies for each of the Soto targets you want to use.
targets: [
.target(name: "MyApp", dependencies: [
.product(name: "SotoS3", package: "soto"),
.product(name: "SotoSES", package: "soto"),
.product(name: "SotoIAM", package: "soto")
]),
]
)
Alternatively if you are using Xcode 11 or later you can use the Swift Package Manager integration and add a dependency to Soto through that.
Soto works on Linux, macOS and iOS. It requires v2.0 of Swift NIO. Below is a compatibility table for different Soto versions.
Version | Swift | MacOS | iOS | Linux | Vapor |
---|---|---|---|---|---|
6.x | 5.4 - | ✓ | 12.0 - | Ubuntu 18.04-22.04 | 4.0 |
5.x | 5.2 - | ✓ | 12.0 - | Ubuntu 18.04-20.04 | 4.0 |
Before using the SDK, you will need AWS credentials to sign all your requests. Credentials can be provided to the library in the following ways.
AWS_ACCESS_KEY_ID
and AWS_SECRET_ACCESS_KEY
You can find out more about credential providers here
To use Soto you need to create an AWSClient
and a service object for the AWS service you want to work with. The AWSClient
provides all the communication with AWS and the service object provides the configuration and APIs for communicating with a specific AWS service. More can be found out about AWSClient
here and the AWS service objects here.
Each Soto command returns a Swift NIO EventLoopFuture
. An EventLoopFuture
is not the response of the command, but rather a container object that will be populated with the response at a later point. In this manner calls to AWS do not block the main thread. It is recommended you familiarise yourself with the Swift NIO documentation, specifically EventLoopFuture if you want to take full advantage of Soto.
The recommended manner to interact with EventLoopFutures
is chaining. The following function returns an EventLoopFuture
that creates an S3 bucket, puts a file in the bucket, reads the file back from the bucket and finally prints the contents of the file. Each of these operations are chained together. The output of one being the input of the next.
import SotoS3 //ensure this module is specified as a dependency in your package.swift
let bucket = "my-bucket"
let client = AWSClient(
credentialProvider: .static(accessKeyId: "Your-Access-Key", secretAccessKey: "Your-Secret-Key"),
httpClientProvider: .createNew
)
let s3 = S3(client: client, region: .uswest2)
func createBucketPutGetObject() async throws -> S3.GetObjectOutput {
// Create Bucket, Put an Object, Get the Object
let createBucketRequest = S3.CreateBucketRequest(bucket: bucket)
_ = try await s3.createBucket(createBucketRequest)
// Upload text file to the s3
let bodyData = "hello world"
let putObjectRequest = S3.PutObjectRequest(
acl: .publicRead,
body: .string(bodyData),
bucket: bucket,
key: "hello.txt"
)
_ = try await s3.putObject(putObjectRequest)
// download text file just uploaded to S3
let getObjectRequest = S3.GetObjectRequest(bucket: bucket, key: "hello.txt")
let response = try await s3.getObject(getObjectRequest)
// print contents of response
if let body = response.body?.asString() {
print(body)
}
return response
}
Soto is a vary large package. If you would rather not include it in your package dependencies you can instead use the SotoCodeGenerator Swift Package Manager build plugin to generate the Swift source code for only the services/operations you actually need. Find out more here.
Visit soto.codes to browse the user guides and api reference. As there is a one-to-one correspondence with AWS REST api calls and the Soto api calls, you can also use the official AWS documentation for more detailed information about AWS commands.
Additional user guides for specific elements of Soto are available
We welcome and encourage contributions from all developers. Please read CONTRIBUTING.md for our contributing guidelines.
Soto is released under the Apache License, Version 2.0. See LICENSE for details.
Support development of Soto by becoming a backer
link |
Stars: 830 |
Last commit: 3 days ago |
Using SotoCore 7.0.0-alpha.1
EventLoop
based APIs have been removed.AWSPayload
with AWSHTTPBody
which can be either a single ByteBuffer
or a stream of ByteBuffers
to store request and response payloads.ResponseDecodingContainer
which holds details of raw response to decoder.RequestEncodingContainer
which holds reference to raw request to encoder.AWSMiddlewareProtocol
replaces AWSServiceMiddleware
, added AWSMiddlewareStack
result builder.AWSTracingMiddleware
to add basic tracing support to Soto calls.Swiftpack is being maintained by Petr Pavlik | @ptrpavlik | @swiftpackco | API | Analytics