AWS Elastic Beanstalk Kotlin SDK 示例:应用与环境全生命周期实战指南
发布时间:2026/9/26 15:29:32 作者:尧图编辑部 阅读量:1,286

示例工程教程后端【免费下载链接】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点击查看免费下载本指南以仓库中 kotlin/services/elasticbeanstalk 目录下的官方示例为主体系统讲解如何通过AWS SDK for Kotlin的ElasticBeanstalkClient创建、描述、配置与删除 Elastic Beanstalk 应用和环境并配套讲解基于 JUnit 5 的自动化测试方案与 Gradle 构建配置。读者学完后可以独立编写和运行一套覆盖创建 → 查询 → 删除的 Elastic Beanstalk 全生命周期管理程序并能复现仓库内的测试流程。AWS Elastic Beanstalk 是一种开箱即用的应用部署与自动扩缩服务你只需上传应用代码平台便会自动完成容量供给、负载均衡、健康检查与自动扩缩等基础设施编排。本文中的 Kotlin 示例正是用代码方式驱动这一过程的完整样例。示例总览本示例目录kotlin/services/elasticbeanstalk共包含 6 个单操作示例均基于ElasticBeanstalkClient实现示例调用的 Elastic Beanstalk 命令对应源文件创建 Elastic Beanstalk 应用CreateApplicationCreateApplication.kt创建 Elastic Beanstalk 环境CreateEnvironmentCreateEnvironment.kt删除 Elastic Beanstalk 应用DeleteApplicationDeleteApplication.kt描述 Elastic Beanstalk 应用DescribeApplicationsDescribeApplications.kt描述配置选项DescribeConfigurationOptionsDescribeConfigurationOptions.kt描述 Elastic Beanstalk 环境DescribeEnvironmentDescribeEnvironment.kt这 6 个操作按使用频率组成两条主线资源创建应用 → 环境与状态查询/清理描述应用 → 描述环境 → 描述配置 → 删除应用与仓库中的 JUnit 测试顺序完全对应。架构要点应用与环境的层级关系从源码结构看Elastic Beanstalk 的资源模型分两层应用Application逻辑容器保存应用名称、描述与版本信息本身不承载计算资源环境Environment隶属于某个应用承载实际运行的 EC2 实例、负载均衡器、自动扩缩组等基础设施每个应用可同时运行多个环境如 dev/prod。在 CreateEnvironment.kt 的请求构造中可以看到这一关系被显式表达CreateEnvironmentRequest必须同时指定applicationName与environmentName即在哪个应用下创建哪个环境。环境准备与安全须知前置条件运行示例前需完成两件事安装并配置 AWS SDK for Kotlin 开发环境包括 Kotlin 编译器、Gradle 以及 AWS 凭证。官方入门步骤参见 AWS SDK for Kotlin 开发者指南的 Get started 章节。准备 AWS 凭证与区域示例代码通过ElasticBeanstalkClient.fromEnvironment { region us-east-1 }从环境变量/凭证链读取凭证并固定使用us-east-1区域详见下文源码分析。费用与安全警告这些示例会对你凭证所对应的AWS 账户和区域执行真实操作运行可能会产生账户费用具体费用参见 AWS 定价页面运行 JUnit 测试同样可能产生费用强烈建议遵循最小权限原则仅为任务授予所需的最低权限参见 IAM 最佳实践中的 Grant least privilege本示例代码并未在所有 AWS 区域做过测试跨区域使用前请确认目标服务在该区域的可用性参见 AWS Regional Services 页面。创建应用与环境核心源码逐行解析创建应用CreateApplicationCreateApplication.kt 的命令行用法为Usage: appName Where: appName - The name of the AWS Elastic Beanstalk application.核心逻辑位于createApp函数suspend fun createApp(appName: String?): String { val applicationRequest CreateApplicationRequest { description An AWS Elastic Beanstalk app created using the AWS SDK for Kotlin applicationName appName } var tableArn: String ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - val applicationResponse beanstalkClient.createApplication(applicationRequest) tableArn applicationResponse.application?.applicationArn.toString() } return tableArn }关键点说明请求构造CreateApplicationRequest仅需applicationName必填与description可选描述。示例中描述为创建时生成的固定文案客户端创建ElasticBeanstalkClient.fromEnvironment { region us-east-1 }是 SDK for Kotlin 的标准构造方式凭证来自环境配置AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY等或共享凭证文件region通过构建器 lambda 指定资源释放.use { ... }扩展函数确保客户端在作用域结束时自动关闭底层 HTTP 连接返回值从响应applicationResponse.application?.applicationArn中提取新应用 ARN 并打印。注意此处使用了 Kotlin 空安全操作符?.当响应中缺少 application 对象时返回null字符串挂起函数createApp声明为suspend因为 SDK for Kotlin 的所有 API 调用都是基于协程的挂起函数只能在协程或main挂起函数中调用。创建环境CreateEnvironment创建环境比创建应用复杂得多因为它需要指定解决方案栈与实例配置。CreateEnvironment.kt 用法Usage: envName appName Where: envName - The name of the AWS Elastic Beanstalk environment. appName - The name of the AWS Elastic Beanstalk application.核心逻辑suspend fun createEBEnvironment( envName: String?, appName: String?, ): String { val setting1 ConfigurationOptionSetting { namespace aws:autoscaling:launchconfiguration optionName IamInstanceProfile value aws-elasticbeanstalk-ec2-role } val applicationRequest CreateEnvironmentRequest { description An AWS Elastic Beanstalk environment created using the AWS SDK for Kotlin environmentName envName solutionStackName 64bit Amazon Linux 2 v3.2.12 running Corretto 11 applicationName appName optionSettings listOf(setting1) } var envArn: String ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - val applicationResponse beanstalkClient.createEnvironment(applicationRequest) envArn applicationResponse.environmentArn.toString() } return envArn }逐参数说明solutionStackName指定平台栈示例使用64bit Amazon Linux 2 v3.2.12 running Corretto 11即基于 Amazon Linux 2、运行 Corretto 11OpenJDK 发行版的 64 位平台。该字符串需与 Elastic Beanstalk 当前支持的平台列表精确匹配否则调用会失败optionSettings通过ConfigurationOptionSetting列表注入自定义配置。示例设置了一个经典选项namespace aws:autoscaling:launchconfiguration自动扩缩启动配置命名空间optionName IamInstanceProfile指定环境中的 EC2 实例使用的 IAM 实例配置文件value aws-elasticbeanstalk-ec2-role使用 Elastic Beanstalk 默认服务角色aws-elasticbeanstalk-ec2-role该角色需提前在 IAM 中创建并附加 Beanstalk 托管策略否则环境创建可能失败返回值从applicationResponse.environmentArn提取环境 ARN。客户端构造方式对比两个创建示例都使用了ElasticBeanstalkClient.fromEnvironment { region us-east-1 }这与 DescribeApplications.kt 中直接使用ElasticBeanstalkClient { region us-east-1 }略有不同前者显式指定从环境解析配置后者使用默认配置链。二者在实际凭证解析行为上等效均可从标准 AWS 凭证链读取凭证。查询与配置描述读取 Beanstalk 状态描述应用与环境DescribeApplicationsDescribeApplications.kt 演示了一个串联查询模式先列出所有应用再针对每个应用查询其环境列表suspend fun describeApps() { ElasticBeanstalkClient { region us-east-1 }.use { beanstalkClient - val response beanstalkClient.describeApplications(DescribeApplicationsRequest {}) response.applications?.forEach { app - println(The application name is ${app.applicationName}) val desRequest DescribeEnvironmentsRequest { applicationName app.applicationName } ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - val res beanstalkClient.describeEnvironments(desRequest) res.environments?.forEach { desc - println(The environment ARN is ${desc.environmentArn}) } } } } }该示例展示了 SDK for Kotlin 的两个惯用特性空安全迭代response.applications?.forEach { ... }对可能为空的集合使用安全调用链请求过滤DescribeEnvironmentsRequest { applicationName ... }只返回指定应用下的环境配合environmentNames/environmentIds等过滤字段可精确控制返回范围。描述单个环境DescribeEnvironmentDescribeEnvironment.kt 按应用名过滤环境suspend fun describeEnv(appName: String) { val request DescribeEnvironmentsRequest { environmentNames listOf(appName) } ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - val res beanstalkClient.describeEnvironments(request) res.environments?.forEach { env - println(The environment name is ${env.environmentName}) println(The environment ARN is ${env.environmentArn}) } } }environmentNames接受一个字符串列表可一次查询多个环境。注意该示例的用法文本将参数描述为应用名称而实际请求字段为environmentNames从代码行为看它直接将该值作为环境名列表传入——运行时请传入环境名而非应用名。描述配置选项DescribeConfigurationOptionsDescribeConfigurationOptions.kt 用于查询环境的可配置项用法Usage: envName Where: envName - The name of the AWS Elastic Beanstalk environment.suspend fun getOptions(envName: String) { val spec OptionSpecification { namespace aws:ec2:instances } val request DescribeConfigurationOptionsRequest { environmentName envName options listOf(spec) } ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - val res beanstalkClient.describeConfigurationOptions(request) res.options?.forEach { option - println(The namespace is ${option.namespace}) val optionName option.name println(The name is $optionName) if (optionName ! null) { if (optionName.compareTo(InstanceTypes) 0) { val valueOptions option.valueOptions valueOptions?.forEach { value - println(The value is $value) } } } } } }关键要素OptionSpecification限定查询范围。namespace aws:ec2:instances表示只查看 EC2 实例相关的命名空间结果过滤遍历返回的配置项当option.name等于InstanceTypes时进一步枚举其valueOptions该选项允许的全部取值如t2.micro、t3.small等实例类型用法价值这类查询可用于编写自动化脚本——在创建环境前先探测某命名空间下合法的选项值避免硬编码非法配置。删除应用注意破坏性操作DeleteApplication.kt 执行的是破坏性操作会删除整个应用suspend fun deleteApp(appName: String?) { val applicationRequest DeleteApplicationRequest { applicationName appName terminateEnvByForce true } ElasticBeanstalkClient.fromEnvironment { region us-east-1 }.use { beanstalkClient - beanstalkClient.deleteApplication(applicationRequest) println(The Elastic Beanstalk application was successfully deleted!) } }重点提醒terminateEnvByForce true该参数要求同时强制终止应用下所有运行中的环境。若置为false且应用下仍有关联环境删除请求可能失败破坏性提示本示例会删除 AWS 资源运行前务必确认操作对象。建议使用独立测试专用资源进行实验避免影响生产环境从仓库测试可以看到删除前特意TimeUnit.MINUTES.sleep(5)等待 5 分钟确保环境有足够时间进入可删除状态详见下节。使用 JUnit 5 自动化测试ElasticBeanstalkTest仓库为全部 6 个操作配套了端到端测试文件 ElasticBeanstalkTest.kt基于JUnit 5与kotlinx.coroutines.runBlocking将挂起函数接入 JUnit 测试方法。测试结构与执行顺序测试类通过注解控制生命周期与顺序TestInstance(TestInstance.Lifecycle.PER_CLASS)类级别单实例允许BeforeAll非静态方法初始化TestMethodOrder(OrderAnnotation::class)配合Order(1..7)按顺序执行 7 个测试形成完整的资源生命周期。BeforeAll fun setUp() { val random Random() val randomNum random.nextInt(10000 - 1 1) 1 appName appName randomNum envName envName randomNum }setUp()为应用名/环境名追加 1~10000 的随机后缀如TestApp1234避免与既有资源冲突同时保证测试可重复执行。7 个测试用例及其断言逻辑顺序测试方法行为断言1whenInitializingAWSService_thenNotNull校验初始化appName非空2createApp创建应用返回的appArn非空3createEnvironment创建环境返回的envArn非空4describeApplications描述应用及环境无断言仅打印5describeEnvironment描述环境无断言仅打印6describeOptions查询配置选项无断言仅打印7deleteApplication先等待 5 分钟后删除应用无断言仅打印每个测试通过 SLF4J 日志输出Test N passed。例如第 3 个测试执行成功时控制台会显示Test 3 passed其中第 7 个测试的 5 分钟等待TimeUnit.MINUTES.sleep(5)是因为环境创建/终止本身耗时较长直接删除可能因环境仍处于Terminating或Updating状态而失败——这是编写 Beanstalk 集成测试时需要注意的真实时序问题。运行测试测试可从 IDE如 IntelliJ IDEA直接运行也可通过 Gradle 命令行执行gradle test构建配置见 kotlin/services/elasticbeanstalk/build.gradle.kts其中关键配置包括Kotlin/JVM 2.1.0 插件 application插件sourceCompatibility/targetCompatibility为 Java 17kotlinOptions.jvmTarget 17依赖通过 AWS SDK for Kotlin BOM 管理implementation(platform(aws.sdk.kotlin:bom:1.5.63))锁定版本随后引入aws.sdk.kotlin:elasticbeanstalk本示例核心模块与aws.sdk.kotlin:secretsmanagerHTTP 引擎aws.smithy.kotlin:http-client-engine-okhttp与http-client-engine-crt测试依赖org.junit.jupiter:junit-jupiter:5.9.2配合tasks.test { useJUnitPlatform() }启用 JUnit Platformktlint应用org.jlleitschuh.gradle.ktlint:11.3.1插件进行代码风格检查。运行测试前的必要配置config.properties仓库源码中所有代码示例都从 AWS 凭证链读取凭证且测试使用的应用名/环境名在 ElasticBeanstalkTest.kt 中由随机数自动生成因此若全部配置项齐备测试即可直接运行。原 README 提示在运行 JUnit 测试前需要在resources 文件夹的config.properties文件中定义所需值若未定义全部值JUnit 测试会失败。需要配置的键为appName- 应用的名称。envName- 环境的名称。注意在当前仓库的该目录结构中未提供现成的config.properties文件与resources目录测试代码也改为在setUp()中动态生成名称。因此实际运行时请结合本地源码版本判断若你的代码从 properties 文件读取名称则必须先补齐上述两个键若采用本仓库随机命名方案则重点确保凭证与区域配置正确即可。测试运行的注意事项会产生真实资源与费用createApplication、createEnvironment会真实创建 Beanstalk 应用与环境请确保在具备权限且预算可控的账户下运行耗时较长第 7 个测试内置 5 分钟等待整套测试预计耗时超过 5 分钟属于正常现象失败排查顺序若测试失败优先检查 ① AWS 凭证是否有效②aws-elasticbeanstalk-ec2-role等 IAM 角色是否存在③ 指定区域是否支持所用平台栈。从零到一的调用链总结综合源码一次完整的 Beanstalk 资源生命周期调用链为createApplication → createEnvironment → describeApplications → describeEnvironments → describeConfigurationOptions → deleteApplication(terminateEnvByForcetrue)SDK for Kotlin 侧的统一底座是ElasticBeanstalkClient所有请求对象CreateApplicationRequest、CreateEnvironmentRequest、DescribeEnvironmentsRequest、DeleteApplicationRequest等都通过 Kotlin 构建器 DSL 构造所有调用均为挂起函数配合.use {}自动管理客户端生命周期——这与仓库内其他 Kotlin 服务示例如 glue、dynamodb 目录保持一致的代码风格。扩展阅读本示例完整源码与构建配置kotlin/services/elasticbeanstalkAWS SDK for Kotlin 开发者指南Get started 与 setup 章节用于环境搭建与凭证配置AWS Elastic Beanstalk 开发者指南用于理解平台栈、配置命名空间与托管策略的细节。版权声明本仓库示例代码遵循 Apache-2.0 LicenseCopyright Amazon.com, Inc. or its affiliates. All Rights Reserved.。赞分享示例工程教程后端【免费下载链接】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 Java V2 操作 AWS Elastic Beanstalk 实战指南应用与环境全生命周期管理AWS SDK for Java V2 操作 AWS Elastic Beanstalk 实战指南应用与环境全生命周期管理 本文以 aws doc sdk e示例工程教程后端AWS SDK for Java V2 实战Elastic Beanstalk 应用部署与管理指南AWS SDK for Java V2 实战Elastic Beanstalk 应用部署与管理指南 概述 本文将通过 AWS SDK for Java V2示例工程教程后端AWS SDK for Kotlin 操作 Amazon ECS集群与服务全生命周期实战指南AWS SDK for Kotlin 操作 Amazon ECS集群与服务全生命周期实战指南 导读 本指南围绕 kotlin/services/ecs/REA示例工程教程后端上一篇探索蒸汽世界的神奇钥匙——ValvePython/Steam 模块下一篇如何为Awesome YouTubers贡献内容完整贡献指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考