アプリケーションのデプロイメントパイプラインを自動化しようとしています。これが自動化アーキテクチャです、私は思いついた:
ご覧のとおり、デプロイメントを自動化するためにcodePipelineとcodeBuildを使用しています。私のバックエンドは Serverless Framework に基づいており、sls deploy
コマンドの起動時にラムダ関数をデプロイします。これが理由です。従来の展開ではcodeDeployを使用しませんでした。 buildspec.yml
ファイルは次のようになります:
version: 0.1
phases:
install:
commands:
– apt-get -y update
– npm install -g [email protected]
build:
commands:
– cd nj2jp/serverless && npm install
post_build:
commands:
– serverless deploy –verbose
artifacts:
files:
– serverless.yml
discard-paths: yes
今、私はCodeBuildとサーバーレスに関して3つの質問を持っています:
質問1:コマンドsls deploy
は、dbパスワードなどのシークレットを含むconfig.yml
というファイルに依存しています。このファイルはgitにチェックインされません。 codeBuildにconfig.yml
を含めるための最良の方法は何だと思いますか?
質問2:ロールバックは、を使用して従来のEC2アプリケーションをデプロイする必要がある場合、AWSで実行できますcodeDeploy。サーバーレスの場合、codeDeployを使用しておらず、サーバーレスはrollback機能もサポートしています。 codePipeline内でサーバーレスロールバックをどのように活用しますか?
質問3:プルリクエストが発生したときにcodePipelineをトリガーします。 codePipelineではサポートされていないという投稿をいくつか見ました。しかし、それらの投稿は昨年のものでした。プルリクエストはcodePipelineでサポートされるようになりましたか?
ハックアンサー(正しくありませんが、機能します。あなたからのより良いアンサーが必要です。)
回答1:config.yml
ファイルはプライベートS3バケットに保存でき、一部としてcodeBuildにプルできますof pre-build
setupまたはcodeBuildのEnv変数にすべてのシークレットを追加できます。すべての環境で一貫性を保ちたいので、2番目のオプションは好きではありません。この問題のより良い解決策はありますか?
回答2:これに対するハックは考えられません。あなたからの答えを探しています。
回答3:[APIGateway + Lambda + S3] を使用してcodePipelineプルリクエストの場合。しかし、この機能はすぐに使用できるものとして提供する必要があると思います。この機能のcodePipelineに更新はありますか?
質問1
更新:
サーバーレスフレームワークは、パラメーターストアからの変数の参照をサポートするようになりました。つまり、サーバーレスはデプロイ時にパラメーターストアからそれらを取得するため、CodeBuildでの定義をスキップできます。
例:
serverless.yaml
provider:
name: aws
runtime: nodejs8.10
region: us-west-2
stage: ${env:REGION}
environment:
S3_BUCKET: ${env:/s3/bucket}
# Use ~true for SecureString parameters
DB_USERNAME: ${ssm:/db/username~true}
DB_PASSWORD: ${env:/db/password~true}
元の回答:
config.yml
を使い続けたい場合、それを機能させる唯一の方法は、バージョン管理されていないため、すでに行っているのと同様のハックを行うことです。
私が提案するのは、CodeBuild buildspec.yml
で参照できるEC2パラメーターストアに環境変数を保存することです。これらの変数には、serverless.yml
を使用して${env:VARIABLE_NAME}
でアクセスできます。
ローカル開発の場合は、実際の環境変数を使用するのではなく、config.yml
に保存する必要があります。 direnv などのツールはこれに最適です。
質問2
前のCodeBuildジョブを再実行することにより、手動でロールバックを実行できます。 CodeDeployのように、自動的にそれを行う簡単な方法は考えられません。たぶん、Lambda関数はデプロイ後のテストを実行でき、失敗した場合は、前のCodeBuildジョブの再実行をトリガーできます。
質問3
CodePipelinesは単一のブランチに関連付けられているため、PRブランチで機能させるには、前述の記事のようなハックを行う必要があります。 API Gateway+Lambda+CodeBuild(NoCodePipeline)これを行うには。
質問1で受け入れられた回答に追加するだけです(@dashmugと@Lakshman Diwaakarに感謝します)
これは、パラメータストアの値をLambdaに取り込む方法を整理します。ただし、値はLambdaコンソールにプレーンテキストとして表示されます。次に、暗号化を追加する方法を検討する必要があります。
パラメータストア
AWS Systems Manager>パラメータストアで環境変数をパラメータとして追加します
https://eu-west-1.console.aws.Amazon.com/systems-manager/parameters
buildspec.yml
version: 0.2
phases:
install:
commands:
- npm install
- npm install -g serverless
build:
commands:
- serverless deploy
serverless.yml
Serverless.ymlで作成されたパラメーターを参照します
安全な文字列の場合は〜trueを追加します。
provider:
name: aws
runtime: nodejs6.10
region: eu-west-1
stage: prod
environment:
FOO: ${ssm:/app/production/foo}
DB_USERNAME: ${ssm:/app/production/myDatabase/username~true}
DB_PASSWORD: ${ssm:/app/production/myDatabase/password~true}
handler.js
ハンドラーでenv変数を使用します
export async function main (event, context, callback) {
console.log('process.env.FOO', process.env.FOO)
console.log('process.env.DB_USERNAME', process.env.DB_USERNAME)
console.log('process.env.DB_PASSWORD', process.env.DB_PASSWORD)
callback(null, ok('success'))
}