关于 aws-sdk-swift-usage
aws-sdk-swift-usage 是帮助开发者使用 AWS SDK for Swift 的技能,涵盖客户端配置、凭证、异步操作及常见 API 模式。它强调采用结构体配置类型,并提供分页、等待器和预签名 URL 等示例。
主要功能
- 01异步 SDK 操作模式
- 02结构体客户端配置
- 03凭证解析器设置
- 04分页与等待器用法
- 05生成预签名 URL
适用场景
- 01创建 AWS 服务客户端
- 02为客户端指定区域和凭证
- 03分页读取 S3 对象
- 04等待资源创建完成
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ aws/ agent-toolkit-for-aws --skill aws-sdk-swift-usage安装后在 Claude Code 中输入/aws-sdk-swift-usage确认已加载。
详细介绍
AWS SDK for Swift
异步代码结构
所有 SDK 操作都是异步的。使用 @main 入口点:
@main
struct Main {
static func main() async throws {
let client = try await S3Client()
// ... async operations
}
}
重要:使用结构体配置类型
切勿使用 S3ClientConfiguration 或 DynamoDBClientConfiguration——这些是已弃用的类。
始终使用基于结构体的配置类型:
S3Client.S3ClientConfig(而不是 S3ClientConfiguration)DynamoDBClient.DynamoDBClientConfig(而不是 DynamoDBClientConfiguration)STSClient.STSClientConfig(而不是 STSClientConfiguration)
配置参数必须遵循声明顺序。创建配置时始终需要指定区域。请查看服务客户端源代码,确认确切的顺序。
// CORRECT - struct config
let config = try await S3Client.S3ClientConfig(region: "us-west-2")
let client = S3Client(config: config)
// WRONG - deprecated class
// let config = try await S3Client.S3ClientConfiguration(region: "us-west-2")
创建客户端
所有服务客户端都遵循相同模式:<Service>Client 搭配 <Service>Client.<Service>ClientConfig。
模型类型(用于请求和响应的结构体或枚举)位于 <Service>ClientTypes 命名空间下:
S3ClientTypes.Bucket、S3ClientTypes.ObjectDynamoDBClientTypes.AttributeValueCloudWatchClientTypes.MetricDatum、CloudWatchClientTypes.Dimension
import AWSS3
import AWSDynamoDB
// Simple - auto-detects region
let s3 = try await S3Client()
let dynamo = try await DynamoDBClient()
// With region
let s3 = try S3Client(region: "us-west-2")
// With config - parameters must be in declaration order
let config = try await S3Client.S3ClientConfig(
useFIPS: true,
awsRetryMode: .adaptive,
maxAttempts: 5,
region: "us-west-2"
)
let client = S3Client(config: config)
// With custom endpoint and credentials
let config = try await S3Client.S3ClientConfig(
awsCredentialIdentityResolver: resolver,
region: "us-west-2",
endpoint: "https://s3.custom-endpoint.com"
)
常见配置参数(必须遵循声明顺序):
-
awsCredentialIdentityResolver- 自定义凭证 -
useFIPS- 启用 FIPS 端点 -
useDualStack- 启用双栈端点 -
awsRetryMode- 重试策略(.adaptive、.standard、.legacy) -
maxAttempts- 最大重试次数 -
region- AWS 区域 -
httpClientEngine- 自定义 HTTP 客户端(需要 HttpClientConfiguration 参数):import ClientRuntime let httpConfig = HttpClientConfiguration() let httpClient = URLSessionHTTPClient(httpClientConfiguration: httpConfig) let config = try await S3Client.S3ClientConfig( region: "us-east-1", httpClientEngine: httpClient ) -
endpoint- 自定义端点 URL
有关服务专属配置选项或确切的参数顺序,请查看 SDK 中的 Sources/Services/AWS<Service>/Sources/AWS<Service>/<Service>Client.swift。
凭证解析器
import AWSSDKIdentity
import SmithyIdentity
// Static credentials - pass credential object directly
let creds = AWSCredentialIdentity(accessKey: "AKIA...", secret: "...")
let resolver = StaticAWSCredentialIdentityResolver(creds)
// Assume role - REQUIRES underlying resolver
let underlying = try DefaultAWSCredentialIdentityResolverChain()
let resolver = try STSAssumeRoleAWSCredentialIdentityResolver(
awsCredentialIdentityResolver: underlying,
roleArn: "arn:aws:iam::123456789012:role/MyRole",
sessionName: "session-name"
)
// Use in config
let config = try await S3Client.S3ClientConfig(
awsCredentialIdentityResolver: resolver,
region: "us-west-2"
)
等待器
导入 SmithyWaitersAPI。WaiterOptions 需要 maxWaitTime 参数:
import AWSS3
import SmithyWaitersAPI
let client = try await S3Client()
_ = try await client.waitUntilBucketExists(
options: WaiterOptions(maxWaitTime: 120.0),
input: HeadBucketInput(bucket: "my-bucket")
)
分页
let input = ListObjectsV2Input(bucket: "my-bucket")
for try await page in client.listObjectsV2Paginated(input: input) {
for object in page.contents ?? [] {
print(object.key ?? "")
}
}
预签名 URL
let url = try await client.presignedURLForGetObject(
input: GetObjectInput(bucket: "my-bucket", key: "file.pdf"),
expiration: 3600
)
常见操作
// Put object
_ = try await client.putObject(input: PutObjectInput(
body: .data(data),
bucket: "bucket",
key: "key"
))
// Get object
let output = try await client.getObject(input: GetObjectInput(bucket: "bucket", key: "key"))
let data = try await output.body?.readData()
// List buckets
let response = try await client.listBuckets(input: ListBucketsInput())
for bucket in response.buckets ?? [] {
print(bucket.name ?? "")
}