Rust AWS SDK路由53库aws-sdk-route53的使用:轻松管理DNS服务和域名解析

Rust AWS SDK路由53库aws-sdk-route53的使用:轻松管理DNS服务和域名解析

Amazon Route 53 是一个高可用且可扩展的域名系统(DNS)网络服务。

您可以使用 Route 53 来:

  • 注册域名
  • 将互联网流量路由到您的域资源
  • 检查资源的健康状况

入门

SDK 为每个 AWS 服务提供一个 crate。您必须在 Rust 项目中添加 Tokio 作为依赖项才能执行异步代码。要将 aws-sdk-route53 添加到您的项目中,请在 Cargo.toml 文件中添加以下内容:

[dependencies]
aws-config = { version = "1.1.7", features = ["behavior-version-latest"] }
aws-sdk-route53 = "1.91.0"
tokio = { version = "1", features = ["full"] }

然后在代码中,可以使用以下方式创建客户端:

use aws_sdk_route53 as route53;

#[::tokio::main]
async fn main() -> Result<(), route53::Error> {
    let config = aws_config::load_from_env().await;
    let client = aws_sdk_route53::Client::new(&config);

    // ... 使用客户端进行一些调用

    Ok(())
}

使用 SDK

在 SDK 发布之前,我们将向开发者指南添加有关使用 SDK 的信息。如果您想为指南添加其他部分,请通过提出问题并描述您尝试做什么来提出建议。

获取帮助

  • GitHub 讨论 - 用于想法、RFC 和一般问题
  • GitHub 问题 - 用于错误报告和功能请求
  • 生成的文档(最新版本)
  • 使用示例

许可证

此项目根据 Apache-2.0 许可证授权。

完整示例代码

use aws_sdk_route53 as route53;
use route53::model::{Change, ChangeBatch, ChangeAction, ResourceRecordSet};

#[::tokio::main]
async fn main() -> Result<(), route53::Error> {
    // 从环境加载配置
    let config = aws_config::load_from_env().await;
    
    // 创建 Route 53 客户端
    let client = route53::Client::new(&config);

    // 创建 DNS 记录变更
    let change_batch = ChangeBatch::builder()
        .changes(
            Change::builder()
                .action(ChangeAction::Create)
                .resource_record_set(
                    ResourceRecordSet::builder()
                        .name("example.com.")
                        .r#type("A")
                        .ttl(300)
                        .resource_records(
                            route53::model::ResourceRecord::builder()
                                .value("192.0.2.1")
                                .build()
                        )
                        .build()
                )
                .build()
        )
        .build();

    // 执行 DNS 记录变更
    let result = client
        .change_resource_record_sets()
        .hosted_zone_id("YOUR_HOSTED_ZONE_ID") // 替换为您的托管区域ID
        .change_batch(change_batch)
        .send()
        .await?;

    println!("变更状态: {:?}", result.change_info().status());
    
    // 列出托管区域
    let hosted_zones = client.list_hosted_zones().send().await?;
    println!("托管区域: {:?}", hosted_zones.hosted_zones());

    Ok(())
}

此示例演示了如何:

  1. 创建 Route 53 客户端
  2. 构建 DNS 记录变更
  3. 执行 DNS 记录创建操作
  4. 列出所有托管区域

请确保将 YOUR_HOSTED_ZONE_ID 替换为您的实际托管区域 ID,并根据需要调整域名和 IP 地址。

完整示例代码

use aws_sdk_route53 as route53;
use route53::model::{Change, ChangeBatch, ChangeAction, ResourceRecordSet};
use std::error::Error;

#[::tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 从环境变量加载AWS配置(包括区域、凭证等)
    let config = aws_config::load_from_env().await;
    
    // 创建Route 53客户端实例
    let client = route53::Client::new(&config);

    // 示例1:创建A记录
    let change_batch = ChangeBatch::builder()
        .changes(
            Change::builder()
                .action(ChangeAction::Create)  // 创建操作
                .resource_record_set(
                    ResourceRecordSet::builder()
                        .name("api.example.com.")  // 完全限定域名
                        .r#type("A")  // 记录类型为A
                        .ttl(300)  // TTL时间(秒)
                        .resource_records(
                            route53::model::ResourceRecord::builder()
                                .value("192.0.2.100")  // IP地址
                                .build()?
                        )
                        .build()?
                )
                .build()?
        )
        .build()?;

    // 执行DNS记录变更
    let result = client
        .change_resource_record_sets()
        .hosted_zone_id("Z123456789EXAMPLE")  // 替换为实际托管区域ID
        .change_batch(change_batch)
        .send()
        .await?;

    println!("记录创建状态: {:?}", result.change_info().status());

    // 示例2:列出所有托管区域
    let hosted_zones = client.list_hosted_zones().send().await?;
    if let Some(zones) = hosted_zones.hosted_zones() {
        for zone in zones {
            println!("托管区域: {} - {}", zone.name().unwrap_or("未知"), zone.id().unwrap_or("未知"));
        }
    }

    // 示例3:查询特定托管区域的记录集
    let record_sets = client
        .list_resource_record_sets()
        .hosted_zone_id("Z123456789EXAMPLE")  // 替换为实际托管区域ID
        .send()
        .await?;

    if let Some(records) = record_sets.resource_record_sets() {
        for record in records {
            println!("记录: {:?}", record);
        }
    }

    Ok(())
}

