ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 AWS SDK for Rust 操作 Amazon EC2:从 Hello World 到完整实例生命周期管理

使用 AWS SDK for Rust 操作 Amazon EC2:从 Hello World 到完整实例生命周期管理 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本文基于 AWS Code Examples 仓库中 rustv1/examples/ec2 目录下的示例代码与 README 展开系统讲解如何用 Rust 语言调用 Amazon Elastic Compute CloudAmazon EC2服务。读完本文你将掌握 EC2 客户端的初始化方式、DescribeSecurityGroups等入门调用、创建密钥对与安全组、基于 AMI 与实例类型启动实例、停止/重启实例、绑定弹性 IPElastic IP以及清理资源的完整实战流程并能直接运行仓库中的示例程序验证所学。概览示例代码的组成与定位Amazon EC2 是 AWS 提供的一种弹性计算 Web 服务提供可调整大小的计算容量即 AWS 数据中心里的服务器用于构建和托管软件系统。本仓库的 Rust 示例展示了如何使用 AWS SDK for Rust 与 EC2 服务交互代码位于 rustv1/examples/ec2 目录包含三类内容Hello Amazon EC2最小入门示例调用DescribeSecurityGroups列出当前账户的安全组。Learn the basics基础场景一个交互式场景程序完整演示实例生命周期管理。Single actions单个动作针对每个服务 API 的独立可执行程序与封装函数。示例程序依赖ec2-code-examples这个 Cargo 包其依赖清单定义在 Cargo.toml 中核心依赖包括依赖版本用途aws-config1.0.1启用behavior-version-latest加载 AWS 配置与凭证aws-sdk-ec21.3.0EC2 服务客户端aws-sdk-ssm1.40.0通过 SSM 参数获取最新 AMItokio1.20.1fullfeatures异步运行时clap4.4derive命令行参数解析tracing/tracing-subscriber0.1.40 / 0.3.17结构化日志输出inquire0.7.5交互式命令行提示reqwest0.12.5获取本机公网 IPmockall0.13.0单元测试 Mock[dependencies] aws-config { version 1.0.1, features [behavior-version-latest] } aws-sdk-ec2 { version 1.3.0 } aws-types { version 1.0.1 } tokio { version 1.20.1, features [full] } clap { version 4.4, features [derive] } tracing-subscriber { version 0.3.17, features [env-filter] } aws-sdk-ssm 1.40.0 mockall 0.13.0 inquire 0.7.5 reqwest 0.12.5环境准备与前置条件在运行示例之前需要满足以下前置条件详见 rustv1/README.md 的 Prerequisites 一节拥有一个 AWS 账户并按 AWS SDK for Rust 入门指南配置默认凭证与默认区域。安装 Cargo 构建工具通常通过rustup安装。区域与凭证的配置优先级仓库中的 CLI 示例程序如ec2-helloworld、describe-regions、create-instance等都使用统一的区域解析逻辑优先使用命令行-r/--region传入的区域其次使用AWS_REGION环境变量或默认配置链RegionProviderChain兜底默认us-west-2。凭证则通过aws_config::from_env()/load_from_env()加载支持环境变量、AWS 配置文件profile以及实例元数据服务IMDS等标准链路。日志与调试环境变量这些示例通过tracing_subscriber配合env_filter输出运行信息理解RUST_LOG变量可以更好地观察执行过程RUST_LOGinfo显示程序运行的常规输出。RUST_LOG{crate_name}debug显示每个动作的细节。RUST_LOGaws_smithy_http_tower::dispatchtrace打印每次调用 AWS SDK 的完整 HTTP 请求。RUST_LOGaws_smithy_http::middlewaretrace打印每次调用的完整 HTTP 响应。常见环境变量AWS SDK for Rust 支持大量标准环境变量常用子集包括AWS_REGION或AWS_DEFAULT_REGION指定请求发送到的区域。AWS_PROFILE指定使用哪个 AWS CLI 配置文件默认为default。AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY访问密钥与对应的秘密密钥。容器/ECS 场景AWS_CONTAINER_CREDENTIALS_FULL_URI、AWS_CONTAINER_CREDENTIALS_RELATIVE_URI、AWS_CONTAINER_AUTHORIZATION_TOKEN。EC2 实例元数据场景AWS_EC2_METADATA_DISABLED、AWS_EC2_METADATA_SERVICE_ENDPOINT、AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE。SDK 专用AWS_SDK_UA_APP_ID可在 User-Agent 头中附加应用名。如何运行示例每个示例都是一个独立的 Cargo bin统一用cargo run --bin [程序名]执行。单元测试用cargo test运行不会产生任何 AWS 变更或费用集成测试用cargo test -- --ignored运行可能产生费用。Hello Amazon EC2第一个程序入门示例 ec2-helloworld.rs 演示了最小化的 EC2 调用列出当前区域的安全组。核心逻辑如下async fn show_security_groups(client: aws_sdk_ec2::Client, group_ids: VecString) { let response client .describe_security_groups() .set_group_ids(Some(group_ids)) .send() .await; match response { Ok(output) { for group in output.security_groups() { println!( Found Security Group {} ({}), vpc id {} and description {}, group.group_name().unwrap_or(unknown), group.group_id().unwrap_or(id-unknown), group.vpc_id().unwrap_or(vpcid-unknown), group.description().unwrap_or((none)) ); } } Err(err) { let err err.into_service_error(); let meta err.meta(); let message meta.message().unwrap_or(unknown); let code meta.code().unwrap_or(unknown); eprintln!(Error listing EC2 Security Groups: ({code}) {message}); } } }运行方式cargo run --bin ec2-helloworld -- -r us-west-2 -v其中-v会额外打印 SDK 版本PKG_VERSION与所用区域。这个例子展示了 SDK for Rust 的两个通用模式链式构造请求builder后调用.send().await以及通过into_service_error()提取错误码与错误消息。基础场景完整的实例生命周期核心场景程序 getting-started.rs 将 EC2 入门 SDK 调用串成一个交互式完整流程对应的场景逻辑在 scenario.rs 中。整个场景按顺序完成以下任务创建密钥对Key Pair用于 SSH 安全连接并将私钥写入.pem文件。创建安全组Security Group作为虚拟防火墙控制出入流量。通过 SSM 参数服务挑选 Amazon Linux 2 AMI 及兼容的实例类型。用选定的 AMI、实例类型、密钥对与安全组启动实例。停止并重启实例观察公网 IP 的变化。分配弹性 IPElastic IP并与实例关联获得稳定的连接地址。打印 SSH 连接命令最后清理全部资源。场景执行入口 run() 的结构如下先调用scenario.run()执行主流程无论成败都调用scenario.clean_up()清理资源。pub async fn run(mut scenario: Ec2InstanceScenario) { println!(------------------------------------------------------------------------); println!(Welcome to the Amazon Elastic Compute Cloud (Amazon EC2) get started with instances demo.); println!(------------------------------------------------------------------------); if let Err(err) scenario.run().await { eprintln!(There was an error running the scenario: {err}) } scenario.clean_up().await; println!(Thanks for running!); }Ec2InstanceScenario聚合了密钥对、安全组、实例、弹性 IP 四个管理器以及 EC2、SSM、工具类三个依赖其主流程run()依次调用五个步骤见 scenario.rspub async fn run(mut self) - Result(), EC2Error { self.create_and_list_key_pairs().await?; self.create_security_group().await?; self.create_instance().await?; self.stop_and_start_instance().await?; self.associate_elastic_ip().await?; self.stop_and_start_instance().await?; Ok(()) }步骤 1创建密钥对并写入 .pem 私钥KeyPairManager 封装了密钥对的创建与本地持久化。创建密钥对时AWS 只在创建瞬间返回私钥材料key_material一旦丢失无法再次获取因此代码会立即将私钥以 0600 权限写入临时目录下的key_name.pem文件见 util.rs。底层 API 封装在 ec2.rs 的 create_key_pairpub async fn create_key_pair(self, name: String) - Result(KeyPairInfo, String), EC2Error { tracing::info!(Creating key pair {name}); let output self.client.create_key_pair().key_name(name).send().await?; let info KeyPairInfo::builder() .set_key_name(output.key_name) .set_key_fingerprint(output.key_fingerprint) .set_key_pair_id(output.key_pair_id) .build(); let material output .key_material .ok_or_else(|| EC2Error::new(Create Key Pair has no key material))?; Ok((info, material)) }步骤 2创建安全组并放行 SSHSecurityGroupManager 负责安全组的创建、SSH 入站授权与删除。创建时通过create_security_group拿到group_id后会再次调用describe_security_groups回查完整的安全组信息见 ec2.rs。SSH 放行规则非常谨慎安全组只允许当前运行程序这台电脑的公网 IPv4 地址以{ip}/32形式、TCP 22 端口入站见 ec2.rs 的 authorize_security_group_ssh_ingress。场景通过请求https://checkip.amazonaws.com自动获取本机公网 IP见 scenario.rs但源码注释也提醒在某些网络环境下可能需要在 AWS 控制台手动添加公网 IP。let check_ip self.util.do_get(https://checkip.amazonaws.com).await?; let current_ip_address: Ipv4Addr check_ip.trim().parse().map_err(|e| { EC2Error::new(format!( Failed to convert response {} to IP Address: {e:?}, check_ip )) })?;步骤 3选择 AMI 与实例类型场景通过 AWS Systems ManagerSSM的公共参数路径/aws/service/ami-amazon-linux-latest获取最新的 Amazon Linux 2 AMI 列表过滤出包含amzn2的参数见 scenario.rs 的 find_image。SSM 客户端封装在 ssm.rs使用分页器get_parameters_by_path().into_paginator()遍历全部参数。拿到 AMI 后list_instance_types 通过DescribeInstanceTypes按两个过滤器筛选兼容实例类型free-tier-eligiblefalse排除免费套餐不适用false的类型从而只保留满足免费套餐条件的实例类型processor-info.supported-architecture镜像架构匹配 AMI 的架构如x86_64或arm64。let free_tier_eligible_filter Filter::builder() .name(free-tier-eligible) .values(false) .build(); let supported_architecture_filter Filter::builder() .name(processor-info.supported-architecture) .values(architecture) .build();随后场景使用inquire交互式选择框让用户先后挑选 AMI 与实例类型。步骤 4启动实例并等待就绪create_instance 完整演示了启动实例的调用链let run_instances self .client .run_instances() .image_id(image_id) .instance_type(instance_type) .key_name(key_pair.key_name().ok_or_else(|| EC2Error::new(Missing key name when launching instance))?) .set_security_group_ids(Some( security_groups.iter().filter_map(|sg| sg.group_id.clone()).collect(), )) .min_count(1) .max_count(1) .send() .await?; if run_instances.instances().is_empty() { return Err(EC2Error::new(Failed to create instance)); } let instance_id run_instances.instances()[0].instance_id().unwrap();创建实例后会立即通过create_tags给实例打上NameFrom SDK Examples标签便于后续识别然后由 wait_for_instance_ready 使用 SDK 内置 Waiterwait_until_instance_status_ok等待实例状态变为ok默认最长等待 60 秒超时则抛出包含最大等待时长的WaiterError::ExceededMaxWait错误。场景中等待失败时还会询问用户是否继续等待见 scenario.rs。步骤 5停止、重启与弹性 IP停止与启动由 InstanceManager 统一管理stop()调用stop_instances后等待wait_until_instance_stoppedstart()调用start_instancesreboot()调用reboot_instances后依次等待停止与状态ok见 instance.rs。ElasticIpManager 则封装了弹性 IP 的完整生命周期allocate通过AllocateAddress在 VPC 域DomainType::Vpc分配静态公网 IPassociate用allocation_id将 IP 关联到实例remove先disassociate_address再release_address释放见 ec2.rs。场景在关联弹性 IP 前后各执行一次停止/重启用于直观演示关键差异没有弹性 IP 时实例每次重启公网 IP 都会变化绑定弹性 IP 后IP 在实例停止重启期间保持不变因此可以稳定地通过 SSH 连接见 scenario.rs。步骤 6SSH 连接与资源清理场景会实时打印 SSH 连接命令见 scenario.rs 的 display_ssh_infossh -i /tmp/key_name.pem ec2-userpublic-ipec2-user是 Amazon Linux 2 AMI 的默认登录用户。清理阶段clean_up按逆序释放先解绑并释放弹性 IP再终止实例stop_instance后调用terminate_instances并等待终止见 ec2.rs 的 delete_instance然后删除安全组最后删除密钥对并移除本地.pem文件。单个动作Single actions速查README 中列出了一系列单个动作示例及源码位置。下表整理了核心 API 与对应实现行号取自当前仓库源码动作源码位置AllocateAddressec2.rsAssociateAddressec2.rsAuthorizeSecurityGroupIngressec2.rsCreateKeyPairec2.rsCreateSecurityGroupec2.rsCreateTagsec2.rsDeleteKeyPairkey_pair.rsDeleteSecurityGroupec2.rsDeleteSnapshotEBs 示例delete-snapshot.rsDescribeImagesec2.rsDescribeInstanceStatuslist-all-instance-events.rsDescribeInstanceTypesec2.rsDescribeInstancesec2.rsDescribeKeyPairsec2.rsDescribeRegionsdescribe-regions.rsDescribeSecurityGroupsec2-helloworld.rsDescribeSnapshotsEBs 示例get-snapshot-state.rsDisassociateAddressec2.rsRebootInstancesinstance.rsReleaseAddressec2.rsRunInstancesec2.rsStartInstancesec2.rsStopInstancesec2.rsTerminateInstancesec2.rs独立可执行程序除了上述封装函数src/bin目录下还提供了可直接运行的命令行工具全部支持-r REGION与-v参数create-instance.rs用指定-a AMI_ID创建t1.micro实例打标签后用wait_until_instance_exists等待创建完成。注意它演示了 Waiter 超时的处理方式——捕获WaiterError::ExceededMaxWait后计算超出的秒数。describe-instance.rs用-i INSTANCE_ID查询实例状态不传则列出全部实例。describe-regions.rs枚举当前账户已启用的全部区域。describe-images.rs列出 Amazon 官方镜像中描述含 Amazon Linux AMI 2023 的 AMI并按描述排序。list-all-instance-events.rs遍历所有区域在每个区域重新创建客户端后调用describe_instance_status输出每个实例的维护事件Event ID、描述与事件码。start-instance.rs / stop-instance.rs / reboot-instance.rs分别演示启动、停止、重启实例并配合对应 Waiter 等待状态收敛。统一的错误处理机制所有 EC2 封装函数都返回自定义的 EC2Error。它有两个要点FromT实现把任何实现了ProvideErrorMetadata的 SDK 错误转换成错误码: 错误消息格式的字符串错误如code与message缺失时分别回退为unknown code/missing reasonadd_message方法允许调用链上逐层追加上下文例如场景中的Could not find instance types、Scenario failed to create instance便于定位错误发生在流程的哪个环节。implT: ProvideErrorMetadata FromT for EC2Error { fn from(value: T) - Self { EC2Error(format!( {}: {}, value.code().map(String::from).unwrap_or(unknown code.into()), value.message().map(String::from).unwrap_or(missing reason.into()), )) } }测试用 mockall 模拟完整场景仓库为场景代码提供了不依赖真实 AWS 环境的单元测试位于 tests/scenario_with_mocks.rs。测试通过mockall为EC2、SSM、Util三个 trait 生成 Mock见 ec2.rs 的#[cfg_attr(test, automock)]用法逐一验证场景的每个调用序列。两个测试用例分别覆盖test_happy_path完整走通创建密钥对 → 创建安全组 → 查询 AMI → 选择实例类型 → 创建实例首次等待超时后选择继续等待→ 两次停止/启动 → 分配并关联弹性 IP → 清理全部资源。test_unhappy_path_instance_takes_too_long实例等待超时且用户选择不再等待验证场景能正确终止并仍然完成资源清理。测试中还验证了一个实现细节authorize_security_group_ssh_ingress收到的 IP 必须是安全组创建时通过do_get获取到的同一个 IPmock 中固定返回192.168.0.1从而保证「只放行本机公网 IP」的链路完整闭环。运行方式cargo test运行成本与安全提示运行示例代码与测试都可能在 AWS 账户中产生费用务必注意以下几点运行代码可能产生 AWS 账户费用请参考 AWS Pricing 与 Free Tier 了解计费情况。运行测试同样可能产生费用。建议遵循最小权限原则least privilege只授予完成任务所需的最低权限相关说明见 Grant least privilege。示例代码并未在每个 AWS 区域都经过测试部分服务仅在某些区域可用请参考 AWS Regional Services。延伸阅读rustv1/README.mdSDK for Rust 示例的总体说明、运行方式与环境变量配置。rustv1/examples/ebs配套的 EBS块存储示例其中快照相关动作与 EC2 场景配合使用。本目录源码采用 Apache-2.0 许可证版权归 Amazon.com, Inc. 及其关联公司所有。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐使用 AWS SDK for Kotlin 管理 Amazon EC2从 Hello World 到完整实例生命周期场景使用 AWS SDK for Kotlin 管理 Amazon EC2从 Hello World 到完整实例生命周期场景 本文基于 aws doc sdk e示例工程教程后端使用 AWS SDK for C 操作 Amazon RDS从 Hello World 到 DB 实例全生命周期管理使用 AWS SDK for C 操作 Amazon RDS从 Hello World 到 DB 实例全生命周期管理 本文基于 cpp/example_c示例工程教程后端使用 AWS SDK for .NET 操作 Amazon RDS从 Hello 示例到实例生命周期管理实战使用 AWS SDK for .NET 操作 Amazon RDS从 Hello 示例到实例生命周期管理实战 导读 本文基于 aws doc sdk exam示例工程教程后端上一篇Czkawka 排除列表完全指南4 步把重复文件清理的扫描范围圈到最小下一篇dplyr时间序列数据处理日期时间操作的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表