mcpField
A
aws-sdk-swift-usage

aws-sdk-swift-usage

github.com/aws开发3.3k6.6k 次安装1 天前更新
代码仓库

关于 aws-sdk-swift-usage

aws-sdk-swift-usage 是帮助开发者使用 AWS SDK for Swift 的技能,涵盖客户端配置、凭证、异步操作及常见 API 模式。它强调采用结构体配置类型,并提供分页、等待器和预签名 URL 等示例。

主要功能

  1. 01异步 SDK 操作模式
  2. 02结构体客户端配置
  3. 03凭证解析器设置
  4. 04分页与等待器用法
  5. 05生成预签名 URL

适用场景

  1. 01创建 AWS 服务客户端
  2. 02为客户端指定区域和凭证
  3. 03分页读取 S3 对象
  4. 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.Object
  • DynamoDBClientTypes.AttributeValue
  • CloudWatchClientTypes.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 ?? "")
}

评论

支持 Markdown