こんにちは。今期から技術1課に移動しました、岩本です。
弊社は、割と柔軟に他部署への転属希望が出しやすく、新しく所属した技術1課は、
よくあるインフラ
ではなく、開発やデプロイメントなどを中心に扱う事が多い課です。
ここ最近は、JenkisnとCodeBuildと戯れる日々が続いています。
本題
やりたい事
- AWSアカウントAにあるJenkinsサーバーから、AWSアカウントBにあるCodeBuildプロジェクトを実行したい。
- CodeBuildプロジェクトの起動は、(セキュリティ的な観点から)クレデンシャルではなく
AssumeRole
を利用したい。
手順
準備
- 先ずは事前準備として、JenkinsにCodebuild Pluginをインストールします。
AWS(IAM)の設定
- AWSアカウントA(Jenkinsが稼働しているAWSアカウント)にて、IAMユーザーを作成し、シークレットキー/アクセスキーを生成します。
- この際、該当IAMユーザーへの権限の付与は不要です。
- AWSアカウントB(Codebuildが起動するAWSアカウント)にて、該当のCodebuildプロジェクトの実行権限を持ったRoleを作成し、アカウントAを信頼する様に設定します。
- JenkinsからCodebuildへソースファイルの送信はS3を経由するため、特定のS3バケットへのアクセス権限も必要です。
- 記載は以下の通り。
trust relationship
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::12345678909:root"
},
"Action": "sts:AssumeRole"
}
]
}
Jenkinsの設定
- Jenkin画面より
認証情報
を開き、認証情報を登録します。- 種類:
CodebuildCredensials
- ID:Jenkin内で使用する名前(任意・ここでは
sample-id
と設定) - アクセスキー:
AWSアカウントAで作成したアクセスキー
- シークレットキー:
AWSアカウントAで作成したシークレットキー
- 高度な設定/RoleArn:
AWSアカウントBで作成したRoleのARN
- 種類:
JenkinsFile
- Jenkinsfileには以下のように記載します。
node {
stage('checkout') {
checkout scm
}
stage('build') {
awsCodeBuild projectName: "sample-project",
//Codebuildのプロジェクト名を指定
region: 'ap-northeast-1',
sourceControlType: 'jenkins',
credentialsType: 'jenkins',
credentialsId: 'sample-id',
//Jenkinsに設定したIDを指定
buildSpecFile: buildspec.yml,
artifactLocationOverride: 's3-backet-name',
artifactNameOverride: '/',
artifactPathOverride: "/${env.JOB_NAME}/${env.BUILD_ID}/",
artifactPackagingOverride: 'NONE',
artifactTypeOverride: 'S3'
}
}
まとめ
- 上記の様に設置することで、一部でアクセスキー/シークレットキーの利用はありますが、
比較的セキュアに認証情報の付与が行えます。ぜひご利用ください。