在 Amazon EC2 上部署 Web 应用程序

入门指南

模块 2:自动配置

在此模块中,您将学习如何使用用户数据配置 EC2 实例以及在 EC2 实例上安装软件包

简介

当您在 Amazon EC2 中启动一个实例时,您可以选择将用户数据传递给它,这些数据可以用于执行常见的自动化配置任务,甚至在实例启动后运行脚本。您将使用此功能通过指定首次启动时安装和配置什么软件来简化您的应用程序部署,并将示例应用程序复制到实例中。此模块将介绍如何创建用户数据以及将数据添加到在上一个模块中创建的 EC2 实例。

您将学到的内容

  • 如何将用户数据添加到 EC2 实例
  • 创建用户数据以在操作系统上安装并配置需要的所有软件包
  • 通过将 Web 应用程序复制到实例来对其进行部署

 完成时间

5 分钟

 模块先决条件

  • 具有管理员级访问权限的 AWS 账户**
  • 推荐的浏览器:最新版 Chrome 或 Firefox

[**] 过去 24 小时内创建的账户可能尚不具有访问此教程所需服务的权限。

实施

将用户数据添加到 EC2 实例

托管在 SampleApp 文件夹中的示例 Web 应用程序是您将部署的 Python 应用程序。它需要 Nginx 和 uWSGI 才能运行。要安装这些组件,需要遵循一些步骤。首先,您需要安装所有的操作系统包,配置 nginx 和 uwsgi,确保它们在运行,然后将示例应用程序复制到实例中。配置所有这些设置步骤的脚本文件见 SampleApp/configure_amz_linux_sample_app.sh - 如果您想了解更多关于实例如何配置的信息,请查看其中的步骤。

要部署 Web 应用程序,您需要将代码添加到 CDK,从而将配置文件和脚本以及示例应用程序复制到 S3 中。您将对配置脚本进行配置。为此,在上一个代码下将以下代码添加到 ec2-cdk-stack.ts 中:

// Use an asset to allow uploading files to S3, and then download it to the EC2 instance as part of the user data

    // --- Sample App ---
    // Upload the sample app  to S3
    const sampleAppAsset = new s3assets.Asset(this, "SampleAppAsset", {
      path: path.join(__dirname, "../../SampleApp"),
    });

    // Allow EC2 instance to read the file
    sampleAppAsset.grantRead(role);

    // Download the file from S3, and store the full location and filename as a variable
    const sampleAppFilePath = ec2Instance.userData.addS3DownloadCommand({
      bucket: sampleAppAsset.bucket,
      bucketKey: sampleAppAsset.s3ObjectKey,
    });

    // --- Sample App ---

    // --- Configuration Script ---
    // Upload the configuration file to S3
    const configScriptAsset = new s3assets.Asset(this, "ConfigScriptAsset", {
      path: path.join(__dirname, "../../SampleApp/configure_amz_linux_sample_app.sh"),
    });

    // Allow EC2 instance to read the file
    configScriptAsset.grantRead(ec2Instance.role);

    // Download the file from S3, and store the full location and filename as a variable
    const configScriptFilePath = ec2Instance.userData.addS3DownloadCommand({
      bucket: configScriptAsset.bucket,
      bucketKey: configScriptAsset.s3ObjectKey,
    });

    // Add a line to the user data to executy the downloaded file
    ec2Instance.userData.addExecuteFileCommand({
      filePath: configScriptFilePath,
      arguments: sampleAppFilePath,
    });

    // --- Configuration Script ---

所有步骤都将添加到您实例的用户数据脚本中,并在实例首次启动时执行。在部署所有内容前还需要执行一个步骤:添加 CDK 堆栈的输出,以便更轻松地通过 SSH 连接到实例。在上面的基础设施中,您创建了一个 SSH 密钥,该密钥存储在 AWS Secret Manager 中。要将该密钥下载到您的工作站中,您需要检索它。您还需要实例的公有 IP,以及要执行的 SSH 命令。 

将以下代码添加到底部的堆栈中:

// Create outputs for connecting

    // Output the public IP address of the EC2 instance
    new cdk.CfnOutput(this, "IP Address", {
      value: ec2Instance.instancePublicIp,
    });

    // Command to download the SSH key
    new cdk.CfnOutput(this, "Download Key Command", {
      value:
        "aws secretsmanager get-secret-value --secret-id ec2-ssh-key/cdk-keypair/private --query SecretString --output text > cdk-key.pem && chmod 400 cdk-key.pem",
    });

    // Command to access the EC2 instance using SSH
    new cdk.CfnOutput(this, "ssh command", {
      value:
        "ssh -i cdk-key.pem -o IdentitiesOnly=yes ec2-user@" +
        ec2Instance.instancePublicIp,
    });

这三个输出将为您显示以下内容:

  • 如何下载 SSH 密钥以访问实例
  • 实例的公有 IP
  • 用于访问实例的 SSH 命令

现在,您已准备好部署堆栈。

结论

在此模块中,您学习了如何将用户数据添加到 EC2 实例中以允许在实例第一次启动时配置它。您使用该实例安装了所有的依赖项、配置了 nginx 和 uwsgi,并部署了示例应用程序。在下一个模块中,您将部署堆栈和示例应用程序。

下一模块:部署 CDK 堆栈

请就我们的表现提供反馈。

感谢您的反馈
很高兴此页面对您有所帮助。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭
感谢您的反馈
很抱歉,此页面未能帮到您。您是否乐意分享更多详细信息,以帮助我们继续改进?
关闭