はじめに
この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも??」などAWSサービスの中でも特定の機能にフォーカスしたり、サービス間連携を検証していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば書き直していく予定です。
今回はAWS CodeBuildでAWS CodeArtifactを使うとどうなるのかを検証するために環境をセットアップします。
そもそもAWSのCodeシリーズとは
AWSには「Code」と名のつくサービスがいくつかあります。いくつか抜粋してみると以下のようなものがあります。
- AWS CodeCommit
- AWS CodeBuild
- AWS CodeDeploy
- AWS CodePipeline
- AWS CodeArtifact
- AWS CodeGuru
- AWS CodeDeploy
Amazon CodeCalystというサービスもありますが、これもCodeシリーズに含まれるのかは不明です。少なくともCodeと名がつくサービスであり、開発者向けのサービスとして提供されています。なお、CodeStarについては2024年7月31日をもってサポートが終了となります。
今回扱うサービス
Codeシリーズの全体像がみえたところで、「CodeArtifact」と「CodeBuild」はどんなサービスでしょうか。
AWS CodeArtifact
AWS CodeArtifactはパッケージマネージャツール(Maven、Gradle、npm、Yarn、Twine、pip、NuGetなど)でダウンロードするパッケージを管理するサービスです。
AWSのドキュメントでは以下のように説明されています。
ソフトウェア開発のためのセキュアかつスケーラブルでコスト効率性に優れたパッケージ管理
CodeArtifact を使用すると、一般的なパッケージマネージャーを使用してアーティファクトを格納し、Maven、Gradle、npm、Yarn、Twine、pip、NuGet などのツールを構築できます。CodeArtifact は、パブリックパッケージリポジトリからオンデマンドでソフトウェアパッケージを自動的にフェッチできるため、アプリケーションの依存関係の最新バージョンにアクセスできます。
よくわからない方は以下の記事を参考にしてください。
AWS CodeBuild
AWSではビルド環境を提供してくれるサービスがあります。それがAWS CodeBuildです。
AWS CodeBuildはbuildspec.yml
というAWS CodeBuild特有の設定ファイルからビルド設定を読み取り、ビルドを自動化します。
また、ビルドはビルドプロジェクトという単位で管理され、ブランチ単位とコミットID単位でビルドできます。
version: 0.2
phases:
install:
on-failure: ABORT
commands:
- echo "install phases"
pre_build:
on-failure: ABORT
commands:
- echo "pre_build phases"
build:
on-failure: ABORT
commands:
- echo "build phases"
post_build:
on-failure: ABORT
commands:
- echo "post_build phases"
artifacts:
files:
- "**/*"
なお、ビルド時に環境変数を呼び出すことが可能であり、環境変数はymlファイル内に埋め込むことができます。
環境変数におくデータは以下の3つの形式で保存できます。
- PlainText
- Systems Manager Parameter Store
- Secret Manager
さらにビルド状況を監視する為にCloudWatchを利用してビルド時のログを参照することもできます。
※ビルドプロジェクトが非VPCの場合はそのまま利用できますが、VPCの場合は別途、設定が必要です。
ビルドのソースはAWS CodeCommitだけでなく他のリポジトリサービスも利用できます。
CodeArtifactとCodeBuildの関係
簡単に説明すると、CodeArtifactはパッケージ管理サービスであり、CodeBuildはビルド環境を提供するサービスです。
CodeArtifactで管理されているパッケージはCodeBuildで利用できます。
通常、CodeBuildでソフトウェアパッケージをインストールする場合
パブリックで公開されているパッケージレジストリからパッケージをダウンロードするためにインターネットにアクセスする必要がありますが、CodeArtifactを利用することによってAWS内のパッケージレジストリからパッケージをダウンロードできます。
つまりインターネットを抜けることなくAWSで完結できます。
ハンズオン(おおまかな流れ)
おおまかな流れを紹介します。
まずはCodeArtifactをセットアップします。そのあとCodeBuildをセットします。
CodeArtifactのセットアップは以下の手順で行います。
- CodeArtifactのドメインの作成
- CodeArtifactのリポジトリの作成
- npm-storeを作成
- リポジトリとnpm-store を接続する
- CodeArtifactにログイン
- エンドポイントURLの取得とCODEARTIFACT_AUTH_TOKENの発行
- yarnの設定
- パッケージを登録
CodeBuildのセットアップは以下の手順で行います。
- CloudFormationでCodeCommitのスタックを作成
- CodeCommitの設定
- CloudFormationでCodeBuildのスタックを作成
- CloudFormationでCodePipelineのスタックを作成
- 実行結果の確認
AWS CodeArtifactのセットアップ
AWS CloudShellを利用してCodeArtifactのセットアップを行います。
AWSマネジメントコンソールを開いて赤枠のターミナルボタンをクリックします。
環境変数の設定
環境構築に必要な変数を設定します。
変数名 | 説明 |
---|---|
AWS_DOMAIN | CodeArtifactのドメイン名 |
REPOSITORY_NAME | リポジトリ名 |
AWS_ACCOUNT_ID | AWSのアカウントID |
AWS_DEFAULT_REGION | リージョン名 |
export AWS_DOMAIN="cf-handson-domain" && echo $AWS_DOMAIN
export REPOSITORY_NAME="cfhandson"
export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query 'Account' --output text` && echo $AWS_ACCOUNT_ID
export AWS_DEFAULT_REGION="ap-northeast-1" && echo $AWS_DEFAULT_REGION
ドメインの作成
CodeArtifactのドメインを作成します。
aws codeartifact create-domain --domain $AWS_DOMAIN
リポジトリを作成する
ドメインではパッケージを格納できないため、リポジトリを作成します。
aws codeartifact create-repository --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --repository $REPOSITORY_NAME
npm-storeを作成する
リポジトリにはnpmのパッケージをいれたいため、まずはnpm-storeを作成します。
aws codeartifact create-repository --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --repository npm-store
リポジトリとnpm-store を接続する
npm-storeを作成したあとはリポジトリとnpm-storeを接続します。
aws codeartifact associate-external-connection --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --repository npm-store --external-connection "public:npmjs"
リポジトリを更新する
最後にリポジトリを更新します。
aws codeartifact update-repository --repository $REPOSITORY_NAME --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --upstreams repositoryName=npm-store
CodeArtifactにログイン
エンドポイントの取得やトークンの取得が必要となる為、CodeArtifactににログインします。
aws codeartifact login --tool npm --domain $AWS_DOMAIN --region $AWS_DEFAULT_REGION --domain-owner $AWS_ACCOUNT_ID --repository $REPOSITORY_NAME
エンドポイントURLの取得とCODEARTIFACT_AUTH_TOKENの発行
CodeArtifactのエンドポイントURLとCODEARTIFACT_AUTH_TOKEN
を取得します。
export CODEARTIFACT_URL=`aws codeartifact get-repository-endpoint --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --repository $REPOSITORY_NAME --format npm` && echo $CODEARTIFACT_URL
export CODEARTIFACT_AUTH_TOKEN=`aws codeartifact get-authorization-token --domain $AWS_DOMAIN --region $AWS_DEFAULT_REGION --domain-owner $AWS_ACCOUNT_ID --query authorizationToken --output text` && echo $CODEARTIFACT_AUTH_TOKEN
yarnの設定
CodeArtifactとパッケージマネージャを接続する為にyarnの設定を変更します。
まずはインストールを実行します。
sudo npm install -g yarn
CodeArtifactの設定をyarnに設定します。
yarn config set npmRegistryServer "$CODEARTIFACT_URL"
yarn config set 'npmRegistries["$CODEARTIFACT_URL"].npmAuthToken' "${CODEARTIFACT_AUTH_TOKEN}"
yarn config set 'npmRegistries["$CODEARTIFACT_URL"].npmAlwaysAuth' "true"
パッケージを登録
CodeArtifactにパッケージが登録されていないことを確認します。
aws codeartifact list-packages --domain $AWS_DOMAIN --repository $REPOSITORY_NAME --query 'packages' --output text
リポジトリをクローンする
今回使うリポジトリをクローンします。
git clone https://github.com/ymd65536/aws_codebuild_artifact.git && cd aws_codebuild_artifact
パッケージをCodeArtifactに登録する
sample-package
のディレクトリに移動します。
cd ./sample-package
CodeArtifactにパッケージを登録します。
npm publish
登録されたパッケージの一覧を表示します。
aws codeartifact list-packages --domain $AWS_DOMAIN --repository $REPOSITORY_NAME
CodeArtifactに登録したパッケージをsample-appに読み込む
サンプルアプリケーションのsample-app
に作成したパッケージを読み込みます。
cd ../sample-app
npm install
を実行してindex.js
を実行します。
npm install sample-package@1.0.0 && node index.js
無事にアプリケーションからパッケージを読み込むことができましたら、CodeArtifactのセットアップは完了です。
CodeArtifactと連携させる環境のセットアップ
AWS CloudFormationを利用して環境をセットアップを行います。操作はこのままCloudShellで行います。
ディレクトリを移動します。
cd ../cfn
CodeCommitのセットアップ
CloudFormationでCodeCommitのスタックを作成
CodeCommitでリポジトリを作成するためにスタックを作成します。以下のコマンドを実行します。
aws cloudformation deploy --stack-name codecommit --template-file ./codecommit.yml --tags Name=Qiita
CodeCommitの設定
ディレクトリを変更してCodeCommitのリポジトリをクローンします。まずはディレクトリを変更します。
cd
CodeCommitのリポジトリをクローンしてブランチを切ります。
git clone codecommit::ap-northeast-1://Qiita && cd Qiita
git checkout -b main
リポジトリにファイルを追加してコミットしてプッシュします。
git config --global user.email "you@example.com"
git config --global user.name "ymd65536"
echo "Hello CodeBuild" > README.md
git add .
git commit -m "Qiita"
git push --set-upstream origin main
次にcode_build_handson
ブランチを作成してコミットしてプッシュします。
git checkout -b code_build_handson
git push --set-upstream origin code_build_handson
codecommit
ディレクトリに移動してファイルをコピーしてコミットしてプッシュします。
cp ./aws_codebuild_artifact/codecommit/* .
git add .
git commit -m "Qiita"
git push
AWS CodeBuildのセットアップ
次にCodeBuildのセットアップを行います。忘れずに以下のコマンドを実行します。
cd ./aws_codebuild_artifact/cfn/
CloudFormationでCodeBuildのスタックを作成
まずはビルドアーティファクトを格納するS3バケットを作成します。
aws cloudformation deploy --stack-name s3 --template-file ./s3.yml --tags Name=Qiita --capabilities CAPABILITY_NAMED_IAM
次にIAMロールを作成します。
aws cloudformation deploy --stack-name codebuild-role --template-file ./codebuild-role.yml --tags Name=Qiita --capabilities CAPABILITY_NAMED_IAM
CodePipelineのIAMロールも作成します。
aws cloudformation deploy --stack-name codepipeline-role --template-file ./pipeline-iam-role.yml --tags Name=Qiita --capabilities CAPABILITY_NAMED_IAM
最後にCodeBuildのスタックを作成します。
aws cloudformation deploy --stack-name codebuild --template-file ./codebuild.yml --tags Name=Qiita
CodePipelineのセットアップ
CloudFormationでCodePipelineのスタックを作成
IAMロールを作成します。
aws cloudformation deploy --stack-name event-bridge-iam-role --template-file ./event-bridge-iam-role.yml --tags Name=Qiita --capabilities CAPABILITY_NAMED_IAM
CodePipelineのスタックを作成します。
aws cloudformation deploy --stack-name pipeline --template-file ./pipeline.yml --tags Name=Qiita
以上でCodePipelineのセットアップは完了です。
CodePipelineが正常に動作しているか確認する
AWS マネジメントコンソールを開き、CodePiplineを開きます。
画面左メニューからPipelines
をクリックします。
以下のようにSucceeded
となっていれば正常に動作しています。
次のステップ
長くなりそうなので具体的な実装は次の記事で掲載します。次はCodeBuildからCodeArtifactを引用してパッケージをインストールします。