JenkinsからAssumeRoleを使って別AWSアカウントのCodeBuildプロジェクトを起動する。

記事タイトルとURLをコピーする

こんにちは。今期から技術1課に移動しました、岩本です。

弊社は、割と柔軟に他部署への転属希望が出しやすく、新しく所属した技術1課は、
よくあるインフラではなく、開発やデプロイメントなどを中心に扱う事が多い課です。
ここ最近は、JenkisnとCodeBuildと戯れる日々が続いています。

本題

やりたい事

  • AWSアカウントAにあるJenkinsサーバーから、AWSアカウントBにあるCodeBuildプロジェクトを実行したい。
  • CodeBuildプロジェクトの起動は、(セキュリティ的な観点から)クレデンシャルではなくAssumeRoleを利用したい。

手順

準備

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'
  }
}

まとめ

  • 上記の様に設置することで、一部でアクセスキー/シークレットキーの利用はありますが、
    比較的セキュアに認証情報の付与が行えます。ぜひご利用ください。