Настройка развертывания Prod из проекта CodeStar - PullRequest
0 голосов
/ 07 февраля 2020

Я ссылаюсь на эту документацию: https://docs.aws.amazon.com/codestar/latest/userguide/customize-ec2-multi-endpoints.html#customize -ec2-multi-endpoints-newstage

В настоящее время у нас есть проект CodeStar, созданный из шаблона Beanstalk типа "Java Spring, веб-сервис ". Сгенерированный проект, использующий CloudFormation, включает в себя только одну среду для развертывания нашего API.

Вопрос : Как правильно изменить этот шаблон, чтобы одновременно работали две разные среды?

С точки зрения Beanstalk: нам нужен тип SingleInstance для нашего экземпляра dev, и мы хотим иметь тип LoadBalanced для нашего экземпляра prod (используя два экземпляра EC2 для избыточности).

В указанном учебном руководстве упоминается awscodestar-<project_name>-infrastructure-prod, который будет использоваться в качестве имени стека для наборов CloudFormation, но как это работает, если нет фактического экземпляра, созданного для развертывания? Я в замешательстве.

И почему еще не существует файла шаблона, который обеспечивает установку CodePipeline / Beanstalk с двумя средами, аналогичную описанной? Это похоже на довольно распространенный подход к CI / CD.


Вот наш файл template.yml:

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::CodeStar

Conditions:
  UseSubnet: !Not [!Equals [!Ref 'SubnetId', subnet-none]]

Parameters:
  ProjectId:
    Type: String
    Description: AWS CodeStar project ID used to name project resources and create roles.
  InstanceType:
    Type: String
    Description: The type of Amazon EC2 Linux instances that will be launched for this project.
  KeyPairName:
    Type: String
    Description: The name of an existing Amazon EC2 key pair in the region where the project is created, which you can use to SSH into the new Amazon EC2 Linux instances.
  VpcId:
    Type: String
    Description: The ID of the Amazon Virtual Private Cloud (VPC) used for the new Amazon EC2 Linux instances.
  SubnetId:
    Type: String
    Description: The name of the VPC subnet used for the new Amazon EC2 Linux instances launched for this project.
  SolutionStackName:
    Type: String
    Description: The software stack used to launch environments and configure instances in AWS Elastic Beanstalk.
  EBTrustRole:
    Type: String
    Description: The service role in IAM for AWS Elastic Beanstalk to be created for this project.
  EBInstanceProfile:
    Type: String
    Description: The IAM role that will be created for the Amazon EC2 Linux instances.
  Stage:
    Type: String
    Description: The name for a project pipeline stage, such as Staging or Prod, for which resources are provisioned and deployed.
    Default: ''
Resources:
  EBApplication:
    Description: The AWS Elastic Beanstalk application, which is a container used to deploy the correct application configuration.
    Type: AWS::ElasticBeanstalk::Application
    Properties:
      ApplicationName: !Sub '${ProjectId}app${Stage}'
      Description: The name of the AWS Elastic Beanstalk application to be created for this project.
  EBApplicationVersion:
    Description: The version of the AWS Elastic Beanstalk application to be created for this project.
    Type: AWS::ElasticBeanstalk::ApplicationVersion
    Properties:
      ApplicationName: !Ref 'EBApplication'
      Description: The application version number.
      SourceBundle: 'target/ROOT'
  EBConfigurationTemplate:
    Description: The AWS Elastic Beanstalk configuration template to be created for this project, which defines configuration settings used to deploy different versions of an application.
    Type: AWS::ElasticBeanstalk::ConfigurationTemplate
    Properties:
      ApplicationName: !Ref 'EBApplication'
      Description: The name of the sample configuration template.
      OptionSettings:
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: EnvironmentType
        Value: SingleInstance
      - Namespace: aws:elasticbeanstalk:environment
        OptionName: ServiceRole
        Value: !Ref 'EBTrustRole'
      - Namespace: aws:elasticbeanstalk:healthreporting:system
        OptionName: SystemType
        Value: enhanced
      SolutionStackName: !Ref 'SolutionStackName'
  EBEnvironment:
    Description: The AWS Elastic Beanstalk deployment group where the application is deployed, which is made up of the Amazon EC2 Linux instances launched for this project.
    Type: AWS::ElasticBeanstalk::Environment
    Properties:
      ApplicationName: !Ref 'EBApplication'
      EnvironmentName: !Ref 'EBApplication'
      Description: The application to be deployed to the environment.
      TemplateName: !Ref 'EBConfigurationTemplate'
      VersionLabel: !Ref 'EBApplicationVersion'
      OptionSettings:
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: IamInstanceProfile
        Value: !Ref 'EBInstanceProfile'
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: InstanceType
        Value: !Ref 'InstanceType'
      - Namespace: aws:autoscaling:launchconfiguration
        OptionName: EC2KeyName
        Value: !Ref 'KeyPairName'
      - Namespace: aws:ec2:vpc
        OptionName: VPCId
        Value: !Ref 'VpcId'
      - !If
        - UseSubnet
        - Namespace: 'aws:ec2:vpc'
          OptionName: Subnets
          Value: !Ref 'SubnetId'
        - !Ref "AWS::NoValue"

1 Ответ

1 голос
/ 07 февраля 2020

Вы можете создать мастер-шаблон и ссылаться на производственный шаблон и шаблон разработчика как на вложенные стеки. В этом случае все, что вам нужно сделать, это дважды скопировать файл template.yaml, переименовать копии во что-то подходящее и загрузить их в корзину S3. Тогда ваш файл template.yaml будет ссылаться на эти два шаблона. Примерно так:

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::CodeStar

Description: Master stack which creates all required nested stacks

Resources:
  ProdStack:
    Type: "AWS::CloudFormation::Stack"
    Properties:
      TemplateURL: https://your-bucket/templates/production-stack.yml"
      Parameters:
        InstanceType: t2.micro
        EBInstanceProfile: eg
        KeyPairName: eg
        VpcId: eg
        ProjectId: eg
        SubnetId: eg
        SolutionStackName: eg
        EBTrustRole: eg
      Tags:
        - Key: Environment
          Value: Production
  DevStack:
    Type: "AWS::CloudFormation::Stack"
    Properties:
      TemplateURL: https://your-bucket/templates/development-stack.yml"
      Parameters:
        InstanceType: t2.nano
        EBInstanceProfile: eg
        KeyPairName: eg
        VpcId: eg
        ProjectId: eg
        SubnetId: eg
        SolutionStackName: eg
        EBTrustRole: eg
      Tags:
        - Key: Environment
          Value: Dev

Это создаст оба стека и позволит вам ввести соответствующие параметры для каждого. Посмотрите здесь: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-stack.html

Ваш конвейер, скорее всего, останется в основном файле и любых других параметрах, которые вам понадобятся для обеих сред, в зависимости от того, как вы структурируете проект.

...