Amazon Elastic Beanstalk 现已与 Amazon Secrets Manager 和 Systems Manager 参数存储区集成

作者: Sakthi Chellapparimanam |

Amazon Elastic Beanstalk 为 Web 应用程序和服务提供部署和管理功能。Elastic Beanstalk 服务可处理包括负载平衡、扩展和监控在内的操作任务,而用户则专注于其应用程序代码。

Elastic Beanstalk 允许应用程序通过环境属性中的键值对访问配置数据。但是,这种方法有一定的局限性——环境变量限制在 4096 字节以内,以纯文本形式存储,并且缺少内置加密。这些限制可能会影响客户管理凭证和 API 密钥等敏感数据的方式。

一些客户选择 EB 扩展来获取机密和配置,使其作为环境变量的一部分可供应用程序使用。但这是客户需要在应用程序存档文件中开发、管理和打包的另一段代码,如果 Elastic Beanstalk 本机提供这种支持,则可以避免这种情况。当配置或密钥发生变化时,即使没有更改应用程序代码,客户也需要使用新的应用程序包执行应用程序部署。

Amazon Elastic Beanstalk 现在提供与 Amazon Secrets Manager 和 Amazon Systems Manager (SSM) 参数存储(参数存储)的集成,用于配置管理。这种集成使应用程序能够通过环境变量访问存储的参数。在这篇文章中,我们将使用示例应用程序探讨三种不同的配置选项。

概述

本演示探讨了 .NET 8 MVC 应用程序中的配置管理技术,实现了三个不同的配置源:

1. 使用 Elastic Beanstalk 现有键值功能的标准环境变量

2. 配置参数保存在参数存储库中

3. 存储在密钥管理器中的安全凭证

该应用程序通过检索和显示来自这些来源的值来演示集成能力。这种方法展示了现代应用程序如何利用传统环境变量和 Amazon Elastic Beanstalk 的高级功能来实现强大的配置管理。

图 1:引用参数存储和密钥管理器的 Elastic Beanstalk 应用程序

图 1:引用参数存储和密钥管理器的 Elastic Beanstalk 应用程序

先决条件

在本演练中,您应该具备以下先决条件:

  • 活跃的亚马逊云科技账户
  • 具有创建和管理亚马逊云科技资源权限的用户,包括:
    • Elastic Beanstalk
    • IAM 角色
    • Amazon Systems Manager 参数存储库
    • Amazon Secrets Manager
  • Visual Studio 已安装在您的开发计算机上
  • Visual Studio 的亚马逊云科技工具包已安装和配置
  • 熟悉 Elastic Beanstalk 服务

步骤 1:创建 .NET 应用程序和环境

使用《Elastic Beanstalk 开发者指南》的 "Elastic Beanstalk 入门" 部分,创建一个以 64 位亚马逊 Linux 2023 上运行的 .NET 8 为平台的示例应用程序。

图 2:查看 Amazon Elastic Beanstalk .NET 应用程序配置

图 2:查看 Elastic Beanstalk .NET 应用程序配置

步骤 2:部署 .NET 应用程序

在此步骤中,您将把 .NET MVC 应用程序部署到 Amazon Elastic Beanstalk。

  1. 创建新的 ASP.NET Core Web 应用程序
  2. 选择模型视图控制器模板并将 .NET 8.0 作为目标。
  3. 右键单击该项目并选择 "发布到亚马逊云科技"。
  4. 选择 "发布到现有目标 — 在步骤 1 中创建的应用程序环境入门"。
  5. 选择域终端节点并加载该站点。
图 3:.NET MVC 应用程序部署到 Elastic Beanstalk 环境中

图 3:.NET MVC 应用程序部署到 Elastic Beanstalk 环境中

步骤 3:部署新版本的应用程序

接下来,修改索引页以检索环境变量并将其部署到 Elastic Beanstalk 以演示不同的环境类型。

  1. 将中的Views/Home/Index.cshtml代码替换为以下代码:
