天天看点

elastic架构_使用Elastic Beanstalk和CloudFormation维护基础架构

elastic架构

在AWS上构建基础设施的众多服务和方法很容易导致难以长期维护的手工制作的系统雪花。 通常,您不知道是谁引入了哪些更改或如何在临时环境中重现它以测试未来的更改。

为了解决此问题,AWS开发了CloudFormation,以将您的基础架构定义置于源代码控制之下,并使其易于开发。 这使您的团队能够在临时帐户上测试对基础结构的更改并在进行审核之前对其进行检查。

为了向您介绍CloudFormation,让我们逐步介绍如何在Elastic Beanstalk上设置一个应用程序,该应用程序还将其日志发送到CloudWatch Logs 。 在后续文章中,我们将通过Elastic Beanstalk应用程序和负载平衡器上的CloudFormation设置其他警报。

CloudFormation模板简介

通过可存储在存储库中的JSON模板文件配置CloudFormation。 您可以定义资源,资源之间的依赖关系以及参数,以便可以在设置过程中更改基础结构。 所有这些在CloudFormation UI中也可见。

要深入了解CloudFormation配置,请查看其文档的“ 入门”部分 。 一旦您对基础知识(不太复杂)有了很好的了解,最好的学习方法是通过模板参考 ,其中列出了不同的资源类型及其所有选项。

JSON文件语法可能非常冗长。 为了简化此过程,CloudFormation团队引入了设计器UI 。 另一个选择是使用基于JSON格式构建的不同DSL,以使其更易于编写。 对于Python,如果您喜欢Ruby语法,则有Troposphere项目或Cfndsl 。

我在此博客中使用了Cfndsl ,但是它与JSON语法非常接近。 它应该很容易理解。

设置Elastic Beanstalk应用程序和环境

我正在使用示例示例repo flomotlik / cloudformation-elastic-beanstalk-blog-demo 。 它具有有关如何使用基于Docker的Codeship CLI进行部署的详细说明。

该存储库具有一个小型Sinatra应用程序,该应用程序会用Hello World响应任何请求。

模板演练

您可以在存储库中按照以下步骤检出完整的模板。 您可以按照以下所有步骤进行操作,删除以下示例中未提及的所有内容,直到返回完整的模板。

让我们从设置一个简单的Elastic Beanstalk应用程序和环境开始。

ElasticBeanstalk_Application('DemoDockerApplication') do
    Property('Description', 'AWS Elastic Beanstalk Application')
  end

  ElasticBeanstalk_Environment('DemoEnvironment') do
    DependsOn %w(DemoDockerApplication)
    ApplicationName Ref('DemoDockerApplication')
    Description 'AWS Elastic Beanstalk Environment'
    SolutionStackName '64bit Amazon Linux 2015.09 v2.0.4 running Docker 1.7.1'
  end           

设置好该堆栈之后(您应该在CloudFormation UI中遵循该堆栈),您应该能够看到Elastic Beanstalk Docker堆栈的演示页面。

在部署自己的应用程序之前,我们需要创建一个S3文件夹,该文件夹将容纳我们的可部署工件。 将以下内容添加到模板中,然后重新运行部署:

S3_Bucket('ElasticBeanstalkDeploymentBucket')           

这将创建一个唯一的S3存储桶,我们将用于部署。 在codeship-steps.yml中,我们将占位符更改为创建的存储桶的名称; 我们现在可以通过Jet运行部署。 我们还在模板中添加了输出,因此可以更轻松地发现我们的Elastic Beanstalk环境的S3存储桶和URL。

现在,您可以按照存储库的README中所述运行Elastic Beanstalk部署。

如果打开ElasticBeanstalk环境的URL,应该会看到Hello World的报告。

elastic架构_使用Elastic Beanstalk和CloudFormation维护基础架构

将日志发送到CloudWatch Logs

在构建复杂的基础架构时,您依赖于一个良好的日志记录和指标系统,以确保您对基础架构有深入的了解。 将来自所有不同应用程序的所有日志放在一个中央位置对于完成此任务非常有帮助。

CloudWatch是Amazon提供的一项服务,支持处理应用程序中的指标和日志。 它会自动为您的EC2实例和弹性负载均衡器提供指标,但它也可以具有自定义指标。 此外,您可以将所有日志放入其中,然后在日志中找到特定字符串时根据这些日志创建指标。 这为您设置和自动管理基础结构提供了很大的灵活性。

您甚至可以根据您的警报甚至您的自定义指标自动启动或停止实例,我们将在后续博客中进行操作。

