BitbucketからCodeCommitを同期する方法を解説

BitbucketからCodeCommitを同期する方法を解説

Hiroyuki Kikuchi

Hiroyuki Kikuchi

Technology部の菊池です。

この記事では、BitbucketからAWSのCodeCommitへリポジトリを同期する方法について解説します。

AWSのCodePipelineは直接Bitbucketをサポートしていません。そのため、BitbucketとCodePipeline間で連携を取るには、CodeCommit上にプロキシ用のリポジトリを設定し、そこでCommitをハンドリングする必要があります。

CodeCommitへのCommitが行われたことをトリガーにしてAWSのCodePipelineを起動すれば、サーバーへのデプロイを実行できるようになります。

今回はこのプロセスを設定する手順について、詳しく説明していきます。

ソフトウェア構成について

今回説明するソフトウェア構成は以下の通りとします。

Bitbucketからのコードコミットに対して、Bitbucket内でWorkflowというCI/CDを実行することで、AWS CodeCommitに対して、CommitをPushするフローです。

CodeCommitの設定内容

Bitbucketの方は連携対象とするリポジトリを用意してください。CodeCommitについては、以下の設定が必要となります。

リポジトリ作成

まずはAWS上のCodeCommitに対してリポジトリの構築が必要となるため、以下の通りCodePiplineを使ってリポジトリ作成を実施します。
※CodePiplineを実行可能なポリシーの設定に関する説明は、今回は割愛させていただきます。

yaml
AWSTemplateFormatVersion: '2010-09-09'
Description: codecommit with code

Resources:
  codecommit:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: xxxxxx
      RepositoryDescription: xxxxxx

Bitbucketリポジトリとのミラーリング

BitbucketのコミットをAWS CodeCommitにプッシュするためには、まず既存のジャーナル情報をCodeCommitにコピーすることが必要です。そのために「ミラーリング」と呼ばれる方法を用います。

CodeCommitにリポジトリをミラーリングするにはHTTPS方式とSSH方式の2つの方法があります。BitbucketからCodeCommitへのパイプラインを利用してプッシュできるようにするため、よりセキュアな公開鍵暗号化方式を使用するSSH方式を採用しました。

以下にその方法を記載します。

1.公開鍵と秘密鍵を作成する

ローカルPCからCodeCommitへデータを送信する際には、暗号化のため公開鍵と秘密鍵の生成が必要です。公開鍵はデータの暗号化に、秘密鍵はその復号に使用します。以下がその手順です(Macにおける手順です)。

console
ssh-keygen

上記コマンドを実行した後、次のコマンドで公開鍵を取得し、それをコピーします。

console
cat /Users/{各自のPC名}/.ssh/id_rsa.pub

2.IAMユーザーの作成

BitbucketのパイプラインからCodeCommitにコミットをプッシュするには、適切なAWS IAMのパーミッションが必要です。

そのため、以下のパーミッションを有するIAMユーザーを作成します。

AWSCodeCommitFullAccess

今回は例としてFullAccess権限を与えますが、本来はセキュリティを考慮して可能な限りアクセス可能なARNは絞るべきなので、プロジェクトに応じて適宜調整をしてください。

3.秘密鍵のIAMユーザーへの登録とSSHキーの取得

BitbucketのブランチからCodeCommitへデータ転送する場合、公開鍵によって暗号化されて、秘密鍵によって復号化されます。

さきほど作成したIAMユーザーに対して、セキュリティ情報の中のAWS CodeCommitのSSH公開キー設定にて、ステップ1で作成した秘密鍵情報を登録し、SSHキー情報を取得してください。

4.リポジトリのミラーリング設定

BitbucketとCodeCommitのリポジトリ間でCommitがPushできるように、両リポジトリの状態を同期させる必要があります。そのためには、ローカルPCから最新のリポジトリをダウンロードし、ミラーリングの設定を行います。

ミラーリングを実行するためには、ローカルPCのSSHについて、取得したSSHキーとホスト情報を設定してください。SSHのConfig設定は、さきほど取得したSSHキーを使用して、以下のように実施します。

