1

我在使用Git作为我们的版本控制的开发团队。您如何处理AWS CodePipelines的配置文件?

我们希望至少有3个阶段的开发过程:分段,开发和生产。

在这些阶段之间唯一应该改变的就是一个配置文件,告诉无服务器框架什么是lambda函数,S3存储桶以及需要为CloudFormation堆栈创建的任何其他资源。

但是,这使得源代码控制有点困难。如果我们将配置文件直接放在源代码中,那么我们必须确保这些文件在我们提交/推送到原点时不会被覆盖。但CodeBuild必须以某种方式访问​​它,并且必须确保为指定的阶段获取正确的配置文件。

我更喜欢这个问题的解决方案,它是AWS生态系统的一部分。

+1

你有没有读过https://aws.amazon.com/blogs/devops/create-multiple-builds-from-the-same-source-using-different-aws-codebuild-build-specification-files/?它看起来与你想要做的非常相似。 – aderubaru

回答

3

我所建议的是让你的环境变量存储在EC2参数存储中,你可以在你的CodeBuild buildspec.yml中引用它。

要在您的情况下使用CodePipeline,还需要针对每个环境使用不同的管道和不同的CodeBuild项目。

例如,假设您存放在EC2参数存储(或AWS SSM)以下变量,

DEVELOPMENT_DB_PASSWORD='helloworld' 
STAGING_DB_PASSWORD='helloworld' 
PRODUCTION_DB_PASSWORD='helloworld' 

在你CodeBuild项目中,您必须指定环境变量(例如$ENVIRONMENT=DEVELOPMENT)。不要为此使用buildspec。您可以使用AWS Console或CloudFormation。

然后,您可以buildspec.yml是这样的:

env: 
    parameter-store: 
    DEVELOPMENT_DB_PASS: "DEVELOPMENT_DB_PASSWORD" 
    STAGING_DB_PASS: "DEVELOPMENT_DB_PASSWORD" 
    PRODUCTION_DB_PASS: "DEVELOPMENT_DB_PASSWORD" 

这些变量然后在serverless.yml访问使用${env:ENVIRONMENT}_DB_PASS像这样:

provider: 
    environment: 
    DB_PASS: ${env:${env:ENVIRONMENT}_DB_PASS} 

所有你现在要做的就是创建这三个CodePipeline,每个CodePipeline都有自己的CodeBuild项目(每个项目使用不同的$ENVIRONMENT)。

+0

我被困在最后一步,我认为我的serverless.yml文件正在将该值解释为文字字符串,没有意识到它是一个环境变量 –

+0

我想通了。我不得不把它包装在另一个$ {env:....}包装器中。 –

+0

@TurnerHoughton我的不好。我现在更新了它。 – dashmug

2

为什么不使用三个配置文件?每个阶段一个。