1. 主要ページへ移動
  2. メニューへ移動
  3. ページ下へ移動

QES ブログ

記事公開日

最終更新日

【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を利用することでパラメータ値を暗号化することも可能です。

 

構成図

2024-10-11 133012.png

CodePipeline実行フローイメージ

①CodeCommitへのpushをトリガーにCodePipelineを自動実行する

②CodeBuildを実行。ビルドプロジェクトで以下の処理をする

 ・Parameter Storeから前回のコミットIDの情報を取得する

 ・前回のコミットと最新のコミットを比較して差分ファイルの情報を取得する

 ・差分ファイルをS3に保存する

 ・毎ビルド実行後、最新のコミットIDをParameter Storeに保存する

 

上記構成図のCodePipelineの詳しい設定内容に関しては、別記事の【AWS】AWS CodePipelineを利用した、CI/CD運用の構築でご紹介しているのでご参考にして頂ければと思います。

本記事では【AWS】AWS CodePipelineを利用した、CI/CD運用の構築で構築した環境を使って動作確認を行っていきます。

 

環境の構築

CodeCommit

新規ブランチを作成していきます。ブランチの画面から「ブランチを作成」をクリック。

2024-10-08 150110.png

ブランチ名を入力してください。ブランチ元に「main」ブランチを選択してください。

2024-10-08 150154.png

作成をクリックすると新しく「develop」ブランチが作成されていることが確認できます。developブランチの中身はブランチ元で指定したものと同じになります。

2024-10-08 150451.png

 

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)を選択して、出力アーティファクト形式に完全クローンを選択します。

2024-10-09 142434.png

ビルドステージには「test-build」を選択し、ビルドタイプに単一ビルドを選択します。

2024-10-09 142538.png

 

デプロイステージは今回は設定しないのでスキップを選択し、CodePipelineを作成してください。

 

動作実行

では実際に動作を実行して確認してみましょう。

①CLIコマンドでパイプライン名をKeyとし、Valueがリポジトリ名/ブランチ名となるようにParameter Storeに保存する。

今回はAWS CloudShellを利用してCLIコマンドでParameter Storeにパイプライン名とリポジトリ/ブランチを紐づけて保存します。以下のコマンドの形で実行してください。

aws ssm put-parameter --name "パイプライン名" --type "String" --value "リポジトリ名/ブランチ名"

 

AWS Management Consoleの画面右上にあるCloudShellアイコンをクリックして、コマンドを入力し実行してください。

cloudshell1.png

Parameter Storeの画面へ行くと、パイプライン名をKeyとしてValueにリポジトリ名/ブランチ名の形で保存されていることが確認できます。

2024-10-10 100853.png

②パイプラインを初回実行させ、Parameter Storeにバージョン1を保存しましょう。

CodePipelineの画面から「test-pipeline-develop」を選択し、「変更をリリースする」をクリックしてパイプラインを初回実行させます。

2024-10-10 111132.png

Buildが成功したのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。初回ビルド実行時のため"No previous commit found."が出力されています。また、最新のコミットIDを取得しParameter Storeにversion1で保存されたことが確認できます。

rogu.png

Parameter Storeの画面で確認すると、/test-codecommit/develop/last_commit_idのKeyが作成され、詳細を確認するとValueにdevelopブランチの最新のコミットIDの情報が保存されています。

2024-10-10 111403.png

③developブランチのファイルを変更して動作を確認してみましょう

「develop」ブランチ内のファイルを編集してコミットをpushしましょう。今回はtest.txtファイルを編集します。「変更のコミット」をクリックしてパイプラインが自動実行されることを確認してください。

2024-10-10 111608.png

パイプラインが自動実行されBuildが成功したのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。今回は/test-codecommit/develop/last_commit_idが存在するのでそこからValue(前回のコミットID)を取得して、最新のコミットとの比較を実行しています。比較をし差分のあったファイルの情報を取得してS3に出力していることが確認できます。

rogu2.png

S3の画面へ行くと、差分のあったファイル(test.txt)が保存されていることが確認できます。

s3-1.png

Parameter Storeの画面から/test-codecommit/develop/last_commit_idを確認してみると、Valueに最新のコミットIDが上書きされていてバージョンが2になっていることが確認できます。
2024-10-10 111944.png

④別のパイプラインを実行させ、パイプライン単位でParameter Storeに保存されるか確認してみましょう。

別のCodePipelineを①~③と同様の手順で動作させて確認してみましょう。まずCLIコマンドを実行してParameter Storeに保存しましょう。

cloudshell2.png

 

CLIコマンドを実行してParameter Storeにパイプライン名をKeyとして保存されているを確認できました。

2024-10-10 151724.png

「test-pipeline」を選択して、「変更をリリースする」をクリックして初回実行させます。Buildが成功したらParameter Storeの画面に/test-codecommit/main/last_commit_idのKeyが生成されていることを確認できます。Valueにはmainブランチの最新のコミットIDが保存されています。

2024-10-10 152453.png

「main」ブランチ内のファイルを編集してコミットをpushしましょう。今回はdemofile.txtファイルを編集してみます。

2024-10-10 155957.png

パイプラインが自動実行されBuildが成功になったのを確認できたら、「詳細を表示」から実行ログを確認してみましょう。すると、/test-codecommit/main/last_commit_idから前回のコミットIDの情報を取得しているのを確認できます。

rogu3.png

S3の画面へ行くと、差分のあったファイル(demofile.txt)が保存されていることが確認できます。

s3-2.png

Parameter Store内の/test-codecommit/main/last_commit_idを確認してみると、最新のコミットIDが上書きされていてバージョンが2になっていることを確認できました。
2024-10-10 160047.png

 

 

まとめ

最後までお読みいただきありがとうございます。

今回はAWS Systems Manager Parameter Storeを使ってパイプライン単位でバージョン管理する方法をご紹介しました。複数のAWS CodePipelineを利用することをご検討している方は参考にして頂ければと思います。

最後に「このサービスについて知りたい」「AWS環境の構築、移行」などのリクエストがございましたら、弊社お問合せフォームまでお気軽にご連絡ください! のちほど当ブログにてご紹介させていただくか、複雑な内容に関するお問い合わせの内容の場合には直接営業からご連絡を差し上げます。

※Amazon Web Services、”Powered by Amazon Web Services”ロゴ、およびブログで使用されるその他のAWS商標は、米国その他の諸国における、Amazon.com, Inc.またはその関連会社の商標です。

 

  • このエントリーをはてなブックマークに追加

お問い合わせ

Contact

ご質問やご相談、サービスに関する詳細など、何でもお気軽にご連絡ください。下記のお問い合わせフォームよりお気軽に送信ください。

お問い合わせ

資料ダウンロード

Download

当社のサービスに関する詳細情報を掲載した資料を、下記のページよりダウンロードいただけます。より深く理解していただける内容となっております。ぜひご活用ください。

資料ダウンロード