記事公開日
最終更新日
【AWS】AWS Systems Manager Parameter Storeを使ってパイプライン単位でバージョン管理する方法

はじめに
こんにちは。DXソリューション営業本部の後藤です。
本記事では、AWS Systems Manager Parameter Storeを使ってパイプライン単位でバージョン管理する方法についてご説明したいと思います。
AWS Systems Manager Parameter Storeとは
AWS Systems Manager の一機能である Parameter Store は、設定データ管理と機密管理のための安全な階層型ストレージを提供します。パスワード、データベース文字列、Amazon Machine Image (AMI) ID、ライセンスコードなどのデータをパラメータ値として保存することができます。値はプレーンテキストまたは暗号化されたデータとして保存できます。パラメータの作成時に指定した一意の名前を使用して、スクリプト、コマンド、SSM ドキュメント、設定およびオートメーションワークフローの Systems Manager パラメータを参照できます。https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/systems-manager-parameter-store.html
今回行いたいこと
・一つのビルドプロジェクトを共有して複数のAWS CodePipelineで利用する
・前回のコミットと最新のコミットを比較して差分ファイルの情報を取得しS3に出力する。
・毎ビルド実行後、最新のコミットIDをParameter Storeに保存する
・各リポジトリやブランチごとに個別のワークフローで管理するAWS CodePipelineを作成する
・Parameter Storeを利用してパイプライン単位でバージョン管理する
※今回Parameter Storeへの保存には暗号化は実施しませんが、KMSを利用することでパラメータ値を暗号化することも可能です。
構成図
CodePipeline実行フローイメージ
①CodeCommitへのpushをトリガーにCodePipelineを自動実行する
②CodeBuildを実行。ビルドプロジェクトで以下の処理をする
・Parameter Storeから前回のコミットIDの情報を取得する
・前回のコミットと最新のコミットを比較して差分ファイルの情報を取得する
・差分ファイルをS3に保存する
・毎ビルド実行後、最新のコミットIDをParameter Storeに保存する
上記構成図のCodePipelineの詳しい設定内容に関しては、別記事の【AWS】AWS CodePipelineを利用した、CI/CD運用の構築でご紹介しているのでご参考にして頂ければと思います。
本記事では【AWS】AWS CodePipelineを利用した、CI/CD運用の構築で構築した環境を使って動作確認を行っていきます。
環境の構築
CodeCommit
新規ブランチを作成していきます。ブランチの画面から「ブランチを作成」をクリック。
ブランチ名を入力してください。ブランチ元に「main」ブランチを選択してください。
作成をクリックすると新しく「develop」ブランチが作成されていることが確認できます。developブランチの中身はブランチ元で指定したものと同じになります。
CodeBuild
別記事【AWS】AWS CodePipelineを利用した、CI/CD運用の構築で作成したビルドプロジェクト「test-build」の内容を変更していきます。
①ビルドコマンドを以下のyamlコードに変更してください。
version: 0.2
phases:
build:
commands:
# パラメータストアから前回のコミットIDを取得
- PIPELINE_NAME=$(echo $CODEBUILD_INITIATOR | cut -d'/' -f2)
- echo $PIPELINE_NAME
- # Parameter Storeからパラメータを取得
- PARAMETER_VALUE=$(aws ssm get-parameter --name "$PIPELINE_NAME" --with-decryption --query "Parameter.Value" --output text)
- echo $PARAMETER_VALUE
# パラメータストアから前回のコミットIDを取得
- PARAMETER_NAME="/${PARAMETER_VALUE}/last_commit_id"
- PREVIOUS_COMMIT_ID=$(aws ssm get-parameter --name "$PARAMETER_NAME" --query "Parameter.Value" --output text || echo "None")
- echo $PREVIOUS_COMMIT_ID
# 現在のコミットIDを取得
- CURRENT_COMMIT_ID=$(git rev-parse HEAD)
- echo $CURRENT_COMMIT_ID
# 前回のコミットIDが存在するか確認。存在すれば比較しS3に出力
- |
if [ "$PREVIOUS_COMMIT_ID" != "None" ]; then
diffList=$(git diff $PREVIOUS_COMMIT_ID $CURRENT_COMMIT_ID --name-only);
echo $diffList
aws s3 cp $diffList s3://goto-test-codebuild/copy/
else
echo "No previous commit found.";
fi
post_build:
commands:
# 現在のコミットIDをパラメータストアに保存
- aws ssm put-parameter --name "$PARAMETER_NAME" --value "$CURRENT_COMMIT_ID" --type String --overwrite
コード説明
現在ビルドが実行しているパイプライン名を取得します。
- PIPELINE_NAME=$(echo $CODEBUILD_INITIATOR | cut -d'/' -f2)
先ほど取得したパイプライン名をParameter Storeから探し、Valueの情報を取得します。
- PARAMETER_VALUE=$(aws ssm get-parameter --name "$PIPELINE_NAME" --with-decryption --query "Parameter.Value" --output text)
先ほど取得したValueの情報を利用して、Value(リポジトリ/ブランチ)/last_commit_idをPARAMETER_NAME変数に代入します。のちの処理で使用します。
- PARAMETER_NAME="/${PARAMETER_VALUE}/last_commit_id"
Parameter StoreからValue(リポジトリ/ブランチ)/last_commit_idを検索し、存在すればそのValueの情報(前回のコミットID)を取得します。なければ、"None"を返します。(初回実行時など)
- PREVIOUS_COMMIT_ID=$(aws ssm get-parameter --name "$PARAMETER_NAME" --query "Parameter.Value" --output text || echo "None")
最新のコミットIDを取得します。
- CURRENT_COMMIT_ID=$(git rev-parse HEAD)
前回のコミットIDの情報を取得できれば、最新のコミットIDと比較し差分ファイルをS3に出力する。なければ、"No previous commit found."を返します。(初回実行時など)
- |
if [ "$PREVIOUS_COMMIT_ID" != "None" ]; then
diffList=$(git diff $PREVIOUS_COMMIT_ID $CURRENT_COMMIT_ID --name-only);
echo $diffList
aws s3 cp $diffList s3://goto-test-codebuild/copy/
else
echo "No previous commit found.";
fi
put-parameterコマンドでParameter Storeにリポジトリ/ブランチ/last_commit_idをKeyとして、Valueに最新のコミットIDを保存します。次回ビルド時比較元として使用します。
- aws ssm put-parameter --name "$PARAMETER_NAME" --value "$CURRENT_COMMIT_ID" --type String --overwrite
②IAMポリシーの追加
ビルドコマンドでssm get-parameterとssm put-parameterを使用するため、許可ポリシーを作成してCodeBuildに付与されているIAMロールにアタッチしてください。
IAMロール画面へ行き、インラインポリシーの作成から以下のjsonコマンドで許可ポリシーを作成してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ssm:GetParameter",
"ssm:PutParameter"
],
"Resource": "arn:aws:ssm:<リージョン名>:<アカウントID>:parameter/*"
}
]
}
CodePipeline
「develop」ブランチをトリガーとするCodePipelineを作成していきます。名前は「test-pipeline-develop」としました。
リポジトリ(test-codecommit)の新規ブランチ(develop)を選択して、出力アーティファクト形式に完全クローンを選択します。
ビルドステージには「test-build」を選択し、ビルドタイプに単一ビルドを選択します。
デプロイステージは今回は設定しないのでスキップを選択し、CodePipelineを作成してください。
動作実行
では実際に動作を実行して確認してみましょう。
①CLIコマンドでパイプライン名をKeyとし、Valueがリポジトリ名/ブランチ名となるようにParameter Storeに保存する。
今回はAWS CloudShellを利用してCLIコマンドでParameter Storeにパイプライン名とリポジトリ/ブランチを紐づけて保存します。以下のコマンドの形で実行してください。
aws ssm put-parameter --name "パイプライン名" --type "String" --value "リポジトリ名/ブランチ名"
AWS Management Consoleの画面右上にあるCloudShellアイコンをクリックして、コマンドを入力し実行してください。
Parameter Storeの画面へ行くと、パイプライン名をKeyとしてValueにリポジトリ名/ブランチ名の形で保存されていることが確認できます。
②パイプラインを初回実行させ、Parameter Storeにバージョン1を保存しましょう。
CodePipelineの画面から「test-pipeline-develop」を選択し、「変更をリリースする」をクリックしてパイプラインを初回実行させます。
Buildが成功したのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。初回ビルド実行時のため"No previous commit found."が出力されています。また、最新のコミットIDを取得しParameter Storeにversion1で保存されたことが確認できます。
Parameter Storeの画面で確認すると、/test-codecommit/develop/last_commit_idのKeyが作成され、詳細を確認するとValueにdevelopブランチの最新のコミットIDの情報が保存されています。
③developブランチのファイルを変更して動作を確認してみましょう
「develop」ブランチ内のファイルを編集してコミットをpushしましょう。今回はtest.txtファイルを編集します。「変更のコミット」をクリックしてパイプラインが自動実行されることを確認してください。
パイプラインが自動実行されBuildが成功したのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。今回は/test-codecommit/develop/last_commit_idが存在するのでそこからValue(前回のコミットID)を取得して、最新のコミットとの比較を実行しています。比較をし差分のあったファイルの情報を取得してS3に出力していることが確認できます。
S3の画面へ行くと、差分のあったファイル(test.txt)が保存されていることが確認できます。
Parameter Storeの画面から/test-codecommit/develop/last_commit_idを確認してみると、Valueに最新のコミットIDが上書きされていてバージョンが2になっていることが確認できます。
④別のパイプラインを実行させ、パイプライン単位でParameter Storeに保存されるか確認してみましょう。
別のCodePipelineを①~③と同様の手順で動作させて確認してみましょう。まずCLIコマンドを実行してParameter Storeに保存しましょう。
CLIコマンドを実行してParameter Storeにパイプライン名をKeyとして保存されているを確認できました。
「test-pipeline」を選択して、「変更をリリースする」をクリックして初回実行させます。Buildが成功したらParameter Storeの画面に/test-codecommit/main/last_commit_idのKeyが生成されていることを確認できます。Valueにはmainブランチの最新のコミットIDが保存されています。
「main」ブランチ内のファイルを編集してコミットをpushしましょう。今回はdemofile.txtファイルを編集してみます。
パイプラインが自動実行されBuildが成功になったのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。すると、/test-codecommit/main/last_commit_idから前回のコミットIDの情報を取得しているのを確認できます。
S3の画面へ行くと、差分のあったファイル(demofile.txt)が保存されていることが確認できます。
Parameter Store内の/test-codecommit/main/last_commit_idを確認してみると、最新のコミットIDが上書きされていてバージョンが2になっていることを確認できました。
まとめ
最後までお読みいただきありがとうございます。
今回はAWS Systems Manager Parameter Storeを使ってパイプライン単位でバージョン管理する方法をご紹介しました。複数のAWS CodePipelineを利用することをご検討している方は参考にして頂ければと思います。
最後に「このサービスについて知りたい」「AWS環境の構築、移行」などのリクエストがございましたら、弊社お問合せフォームまでお気軽にご連絡ください! のちほど当ブログにてご紹介させていただくか、複雑な内容に関するお問い合わせの内容の場合には直接営業からご連絡を差し上げます。
※Amazon Web Services、”Powered by Amazon Web Services”ロゴ、およびブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。