@{
    ViewData["Title"] = "Home Page";

    var PLAIN_TEXT = Environment.GetEnvironmentVariable("PLAIN_TEXT") ?? "Not Available";
    var PARAM_STORE = Environment.GetEnvironmentVariable("PARAM_STORE") ?? "Not Available";
    var SECRET_VALUE = Environment.GetEnvironmentVariable("SECRET_VALUE") ?? "Not Available";

}

<div class="text-center">
    <h1 class="display-4">Environment Variable - Demo</h1>
    <h2>Source - Plaintext</h2>
    <p>Value of Plaintext - ENV is: @PLAIN_TEXT</p>
    <h2>Source - Param Store</h2>
    <p>Value of Param Store - ENV is: @PARAM_STORE</p>
    <h2>Source - Secret Store</h2>
    <p>Value of Param Store - ENV is: @SECRET_VALUE</p>
</div>
  1. 右键单击该项目并选择 "发布到亚马逊云科技"。
  2. 单击域端点并加载该站点。

应用程序代码显示环境变量(如果可用)或 "不可用"。

图 4:检索默认值

图 4:检索默认值

由于尚无环境变量,我们看到 "不可用"。我们将努力添加各种环境变量。

第 4 步:添加纯文本环境变量

在此步骤中,您将添加纯文本环境变量并预览应用程序。

  1. 导航到 Getting-started-app-env 的 "环境配置" 页面。
  2. 配置 Elastic Beanstalk 环境属性:
图 5:纯文本环境属性

图 5:环境属性中的纯文本

  1. 选择 Apply 并等待环境更新。
  2. 预览环境以验证是否已检索到纯文本值。
图 6:检索纯文本环境变量

图 6:检索纯文本环境变量

第 5 步:引用参数存储参数

在此步骤中,您将在参数库中创建一个参数,然后在应用程序中引用该参数。

  1. 在亚马逊云科技控制台中创建参数存储参数
    1. 按照亚马逊云科技用户指南使用控制台创建参数存储参数。
    2. 选择 "名称" 作为 getting_started_name
    3. 选择 "值" 作为 getting_started_value
    4. 复制并保存参数的亚马逊资源名称 (ARN) 以备日后使用。
  2. 更新 EC2 IAM 角色,添加访问在步骤 5-1 中创建的参数的权限。
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetParameter"
            ],
            "Resource": [
                "arn:aws:ssm:us-east-1: 111122223333:parameter/getting_started_name"
            ]
        }
    ]
}
  1. 配置 Elastic Beanstalk 环境属性

使用以下方法添加新属性:

  • 来源:参数存储
  • 名称:PARAM_STORE
  • 值:[粘贴从步骤 5-1d 中复制的 ARN]
图 7:参数存储源环境属性

图 7:参数存储源环境属性

  1. 选择 Apply 并等待环境更新
  2. 预览环境以确保纯文本值和参数存储值可用。

应用程序代码检索并显示两个环境变量:PLAIN_TEXT(纯文本键值对)和PARAM_STORE(参数存储引用)。

图 8:检索纯文本和参数存储环境变量

图 8:检索纯文本和参数存储环境变量

第 6 步:从 Secrets Manager 引用密钥

在此步骤中,你将在密钥管理器中创建一个密钥,然后在应用程序中引用它。

  1. 在 Amazon Secrets Manager 中创建密钥

按照亚马逊云科技用户指南创建 Amazon Secrets Manager 密钥。

    1. 选择 "其他类型的密钥"。
    2. 在 "键/值对" 下的 "纯文本" 选项卡中,输入:{"username": "ExampleUserId1", "password": "EXAMPLEPASSWORD"}
    3. 选择名称作为 getting_started_secret
    4. 创建后记下 ARN。
图 9:Amazon Secrets Manager 中的密钥