此完整示例演示了:

  1. 配置AWS客户端并建立连接
  2. 创建DNS A记录
  3. 列出所有托管区域
  4. 查询特定托管区域的记录集
  5. 错误处理和结果输出

注意事项:

  • 确保设置正确的AWS凭证环境变量
  • 替换示例中的托管区域ID为实际值
  • 根据实际需求调整域名、记录类型和值
  • 处理可能的错误情况

1 回复

Rust AWS SDK路由53库aws-sdk-route53的使用指南

概述

aws-sdk-route53是Rust语言中用于与Amazon Route 53服务交互的官方SDK。它提供了完整的API支持,让开发者能够以类型安全的方式管理DNS记录、托管区域和域名解析配置。

安装配置

在Cargo.toml中添加依赖:

[dependencies]
aws-config = "0.55"
aws-sdk-route53 = "0.28"
tokio = { version = "1", features = ["full"] }

基本使用方法

1. 创建客户端

use aws_config::BehaviorVersion;
use aws_sdk_route53::Client;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let client = Client::new(&config);
    
    Ok(())
}

2. 列出托管区域

async fn list_hosted_zones(client: &Client) -> Result<(), Box<dyn std::error::Error>> {
    let response = client.list_hosted_zones().send().await?;
    
    for zone in response.hosted_zones.unwrap_or_default() {
        println!("Zone ID: {}, Name: {}", 
            zone.id.as_deref().unwrap_or("N/A"),
            zone.name.as_deref().unwrap_or("N/A")
        );
    }
    
    Ok(())
}

3. 创建DNS记录

use aws_sdk_route53::types::{Change, ChangeBatch, ChangeAction, ResourceRecordSet};

async fn create_dns_record(
    client: &Client,
    hosted_zone_id: &str,
    record_name: &str,
    record_type: &str,
    value: &str
) -> Result<(), Box<dyn std::error::Error>> {
    let record_set = ResourceRecordSet::builder()
        .name(record_name)
        .set_type(Some(record_type.into()))
        .ttl(300)
        .resource_records(aws_sdk_route53::types::ResourceRecord::builder()
            .value(value)
            .build())
        .build();
    
    let change = Change::builder()
        .action(ChangeAction::Create)
        .resource_record_set(record_set)
        .build();
    
    let change_batch = ChangeBatch::builder()
        .changes(change)
        .build();
    
    client.change_resource_record_sets()
        .hosted_zone_id(hosted_zone_id)
        .change_batch(change_batch)
        .send()
        .await?;
    
    println!("DNS record created successfully");
    Ok(())
}

4. 查询DNS记录

async fn list_resource_record_sets(
    client: &Client,
    hosted_zone_id: &str
) -> Result<(), Box<dyn std::error::Error>> {
    let response = client.list_resource_record_sets()
        .hosted_zone_id(hosted_zone_id)
        .send()
        .await?;
    
    for record in response.resource_record_sets.unwrap_or_default() {
        println!("Name: {}, Type: {}", 
            record.name.as_deref().unwrap_or("N/A"),
            record.set_type.as_deref().unwrap_or("N/A")
        );
    }
    
    Ok(())
}

完整示例

use aws_config::BehaviorVersion;
use aws_sdk_route53::{Client, types::{Change, ChangeBatch, ChangeAction, ResourceRecordSet}};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化客户端
    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let client = Client::new(&config);
    
    // 列出所有托管区域
    println!("Available hosted zones:");
    let zones = client.list_hosted_zones().send().await?;
    for zone in zones.hosted_zones.unwrap_or_default() {
        println!("- {} ({})", 
            zone.name.as_deref().unwrap_or("Unknown"),
            zone.id.as_deref().unwrap_or("Unknown")
        );
    }
    
    // 创建新的A记录(示例)
    // 注意:需要替换为实际的托管区域ID
    /*
    create_dns_record(
        &client,
        "Z123456789EXAMPLE",
        "example.com.",
        "A",
        "192.0.2.1"
    ).await?;
    */
    
    Ok(())
}

