SSHキーを使わずにEC2から異なるAWSアカウントのCodeCommitのリポジトリをクローンする

git-remote-codecommitを使うと、SSHキーを使わずにCodeCommit上のリポジトリからgit cloneができます。 今回はgit-remote-codecommitを利用して、異なるAWSアカウントのCodeCommitのリポジトリをクローンする方法を紹介します。
2020.03.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

git-remote-codecommitを使うと、SSHキーを使わずに(IAMの権限で)CodeCommit上のリポジトリから git clone ができます。

具体的には次のようなURLでリポジトリを指定できます。

$ git clone codecommit::{リージョン名(※省略可)}://{プロファイル名@(※省略可)}{リポジトリ名}

詳細は弊社ブログを御覧ください。

今回はgit-remote-codecommitを利用して、異なるAWSアカウントのCodeCommitのリポジトリをクローンする方法を紹介します。

イメージ図

アカウントAをCodeCommitがあるアカウントとします。アカウントBをCodeCommitへアクセスしたいEC2があるアカウントとします。 次の図のような構成になっています。

前提

アカウントA

  • CodeCommitでリポジトリが作成されていること
    • 今回は「sample-git」という名前のリポジトリを作成しています

アカウントB

  • 外部インターネットに接続可能なEC2(AmazonLinux2)が作成されていること
  • そのEC2がSSHまたはセッションマネージャーでシェルにログイン可能であること
    • 今回はセッションマネージャーを利用してシェルにログインします

アカウントAでIAM Roleの作成

まずは、アカウントBからアカウントAのCodeCommitにアクセス可能な権限をもつIAM Roleを作成します。

マネジメントコンソールの画面からIAM Roleを作成します。 信頼されたエンティティの種類で「別のAWSアカウント」を選び、アカウントIDに アカウントBのアカウントID を入力します。

アタッチするポリシーに、 AWSCodeCommitReadOnly を選択します。

タグの設定は必要ないので次へ進みます。

IAM Roleに適当な名前をつけて、ロールを作成します。今回は、 IAMRole-AccountA という名前にしています。

アカウントBでIAM Roleの作成

次に、先ほど作ったIAM Roleを利用して一時クレデンシャルキーが発行可能なIAM RoleをアカウントBに作成します。

マネジメントコンソールの画面からIAM Roleを作成します。 信頼されたエンティティの種類で「AWSサービス」を選び、ユースケースでは EC2 を選択します。

今回はセッションマネージャーを利用するので、セッションマネージャーを利用するためのポリシー AmazonSSMManagedInstanceCore をアタッチしておきます。

タグの設定は必要ないので次へ進みます。

IAM Roleに適当な名前をつけて、ロールを作成します。今回は、 IAMRole-AccountB という名前にしています。

作成したIAM Roleに対して、インラインポリシーを追加します。

アカウントAで作成したIAMRoleのARNを利用します。ポリシーJSONのResourceの部分を、ARNに置き換えてください。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::{アカウントAのAWSID}:role/IAMRole-AccountA"
  }
}

作成したIAM RoleのARNはのちほど使うので控えておきます。

arn:aws:iam::{アカウントBのAWSID}:role/IAMRole-AccountB

アカウントBでEC2にIAM Roleの割り当て

先ほど作成したIAM RoleをアカウントBのEC2に割り当てます。

割り当てられたら、SSHまたはセッションマネージャーでEC2のシェルにログインします。

EC2でGitリポジトリをクローンする

アカウントBのEC2からアカウントAのCodeCommitのGitリポジトリをクローンしていきます。

まずは、 git-remote-codecommit をインストールします。

$ sudo yum install git python3-pip -y
$ sudo pip3 install git-remote-codecommit

次にプロファイルの設定をします。 ~/.aws/config に次のcodecommitプロファイルを追記することで、アカウントAのCodeCommitをReadOnly権限で操作できます。

[profile codecommit]
role_arn = arn:aws:iam::{アカウントAのAWSID}:role/IAMRole-AccountA
credential_source = Ec2InstanceMetadata
region = ap-northeast-1

プロファイルにIAM Roleを使用する方法の詳細は、公式ドキュメントを参照ください。

AWS CLIコマンドを使って、アカウントAのCodeCommitリポジトリが参照できれば成功です。

$ aws codecommit list-repositories --profile codecommit
{
    "repositories": [
        {
            "repositoryName": "sample-git",
            "repositoryId": "8d8daed4-3b99-43b4-9ee0-d4f58e708809"
        }
    ]
}

ここまで設定できれば、codecommitプロファイルを利用して、git-remote-codecommitで簡単にcloneできます。

$ git clone codecommit::ap-northeast-1://codecommit@sample-git

終わりに

SSHキーを使わずに、異なるAWSアカウントのCodeCommitのリポジトリをクローンする方法を紹介しました。

プログラムを保存したCodeCommitのリポジトリは1つのAWSアカウントで管理していて、他のAWSアカウントのEC2にデプロイする時にcloneしたい。でも、SSHキーを管理するのもめんどくさいっ!って時にぴったりハマると思います。ぜひご活用ください。