将以下配置添加到模板文件。 它将建立一个单独的日志组,我们将在本系列的第二篇博文中使用该日志组来设置指标和警报。 它还会创建一个IAM角色和实例配置文件,我们可以将其用于Elastic Beanstalk应用程序,以便能够与CloudWatch Logs服务进行通信。

Logs_LogGroup('ElasticBeanstalkMainLogGroup')

  IAM_Role('ElasticBeanstalkLoggingRole') do
    AssumeRolePolicyDocument(
      Version: '2012-10-17',
      Statement: [{
        Effect: 'Allow',
        Principal: {
          Service: ['ec2.amazonaws.com']
        },
        Action: ['sts:AssumeRole']
      }]
    )
    Path '/'
    Policies [{
      PolicyName: 'ElasticBeanstalkLogging',
      PolicyDocument: ({
        Version: '2012-10-17',
        "Statement": [
          {
            "Effect": 'Allow',
            "Action": [
              'logs:CreateLogStream',
              'logs:GetLogEvents',
              'logs:PutLogEvents',
              'logs:DescribeLogGroups',
              'logs:DescribeLogStreams',
              'logs:PutRetentionPolicy'
            ],
            "Resource": [
              'arn:aws:logs:us-east-1:*:*'
            ]
          }
        ]
      })
    }]
  end

  IAM_InstanceProfile('ElasticBeanstalkInstanceProfile') do
    Path '/'
    Roles [Ref('ElasticBeanstalkLoggingRole')]
  end           

确保使用OptionSettings更新Elastic Beanstalk环境,以便设置实例配置文件并添加日志组作为我们可以在日志配置文件中使用的参数。

ElasticBeanstalk_Environment('DemoEnvironment') do
    DependsOn %w(DemoDockerApplication ElasticBeanstalkMainLogGroup)
    ApplicationName Ref('DemoDockerApplication')
    Description 'AWS Elastic Beanstalk Environment'
    SolutionStackName '64bit Amazon Linux 2015.09 v2.0.4 running Docker 1.7.1'
    OptionSettings [
      {
        Namespace: 'aws:autoscaling:launchconfiguration',
        OptionName: 'IamInstanceProfile',
        Value: Ref('ElasticBeanstalkInstanceProfile')
      },
      {
        Namespace: 'aws:elasticbeanstalk:customoption',
        OptionName: 'EBLogGroup',
        Value: Ref('ElasticBeanstalkMainLogGroup')
      }]
  end           

在CloudFormation堆栈中设置完所有内容之后,请部署该堆栈,以便我们可以配置Elastic Beanstalk应用程序。

配置ElasticBeanstalk以将日志发送到Cloudwatch日志

我们已经为Elastic Beanstalk EC2实例创建了将日志发送到的基础架构。 现在我们必须将其连接在一起。 Elastic Beanstalk支持一个名为

.ebextensions

的特殊文件夹,该文件夹使您可以配置实例。

在存储库的

.ebextensions

文件夹中,我们有三个文件:

  • cwl-log-setup.config

    。 这将设置Cloudwatch Logs Agent配置文件以将特定于日志的日志文件(在这种情况下为应用程序日志和NGINX日志,但可以轻松扩展)推送到Cloudwatch日志。 它还设置日志流,并采用我们通过OptionSettings设置的EBLogGroup参数。
  • cwl-setup.config

    。 在计算机上安装Cloudwatch Logs Agent。
  • eb-logs.config

    。 当您转到EB仪表板并在此处请求日志时,请确保Elastic Beanstalk代理也正在为CloudWatch Logs代理选择日志文件。 这对于调试其他配置设置和文件非常有帮助。

部署这些文件之后,代表您的Elastic Beanstalk应用程序的CloudFormation堆栈将被更新,并且Elastic Beanstalk应该开始将日志发送到CloudWatch Logs。

我们在这里进行了设置,以便每个应用程序都有一个新的日志流,每个实例都有一个NGINX日志,因此可以更轻松地研究特定实例上的问题。 通过此设置,我们将在今天结束。 我们将在我的后续博文中进一步实现更多指标。

结论

将所有基础架构置于源代码控制之下,可极大地提高您的生产率。 您可以轻松设置登台系统或对其进行升级,而无需跟踪基础架构中发生的事情。 基础架构中不会发生任何未记录的更改,并且您可以根据需要甚至回滚到较早的设置。

通过将Elastic Beanstalk与测量和查看堆栈的每个部分所获得的灵活性相结合,您将拥有一个非常强大的系统来运行和操作您的应用程序。

尝试一下,让我们在评论中告知您是否还有其他有关Elastic Beanstalk的技巧和窍门。

翻译自: https://www.javacodegeeks.com/2016/01/maintain-infrastructure-elastic-beanstalk-cloudformation.html

elastic架构