LoginSignup
0
0

はじめに

この記事では「この前リリースされた機能って実際に動かすとどんな感じなんだろう」とか「もしかしたら内容次第では使えるかも??」などAWSサービスの中でも特定の機能にフォーカスしたり、サービス間連携を検証していく記事です。
主な内容としては実践したときのメモを中心に書きます。(忘れやすいことなど)誤りなどがあれば書き直していく予定です。

今回はAWS CodeBuildでAWS CodeArtifactを使うとどうなるのかを検証します。なお、環境セットアップについては以下の記事を参考にしてください。

【AWS】AWS CodeArtifactをAWS CodeBuildで検証する(準備編)

前回のおさらい

前回は環境を構築しましたが、実際のところどのような構成だったのでしょうか。ここでおさらいしておきましょう。

サービスアイコンを並べただけですが、前回作った構成は以下のようになります。
CodeBuildではS3、サービス同士はIAMロールを利用しています。
※今回説明したいサービスにフォーカスしてもらいたいために省略

image.png

CodeBuildでCodeArtifactを利用する場合

CodeBuildのおさらいになりますが、CodeBuildはビルドを実行したときのみマシンを起動してビルドを実行します。つまり、CodeArtifactの設定はCodeBuild起動時に行わないといけません。

設定手順としては以下のとおりです。

  1. AWS CLIをインストールする
  2. 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を検索してクリックします。

Screenshot 2024-06-15 at 19.07.33.png

画面左側のRepositoriesをクリックします。

Screenshot 2024-06-15 at 19.10.29.png

画面が切り替わりますのでQiitaというリポジトリ名をクリックします。

Screenshot 2024-06-15 at 19.11.39.png

リポジトリ内のファイル一覧が表示されたらReferencecode_build_handsonに切り替えます。

Screenshot 2024-06-15 at 19.12.16.png

画面が切り替わるので次はbuildspec.ymlをクリックします。

Screenshot 2024-06-15 at 19.12.31.png

Editをクリックしてbuildspec.ymlを編集します。

Screenshot 2024-06-15 at 19.12.44.png

現在の設定は以下のように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をクリックします。

Screenshot 2024-06-15 at 19.23.59.png

次にindex.jsをアップロードします。Upload fileをクリックします。

Screenshot 2024-06-15 at 19.24.45.png

index.jsは以下のようにシンプルな内容です。

index.js
const test = require('sample-package');
test();

Screenshot 2024-06-15 at 19.25.49.png

アップロードが完了したら、Commit changesをクリックします。
同じ要領でpackage.jsonをアップロードします。

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をクリックします。

Screenshot 2024-06-15 at 20.10.09.png

mainブランチにcode_build_handsonブランチの変更内容をマージするため、Create pull requestを実行します。

Screenshot 2024-06-15 at 19.26.28.png

次の画面でMergeをクリックします。

Screenshot 2024-06-15 at 19.26.43.png

Fast forward mergeを選択し、Merge pull requestをクリックします。

Screenshot 2024-06-15 at 19.26.59.png

Codepipelineの画面に移動するとIn progressとなっています。しばらく待ちましょう。

Screenshot 2024-06-15 at 19.27.20.png

※以下、ビルド中の画面

Screenshot 2024-06-15 at 19.27.35.png

実行結果

うまくいくと40行目でHello CodeArtifact!!と表示されます。これでCodeBuildからCodeArtifactのパッケージを参照できるようになりました。

Screenshot 2024-06-15 at 20.00.49.png

まとめ

2つの記事にわたってAWS CodeArtifactをAWS CodeBuildで検証する方法を書きました。
CodeBuildでCodeArtifactを利用すると今回紹介したように独自のパッケージをプライベートにホストしたり、OSSで特定のバージョンのみをAWS上に置いてアプリケーションをテストしたりなどができます。

また、CodeArtifactを通すことなく、パッケージをインストールした場合はパブリックレジストリを参照するため、場合によっては悪意のあるコードが埋め込まれてしまいます。
つまり、セキュリティという文脈ではサプライチェーン攻撃の予防にも役立ちます。

再現性のあるプログラムを作成するためにもセキュリティのためにも実装してみると良いかもしれません。

ちなみに試せてはいないですが、CodeBuildのビルド速度も体感レベルで速くなったような気がしています。気がするだけなので別の記事でしっかり検証したいと思います。

おわり

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0