图 9:Amazon Secrets Manager 中的密钥

  1. 更新 EC2 IAM 角色以添加访问在步骤 6-1 中创建的密钥的权限。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetSecretValue",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:secretsmanager:us-east-1: 111122223333:secret:test-fb0jMB",
                "arn:aws:kms:us-east-1: 111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            ]
        }
    ]
}
  1. 配置 Elastic Beanstalk 环境属性。使用以下方法添加新属性:
  • 来源:Secrets Manager
  • 名称:SECRET_VALUE
  • 值:[粘贴从步骤 6-1d 中复制的 ARN]
图 10:密钥管理器源环境属性

图 10:密钥管理器源环境属性

  1. 选择 Apply 并等待环境更新。
  2. 预览环境以确保纯文本值、参数存储值和密钥管理器值可用。
图 11:检索纯文本、参数存储和密钥管理器环境变量

图 11:检索纯文本、参数存储和密钥管理器环境变量

应用程序代码检索并显示三个环境变量:PLAIN_TEXT(纯文本键值对)、PARAM_STORE(参数存储引用)和SECRET_STORE(密钥管理器)。

步骤 7:刷新环境中的配置值

Elastic Beanstalk 会在实例部署期间检索参数。当客户轮换或更新 Amazon Secrets Manager 或 Parameter Store 中的值时,当前 Elastic Beanstalk 环境变量会保留旧值。在横向扩展事件期间,新实例将检索新值,而现有实例将继续使用旧值。

要从密钥存储库获取最新版本的密钥,客户必须触发RestartAppServerUpdateEnvironment

我们将更新环境值并在控制台中重新启动应用程序服务器以获取新值。

  1. 按照使用值更新 Amazon Secrets Manager 密钥(在步骤 6-1 中创建)的值{"username":"ExampleUserId1","password":"UPDATEDPASSWORD"}
  2. 使用该值更新参数存储值(在步骤 5-1 中创建):getting_updated_value
  3. 重启 Elastic Beanstalk 环境
    1. 在控制台中导航到 Elastic Beanstalk 服务页面
    2. 在导航窗格中,选择 "环境-入门应用程序环境"(在 "创建 .NET 应用程序和环境" 部分创建),然后从列表中选择环境的名称。
    3. 选择 "操作",然后选择 "重新启动应用程序服务器"
  4. 访问 Elastic Beanstalk 环境 URL 以确认新值。
图 12:从参数存储和密钥管理器检索更新后的值

图 12:从参数存储和密钥管理器检索更新后的值

清理干净

按照以下步骤清理您预置的资源。

  1. 导航到 Elastic Beanstalk 控制台并删除应用程序入门应用程序。
  2. 导航到 亚马逊云科技 SSM,选择参数存储并删除创建的参数 getting_started_name
  3. 导航到 Amazon Secrets Manager 并删除密钥 getting_started_secret

结论

在这篇博客文章中,我们探讨了 Amazon Elastic Beanstalk 中的新功能如何增强配置管理。客户现在可以从三个配置来源中进行选择:纯文本、Amazon Secrets Manager Secrets 和 Systems Manager 参数存储。

这些选项通过取消了 4096 个字符大小限制并通过参数存储/密钥管理器提供安全存储来增强环境变量管理。它们通过加密、轮换功能和审计功能提供敏感数据的集中管理。该系统可确保跨环境的一致配置,同时通过分离关注点来提高安全性、可扩展性和可维护性。这种方法简化了凭证管理,并通过全面的监控和访问控制来支持合规性要求。

准备好对您的应用程序部署进行现代化改造了吗?立即开始使用 Amazon Elastic Beanstalk。



Sakthi Chellapparimanam

Sakthi Chellapparimanam

Sakthivel Chellapparimanam 是亚马逊云科技印度分公司的解决方案架构师。他帮助客户构建云应用程序并将应用程序迁移到云端。工作之余,他喜欢与家人共度美好时光。他还是一位充满激情的板球运动员,尽可能地努力上场。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。