SSHキーを使わずにEC2から異なるAWSアカウントのCodeCommitのリポジトリをクローンする
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キーを管理するのもめんどくさいっ!って時にぴったりハマると思います。ぜひご活用ください。