将KeyValuePairs列表传递到AWS Cloudformation模板

时间:2019-10-29 15:36:46

标签: amazon-web-services microservices amazon-cloudformation amazon-ecs

我正在为ECS中运行的一堆(约75个)微服务构建一个cloudformation模板。有一个顶层模板,其中包含所有微服务作为嵌套堆栈。我希望为所有微服务使用相同的microservice.yaml模板并使用参数来定义要运行的微服务,而不是为每个服务创建数十个不同的模板文件。

AWSTemplateFormatVersion: '2010-09-09'
Description: Deploy a service into an ECS cluster
Parameters:
  ServiceName:
    Type: String
  ImageUrl:
    Type: String
  LogLevel:
    Type: String
    Default: debug
  NodeEnv:
    Type: String
    Default: integration

Resources:
  TaskDefinition:
    Type: AWS::ECS::TaskDefinition
    Properties:
      RequiresCompatibilities: 
        - EC2
      ContainerDefinitions:
        - Name: !Ref 'ServiceName'
          Image: !Ref 'ImageUrl'
          Environment:
            - Name: LOG_LEVEL
              Value: !Ref 'LogLevel'
            - Name: NODE_ENV
              Value: !Ref 'NodeEnv'

  Service:
    Type: AWS::ECS::Service
    Properties:
      ServiceName: !Ref 'ServiceName'
      Cluster: !ImportValue production-infrastructure:ECSClusterName
      DesiredCount: 1
      TaskDefinition: !Ref 'TaskDefinition'

master.yaml中,我将列出所有服务,如下所示:

FooBarMicroservice:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      ServiceName: fooBarMicroservice
      ImageUrl: !Join ['' , [ !Ref 'ECRHost', '/fooBarMicroservice']]
    TemplateURL: "https://mybucket.s3.amazonaws.com/cloudformation-templates/microservice.yaml"

问题在于,许多微服务都需要其他唯一的环境变量。到目前为止,我所做的是将所有可能的变量添加到默认值为''的一个模板中。但是现在TaskDefinition开始看起来像这样:

TaskDefinition:
  Type: AWS::ECS::TaskDefinition
  Properties:
    RequiresCompatibilities: 
      - EC2
    ContainerDefinitions:
      - Name: !Ref 'ServiceName'
        Image: !Ref 'ImageUrl'
        Environment:
          - Name: LOG_LEVEL
            Value: !Ref 'LogLevel'
          - Name: NODE_ENV
            Value: !Ref 'NodeEnv'
          - Name: SMTP
            Value: !Ref 'SMTP'
          - Name: ACME_CLIENT_ID
            Value: !Ref 'AcmeClientId'
          - Name: ACME_SECRET
            Value: !Ref 'AcmeSecret'
          - Name: ACME_TIMEOUT
            Value: !Ref 'AcmeTimeout'
          - Name: FOO_WEBHOOK_ROUTE
            Value: !Ref 'FooWebhookRoute'
          - Name: EXPIRES_IN
            Value: !Ref 'expiresIn'
          ...
          ...

对于任何给定的微服务,大多数只是空的环境变量。这变得非常笨拙和混乱。

理想情况下,我希望能够将具有所有唯一环境变量的KeyValuesPair列表传递给microservice.yaml。像这样的东西(不起作用):

FooBarMicroservice:
  Type: AWS::CloudFormation::Stack
  Properties:
    Parameters:
      ServiceName: fooBarMicroservice
      ImageUrl: !Join ['' , [ !Ref 'ECRHost', '/fooBarMicroservice']]
      Env:
        - Name: ACME_CLIENT_ID
          Value: 'AE4051DE41'
        - Name: ACME_SECRET
          Value: 'TdUGm6GR>nQp|q<'
    TemplateURL: "https://mybucket.s3.amazonaws.com/cloudformation-templates/microservice.yaml"

,然后将!Ref Env列表与现有的常见env变量列表连接起来。

我搜寻了很多东西,但是找不到可行的解决方案。最接近的参考文献来自this question,大约两年前,没有相关答案。

0 个答案:

没有答案