console
Host git-codecommit.*.amazonaws.com
  User {sshキー}
  IdentityFile ~/.ssh/id_rsa

上記が完了したら、BitbucketとCodeCommitのリポジトリを以下のコマンドを実施してミラーリングを実行します。

yaml
## 1. ミラーリング元リポジトリをローカルに取得
$ git clone --mirror <リポジトリ元のリポジトリアドレス>
$ cd <cloneされたリポジトリ名>

## 2. push先だけミラーリング先リポジトリに差し替えて確認
$ git remote set-url --push origin <codecommitのリポジトリアドレス(SSH)>

## 3. ローカルをミラーリング先リポジトリにpush
$ git push --mirror

パイプラインの設定

SSHキーの設定

特定のブランチにソースコードがプッシュされた際に、CodeCommitにも自動的にプッシュされるように、Bitbucketのパイプラインを設定します。

以下の手順に沿って、先ほど作成した公開鍵とSSHキーをパイプラインに設定してください。

  1. リポジトリ上で「パイプライン」にアクセスし、「SSH Keys」を選択
  2. ①の欄に、IAMユーザーの作成で生成されたSSHキーを設定する
  3. ②の欄に、公開鍵と秘密鍵を作成するで生成された公開鍵を設定する生成されたSSHキーを「SSH Keys」セクションに入力
  4. ③には、git-codecommit.ap-northeast-1.amazonaws.comと入力し、Fetchボタンをクリック(この際、Add hostボタンが表示されたらクリックしてください)

bitbucket-pipelines.yml設定

特定ブランチにおいてPRが作成された際に、パイプラインがRunできるようにbitbucket-pipelines.ymlを作成します。

以下の通り、developブランチにPR作成ならびにマージした際のパイプラインのyamlの例を定義しました(開発コードはNode.jsを使用する想定)。

yaml
image: public.ecr.aws/sam/build-nodejs16.x

pipelines:
  default:
    - parallel:
      - step:
          name: Run test
          caches:
            - node
          script:
            - cd ./sample/app && npm i && npm run test
      - step:
          name: Run eslint
          caches:
            - node
          script:
            - cd ./sample/app && npm i && npm run lint
  branches:
    develop:
      - step:
          image: 'atlassian/default-image:2'
          name: Build image & deploy to test
          deployment: Develop
          script:
            - echo $CodeCommitConfig > ~/.ssh/config.tmp
            - base64 -d  ~/.ssh/config.tmp > ~/.ssh/config
            - cat ~/.ssh/config
            - set +e
            - ssh -o StrictHostKeyChecking=no $CodeCommitHost
            - set -e
            - git remote add codecommit ssh://$CodeCommitRepo
            - git push codecommit develop

さいごに

BitbucketからAWSのCodeCommitへリポジトリを同期する方法について解説しました。

今回ご紹介した方法でCodePipelineを起動すれば、簡単にサーバーへのデプロイを実行できるようになります。ご参考になれば幸いです。

また、LIGブログではアプリ・システム開発やAIなど、テクノロジーに関するお役立ち記事をお届けするメルマガを配信しています。

<お届けするテーマ>
  • 開発プロジェクトを円滑に進めるためのTIPS
  • エンジニアの生産性が上がった取り組み事例
  • 現場メンバーが生成AIを使ってみた
  • 開発ツールの使い方や開発事例の解説
  • AIをテーマにしたセミナーの案内
  • 最新のAI関連ニュースまとめ など

「開発ツールの解説や現場の取り組みを知りたい!」「AIに関する最新情報を集めたい!」とお考えの方は、ぜひお気軽に無料のメルマガをご購読くださいませ。

購読する(無料)

この記事のシェア数

2004年大学卒業後に大手SIerにて組み込み系エンジニアとして10年従事。一度はIT業界から足を洗う形にはなるものの、2016年からSES企業にてサイドエンジニアとしてチャレンジ。2020年からLIGにジョインし、様々な案件のテクニカルディレクター並びにプロジェクトマネージャーとして参加する。

このメンバーの記事をもっと読む
10年以上の開発実績があるLIGが、最適な開発体制や見積もりをご提案します
相談する サービス概要を見る