はじめに
この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも??」などAWSサービスの中でも特定の機能にフォーカスしたり、サービス間連携を検証していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば書き直していく予定です。
今回はAWS CodeBuildでAWS CodeArtifactを使うとどうなるのかを検証します。なお、環境セットアップについては以下の記事を参考にしてください。
【AWS】AWS CodeArtifactをAWS CodeBuildで検証する(準備編)
前回のおさらい
前回は環境を構築しましたが、実際のところどのような構成だったのでしょうか。ここでおさらいしておきましょう。
サービスアイコンを並べただけですが、前回作った構成は以下のようになります。
CodeBuildではS3、サービス同士はIAMロールを利用しています。
※今回説明したいサービスにフォーカスしてもらいたいために省略
CodeBuildでCodeArtifactを利用する場合
CodeBuildのおさらいになりますが、CodeBuildはビルドを実行したときのみマシンを起動してビルドを実行します。つまり、CodeArtifactの設定はCodeBuild起動時に行わないといけません。
設定手順としては以下のとおりです。
- AWS CLIをインストールする
- CodeArtifactにログインする
CodeBuild で npm パッケージを使用する - 参考
※AWS CLIがインストールされている場合はインストールの必要はありません。
2つの工程をCodeBuildのpre_build
のステップで実行します。
ハンズオン
ではここから実際にハンズオンしてみましょう。
IAMロールを確認する
今回はCodeBuildでCodeArtifactにアクセスするため、CodeArtifactにアクセスするためのIAMポリシーをCodeBuildのIAMロールが持っていないといけません。
では、そのポリシーがどこに定義されているのかを確認します。具体的には前回使ったリポジトリ内にあるcodebuild-role.yml
というファイルです。
AWSTemplateFormatVersion: 2010-09-09
Description: "CodeBuild IAM Role"
Parameters:
PjName:
Type: String
Default: Qiita
Resources:
QiitaCodeBuildRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: QiitaCodeBuildRole
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service: "codebuild.amazonaws.com"
Action: "sts:AssumeRole"
ManagedPolicyArns:
- !Ref QiitaCodeBuildPolicy
Tags:
- Key: Name
Value: !Sub "${PjName}"
QiitaCodeBuildPolicy:
Type: "AWS::IAM::ManagedPolicy"
Properties:
ManagedPolicyName: codebuild-role
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action:
- "codeartifact:GetAuthorizationToken"
- "codeartifact:GetRepositoryEndpoint"
- "codeartifact:ReadFromRepository"
Resource:
- "*"
- Effect: Allow
Action:
- "sts:GetServiceBearerToken"
Resource: "*"
Condition:
StringEquals:
sts:AWSServiceName: "codeartifact.amazonaws.com"
- Effect: Allow
Action:
- "logs:CreateLogStream"
- "logs:PutLogEvents"
- "logs:CreateLogGroup"
Resource: "*"
- Effect: Allow
Action:
- "s3:PutObject"
- "s3:GetObject"
- "s3:GetObjectVersion"
- "s3:GetBucketAcl"
- "s3:GetBucketLocation"
Resource:
- !Join
- ""
- - !ImportValue QiitaBucketArn
- "/*"
- !ImportValue QiitaBucketArn
Outputs:
QiitaCodeBuildRoleName:
Value: !Ref QiitaCodeBuildRole
Export:
Name: CodeBuildRoleName
実は環境構築時に定義しています。
buildspec.ymlを修正
次にCodeBuildの設定ファイルとなるbuildspec.yml
を修正します。
AWSマネジメントコンソールを開き、CodeCommitを検索してクリックします。
画面左側のRepositories
をクリックします。
画面が切り替わりますのでQiitaというリポジトリ名をクリックします。
リポジトリ内のファイル一覧が表示されたらReference
をcode_build_handson
に切り替えます。
画面が切り替わるので次はbuildspec.yml
をクリックします。
Edit
をクリックしてbuildspec.yml
を編集します。
現在の設定は以下のようにechoするだけのものとなっているはずです。
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker image...
上記の設定を下記のように書き換えます。
version: 0.2
phases:
pre_build:
commands:
- aws codeartifact login --tool npm --domain $AWS_DOMAIN --domain-owner $AWS_ACCOUNT_ID --repository $REPOSITORY_NAME
build:
commands:
- npm install sample-package@1.0.0
post_build:
commands:
- node index.js
- echo completed on `date`
編集が完了したらCommit changes
をクリックします。
次にindex.js
をアップロードします。Upload file
をクリックします。
index.js
は以下のようにシンプルな内容です。
const test = require('sample-package');
test();
アップロードが完了したら、Commit changes
をクリックします。
同じ要領でpackage.json
をアップロードします。
package.json
は以下のようにシンプルな内容です。
{
"name": "sample-app",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"sample-package": "^1.0.0"
}
}
プルリクエストを作成してマージを実行する
リポジトリのファイル一覧に戻ってCreate pull request
をクリックします。
mainブランチにcode_build_handsonブランチの変更内容をマージするため、Create pull request
を実行します。
次の画面でMerge
をクリックします。
Fast forward merge
を選択し、Merge pull request
をクリックします。
Codepipelineの画面に移動するとIn progress
となっています。しばらく待ちましょう。
※以下、ビルド中の画面
実行結果
うまくいくと40行目でHello CodeArtifact!!
と表示されます。これでCodeBuildからCodeArtifactのパッケージを参照できるようになりました。
まとめ
2つの記事にわたってAWS CodeArtifactをAWS CodeBuildで検証する方法を書きました。
CodeBuildでCodeArtifactを利用すると今回紹介したように独自のパッケージをプライベートにホストしたり、OSSで特定のバージョンのみをAWS上に置いてアプリケーションをテストしたりなどができます。
また、CodeArtifactを通すことなく、パッケージをインストールした場合はパブリックレジストリを参照するため、場合によっては悪意のあるコードが埋め込まれてしまいます。
つまり、セキュリティという文脈ではサプライチェーン攻撃の予防にも役立ちます。
再現性のあるプログラムを作成するためにもセキュリティのためにも実装してみると良いかもしれません。
ちなみに試せてはいないですが、CodeBuildのビルド速度も体感レベルで速くなったような気がしています。気がするだけなので別の記事でしっかり検証したいと思います。