背景
CodeCommit・CodeBuild・CodeDeploy・CodePipeline(Code 4兄弟)とCodeArtifactを組み合わせて、GitHubに一切依存しない完全AWS内CI/CDパイプラインを構築するハンズオンをやりました。CodeArtifactが単なる社内ライブラリ置き場ではなく、Maven Central自体のプロキシとしても機能する点が発見でした。
1. CodeArtifactは社内ライブラリと外部ライブラリを同じリポジトリで扱う
mvn package
└─ CodeArtifact (my-cp-libs)
├── 社内ライブラリ: com.example:common-utils:1.0.0 ← CodeBuildがpublish
└── 外部ライブラリ: org.springframework.boot:* ← Maven Centralから透過的に取得
社内で管理する共通ライブラリと、Spring BootなどのMaven Central上の外部ライブラリが、同じCodeArtifactリポジトリ経由で取得されます。外部依存関係も一度取得されるとCodeArtifact内にキャッシュされるため、2回目以降のビルドはインターネット接続なしでも再現性高く完了します。
2. buildspec.ymlはCodeArtifactの認証トークンを毎回取得する
pre_build:
commands:
- CODEARTIFACT_TOKEN=$(aws codeartifact get-authorization-token ...)
- CODEARTIFACT_URL=$(aws codeartifact get-repository-endpoint ...)
CodeArtifactの認証トークンは12時間有効な一時トークンです。buildspec.ymlのpre_buildフェーズで毎回取得する設計になっているため、トークンの有効期限切れを人間が管理する必要がありません。次のビルド実行時に自動的に新しいトークンが取得されます。
3. pom.xmlにURLを直書きせず、実行時に-Dオプションで渡す
<!-- pom.xml: プレースホルダーのまま -->
<url>${codeartifact.url}</url>
# buildspec.yml: 実行時に値を注入
- mvn deploy -f common-lib/pom.xml -Dcodeartifact.url="$CODEARTIFACT_URL"
- mvn package -f app/pom.xml -DskipTests -Dcodeartifact.url="$CODEARTIFACT_URL"
CodeArtifactのリポジトリエンドポイントはアカウントやリージョンによって変わる動的な値のため、pom.xmlにハードコードせずプレースホルダーのままにしておき、buildspec.yml側から-Dcodeartifact.url=で実行時に注入します。pom.xmlを環境ごとに編集する必要がありません。
4. git-remote-codecommitでAWS CLI認証のままCodeCommitにpushする
pip install git-remote-codecommit
git clone codecommit::ap-northeast-1://my-cpapp %TEMP%\my-cpapp
CodeCommitへのpush用に別途Git認証情報を作る必要はありません。git-remote-codecommitをインストールするとcodecommit::というプレフィックス付きURLが使えるようになり、既存のAWS CLI認証情報がそのままGit操作に流用されます。認証プロンプトも一切出ません。
5. CodeArtifactのドメイン削除にはパッケージの事前削除が必要
aws codeartifact delete-package-versions --domain my-domain --repository my-libs --format maven --namespace com.example --package common-utils --versions 1.0.0
aws codeartifact delete-package --domain my-domain --repository my-libs --format maven --namespace com.example --package common-utils
CodeArtifactにパッケージが1つでも登録された状態だと、CloudFormationスタックの削除(ドメイン削除を含む)が失敗します。S3バケットを空にしてから削除するのと同様、CodeArtifactもパッケージバージョン→パッケージの順に手動削除してからスタック削除に進む必要があります。
まとめ
CodeArtifactが社内ライブラリの配布だけでなくMaven Centralのプロキシとしても機能する点と、git-remote-codecommitによるAWS CLI認証のままのGit操作が、このハンズオンでの大きな発見でした。GitHub Actionsを使う構成と比べ「すべてがAWS内で完結する」という設計思想を実際のコマンドで体感できます。