错误处理

use aws_sdk_route53::error::SdkError;
use aws_sdk_route53::operation::change_resource_record_sets::ChangeResourceRecordSetsError;

async fn handle_dns_operation() -> Result<(), Box<dyn std::error::Error>> {
    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let client = Client::new(&config);
    
    match client.list_hosted_zones().send().await {
        Ok(response) => {
            // 处理成功响应
            println!("Operation successful");
        }
        Err(SdkError::ServiceError(service_err)) => {
            // 处理服务错误
            eprintln!("Service error: {:?}", service_err);
        }
        Err(other_err) => {
            // 处理其他错误
            eprintln!("Other error: {:?}", other_err);
        }
    }
    
    Ok(())
}

最佳实践

  1. 异步处理:所有操作都是异步的,确保使用正确的async/await模式
  2. 错误处理:妥善处理所有可能的错误类型
  3. 资源清理:及时删除不再需要的DNS记录
  4. 批量操作:使用ChangeBatch进行多个更改的批量操作以提高效率
  5. 权限配置:确保IAM角色具有适当的Route 53权限

这个SDK提供了完整的Route 53功能支持,包括托管区域管理、记录集操作、健康检查配置等,是构建DNS管理工具的强大工具。

完整示例代码

use aws_config::BehaviorVersion;
use aws_sdk_route53::{Client, types::{Change, ChangeBatch, ChangeAction, ResourceRecordSet}};
use std::error::Error;

// 列出所有托管区域的函数
async fn list_hosted_zones(client: &Client) -> Result<(), Box<dyn Error>> {
    let response = client.list_hosted_zones().send().await?;
    
    println!("托管区域列表:");
    for zone in response.hosted_zones.unwrap_or_default() {
        println!("ID: {}, 名称: {}", 
            zone.id.as_deref().unwrap_or("N/A"),
            zone.name.as_deref().unwrap_or("N/A")
        );
    }
    
    Ok(())
}

// 创建DNS记录的函数
async fn create_dns_record(
    client: &Client,
    hosted_zone_id: &str,
    record_name: &str,
    record_type: &str,
    value: &str
) -> Result<(), Box<dyn Error>> {
    // 创建资源记录集
    let record_set = ResourceRecordSet::builder()
        .name(record_name)
        .set_type(Some(record_type.into()))
        .ttl(300)
        .resource_records(aws_sdk_route53::types::ResourceRecord::builder()
            .value(value)
            .build())
        .build();
    
    // 创建变更操作
    let change = Change::builder()
        .action(ChangeAction::Create)
        .resource_record_set(record_set)
        .build();
    
    // 创建变更批次
    let change_batch = ChangeBatch::builder()
        .changes(change)
        .build();
    
    // 执行变更操作
    client.change_resource_record_sets()
        .hosted_zone_id(hosted_zone_id)
        .change_batch(change_batch)
        .send()
        .await?;
    
    println!("DNS记录创建成功: {} -> {}", record_name, value);
    Ok(())
}

// 查询DNS记录的函数
async fn list_resource_record_sets(
    client: &Client,
    hosted_zone_id: &str
) -> Result<(), Box<dyn Error>> {
    let response = client.list_resource_record_sets()
        .hosted_zone_id(hosted_zone_id)
        .send()
        .await?;
    
    println!("DNS记录列表:");
    for record in response.resource_record_sets.unwrap_or_default() {
        println!("名称: {}, 类型: {}, TTL: {}", 
            record.name.as_deref().unwrap_or("N/A"),
            record.set_type.as_deref().unwrap_or("N/A"),
            record.ttl.unwrap_or(0)
        );
    }
    
    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // 初始化AWS配置和客户端
    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
    let client = Client::new(&config);
    
    println!("=== AWS Route 53 管理工具 ===");
    
    // 1. 列出所有托管区域
    list_hosted_zones(&client).await?;
    
    // 2. 示例:创建DNS记录(取消注释并替换实际参数后使用)
    /*
    create_dns_record(
        &client,
        "你的托管区域ID",      // 替换为实际的托管区域ID
        "test.example.com.",  // 记录名称
        "A",                  // 记录类型
        "192.168.1.100"       // 记录值
    ).await?;
    */
    
    // 3. 示例:查询特定托管区域的DNS记录(取消注释并替换实际参数后使用)
    /*
    list_resource_record_sets(
        &client,
        "你的托管区域ID"       // 替换为实际的托管区域ID
    ).await?;
    */
    
    println!("操作完成!");
    Ok(())
}
回到顶部