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

爲什麼不使用三個配置文件?每個階段一個。