CodeCommitへのクロスアカウントアクセスを試してみた

ご機嫌いかがでしょうか、豊崎です。

本日は、CodeCommitへクロスアカウントアクセスする方法をご紹介したいと思います。

具体的にはこんなことをしようと思います。

イメージ図

アカウントAを、Code Commitのある側のアカウントとします アカウントBを、Code CommitへアクセスしたいIAMユーザがいるアカウントとします

 前提

以下が設定されていることを前提として進めていきます。

アカウントA

  • 管理者IAMユーザには「IAM FullAccess」、「AWSCodeCommitFullAccess」が割り当てられていること
  • CodeCommitリポジトリが作成されていること
    • ここでは「demo-repo」という名前でリポジトリを作成しています

アカウントB

  • 管理者IAMユーザには「IAM FullAccess」が割り当てられていること
  • リポジトリユーザ(アカウントAのCode Commitを操作するユーザ)には以下を許可します
    • AWSコンソールへのアクセス
    • AWS CLI用のアクセスキー、シークレットアクセスキーの払い出し

リポジトリユーザのローカルPC

  • ローカルPCはMacBookPro:Mojave 10.14.3

やってみた

アカウントAでの設定

まずはアカウントBからリポジトリにアクセスするポリシーを作成します。 以下ポリシーでは、「リポジトリの一覧の表示」および「特定のリポジトリへのアクセス」を許可しています。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codecommit:BatchGet*",
                "codecommit:Create*",
                "codecommit:DeleteBranch",
                "codecommit:Get*",
                "codecommit:List*",
                "codecommit:Describe*",
                "codecommit:Put*",
                "codecommit:Post*",
                "codecommit:Merge*",
                "codecommit:Test*",
                "codecommit:Update*",
                "codecommit:GitPull",
                "codecommit:GitPush"
            ],
            "Resource": [
                "arn:aws:codecommit:ap-northeast-1::アカウントAのAWS ID:demo-repo"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "codecommit:ListRepositories",
            "Resource": "*"
        }
    ]
}

次に上記ポリシーをアタッチしたIAMロールを作成します。 信頼関係として、アカウントBのAWSアカウントIDを入力します。

作成したIAMロールのARNはアカウントBで作成するポリシー内で利用するので控えておきます。

arn:aws:iam::アカウントAのAWS ID:role/demo-0225-code-commit-crossaccount

アカウントBでの設定

IAMグループを作成してグループ単位でアカウントAのCode Commitにアクセスできる様に設定をしていきましょう。 開発チームのメンバーに増減があっても、IAMグループへのIAMユーザ追加削除で対応ができ運用が楽になります。

まずは、IAMグループを作成してグループにインラインポリシーを設定します。

{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::アカウントAのAWS ID:role/demo-0225-code-commit-crossaccount"
  }
}

最後にIAMユーザを作成してIAMグループに追加します。手順は割愛しますがAWSマネジメントコンソールの利用許可とアクセスキー、シークレットアクセスキーの発行して控えておきます。 ※ローカルPCで使用します。

アカウントBのリポジトリユーザが行う設定

リポジトリにアクセスしたいユーザのローカルPCで行なっていきます。

前提に記載した通りローカルPCは「MacBookPro:Mojave 10.14.3」を利用しています。 また、AWS CLI、Gitのバージョンは以下です。

$ aws --version
aws-cli/1.16.112 Python/2.7.10 Darwin/18.2.0 botocore/1.12.102
$ git --version
git version 2.17.2 (Apple Git-113)

続いてAWS CLIにCodeCommitに接続するためのクレデンシャルの登録をしていきます。

$ aws configure --profile demo-commit-0226
AWS Access Key ID [None]: xxxxxxxxxxxxxxxx
AWS Secret Access Key [None]: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]: ap-northeast-1
Default output format [None]: 

登録したクレデンシャルが記述されたファイルを確認します。 こんな感じに登録されていると思います。

$ cat ~/.aws/config
[profile demo-commit-0226]
region = ap-northeast-1
$ cat ~/.aws/credentials
[demo-commit-0226]
aws_access_key_id = xxxxxxxxxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

configファイルに以下の2行を登録します。

$ vi ~/.aws/config
[profile demo-commit-0226]
region = ap-northeast-1
role_arn = arn:aws:iam::アカウントAのAWS ID:role/demo-0225-code-commit-crossaccount
source_profile = demo-commit-0226

次にgit関連の設定を行います。

1)AWS認証ヘルパーの設定
$ git config --global credential.helper '!aws --profile demo-commit-0226 codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true

---念の為、gitconfigを確認します。(私はうまく登録できてなかったのでviで正しく上書きしました)---
$ cat ~/.gitconfig
[credential]
        helper = "!aws --profile demo-commit-0226 codecommit credential-helper $@"
        UseHttpPath = true

2)必要に応じてキーチェーンのコメントアウト
$ git config -l --show-origin
file:/Library/Developer/CommandLineTools/usr/share/git-core/gitconfig   credential.helper=osxkeychain
・
・
$ vi /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
[credential]
        #helper = osxkeychain  ・・・コメントアウト

確認してみます

ついにCodeCommitを利用できる状態になりましたので、適当なディレクトリを作成してその中でgit cloneをしてみます。

$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/demo-repo
Cloning into 'demo-repo'...
remote: Counting objects: 6, done.
Unpacking objects: 100% (6/6), done.
$ tree
.
└── demo-repo
    ├── memo.md
    └── test.txt

無事クロスアカウントでCodeCommitにアクセスすることができました。

AWSマネジメントコンソールからもCodeCommitのリポジトリが参照できるか確認してみます。

まずアカウントAで作成したIAMロールの画面でスイッチ用のURLを控えておきます。

次にアカウントBで作成したIAMユーザでマネジメントコンソールにログインします。

その後、ログインした状態でスイッチ用のURLにアクセスします。表示名は任意の名前を入力しましょう。

CodeCommitのダッシュボードからリポジトリが参照してみます。

無事参照することができました。

さいごに

会社の環境で利用する時にクロスアカウントの設定が必要だったので調べました。 ベンダーの方などに払い出す際に参考になるのではないかと思います。この記事が誰かのお役に立てば幸いです。

参考

https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/cross-account.html