我正在为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,大约两年前,没有相关答案。