AWS Cloud9 から別アカウントの AWS CodeCommit に接続する

こんにちは、広野です。

AWS Cloud9 と AWS CodeCommit が新規 AWS アカウントで利用不可、という方針が AWS から打ち出されました。今後の代替ソリューションは色々なパターンがありますので調査もままならない、なかなか決めきれない状況の方が多いのではないかと想像します。

とは言え開発を進めなければならない状況はあり、私も取り急ぎタイトルに書いた対応を暫定的に実施しましたので、一度整理して残しておこうと思います。

置かれていた状況

以下のように、新規作成したアカウント A で AWS を活用してアプリ開発をしたかったが、AWS Cloud9 が利用不可になっていた、という状況です。AWS CodeCommit は利用可能でした。

実施したこと

既存のアカウント B では AWS Cloud9 が利用できたので、取り急ぎそちらを使うことにしました。

作業手順

1. アカウント A で AWS CodeCommit リポジトリを作成する

これについては、AWS ドキュメント通りです。

2. アカウント A で AWS CodeCommit リポジトリにアカウント B からのアクセスを許可する

こちらも AWS ドキュメント通りです。

アカウント A にアカウント B からのアクセスを許可する IAM ロールを作成します。コンソールで作成するのが面倒だったので、以下の AWS CloudFormation テンプレートでも作成できます。この IAM ロールの ARN をアカウント B に提供します。AWS CloudFormation テンプレートを使用した場合、対象の AWS CodeCommit リポジトリ名とアクセスを許可する AWS アカウント ID (ここではアカウント B の) をパラメータとして入力します。結果として、出力タブに IAM ロールの ARN が表示されます。

AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that creates an IAM Role to allow the cross account access to the CodeCommit.

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
  SystemName:
    Type: String
    Description: System name. (e.g. example)
    Default: example
    MaxLength: 10
    MinLength: 1

  SubName:
    Type: String
    Description: System sub name. (e.g. dev)
    Default: dev
    MaxLength: 10
    MinLength: 1

  CodeCommitRepositoryName:
    Type: String
    Description: The target CodeCommit repository name.
    Default: MySharedDemoRepo
    MaxLength: 50
    MinLength: 1

  TargetAwsAccountId:
    Type: String
    Description: The target AWS account ID.
    Default: 999999999999
    MaxLength: 12
    MinLength: 12

Resources:
# ------------------------------------------------------------#
# CodeCommit Access Role (IAM)
# ------------------------------------------------------------#
  CodeCommitAccessRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${SystemName}-${SubName}-CodeCommitAccessRole
      Description: This role allows the target AWS account to access the CodeCommit repository.
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              AWS: !Ref TargetAwsAccountId
            Action:
              - sts:AssumeRole
      Path: /
      Policies:
        - PolicyName: !Sub ${SystemName}-${SubName}-CodeCommitAccessPolicy
          PolicyDocument:
            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:
                  - !Sub "arn:aws:codecommit:${AWS::Region}:${AWS::AccountId}:${CodeCommitRepositoryName}"
              - Effect: Allow
                Action: "codecommit:ListRepositories"
                Resource: "*"

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#
Outputs:
# IAM
  CodeCommitAccessRoleArn:
    Value: !GetAtt CodeCommitAccessRole.Arn

3. アカウント B で AWS Cloud9 用カスタム IAM ロールを作成する

こちらも AWS ドキュメント通りです。

2. で作成したアカウント A の IAM ロール ARN が必要になります。それを使用して、AWS Cloud9 に関連付けるカスタム IAM ロールをアカウント B で作成します。この IAM ロール名をこの後の手順で使用します。以下の AWS CloudFormation テンプレートを使用した場合、IAM ロール名はパラメータに入力した文字列を使用して SystemName-SubName-Cloud9CodeCommitRole という名前で出来上がります。

AWSTemplateFormatVersion: "2010-09-09"
Description: The CloudFormation template that creates an EC2 instantance profile and an IAM role to allow Cloud9 instances to access the CodeCommit repository across the account.

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
  SystemName:
    Type: String
    Description: System name. (e.g. example)
    Default: example
    MaxLength: 10
    MinLength: 1

  SubName:
    Type: String
    Description: System sub name. (e.g. dev)
    Default: dev
    MaxLength: 10
    MinLength: 1

  TargetAccountIamRole:
    Type: String
    Description: The IAM role ARN provided from the target AWS account.
    Default: arn:aws:iam::xxxxxxxxxxxx:role/xxxxxxxxxxxxxxxxxxx
    MaxLength: 100
    MinLength: 1

Resources:
# ------------------------------------------------------------#
# EC2 Role / Instance Profile (IAM)
# ------------------------------------------------------------#
  Ec2Role:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub ${SystemName}-${SubName}-Cloud9CodeCommitRole
      Description: This role allows Cloud9 instances to access the target CodeCommit repository across the account.
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
              - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSCloud9SSMInstanceProfile
      Policies:
        - PolicyName: !Sub ${SystemName}-${SubName}-Cloud9CodeCommitPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "sts:AssumeRole"
                Resource: !Ref TargetAccountIamRole
                Effect: Allow
        - PolicyName: !Sub ${SystemName}-${SubName}-Cloud9QDeveloperPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Action:
                  - "codewhisperer:GenerateRecommendations"
                Resource: "*"
                Effect: Allow

  Ec2InstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: !Ref Ec2Role
      Path: /
      Roles:
        - !Ref Ec2Role
    DependsOn:
      - Ec2Role

このテンプレートには、おまけで Amazon Q Developer からのコード提案を受けられる権限も付けています。

4. アカウント B で AWS Cloud9 環境を作成する

こちらも AWS ドキュメント通りです。

VPC とサブネットは、お使いの環境を適切に選択してください。ネットワーク設定で AWS Cloud9 環境へのアクセス方法を選択しますが、SSM を選択してください。その方が推奨ですし、上記で紹介したカスタム IAM ロールは SSM でアクセスする前提で作成しています。

5. アカウント B で AWS Cloud9 をセットアップする

ここからは、いくつかのマニュアル手順を実施します。公式手順としては以下が参考になるのですが、若干カスタムしたものを後述しますのでご注意ください。

AWS Cloud9 環境は Amazon EC2 インスタンスとして起動します。インスタンスに自動的に関連付けられている IAM ロールを 3. で作成したカスタム IAM ロールに変更します。

Cloud9 環境の画面から EC2 インスタンスの管理 を押し、EC2 インスタンス情報の画面に移ります。

IAM ロールを、3. で作成した IAM ロールに変更します。一度デフォルトの IAM ロールをデタッチしてからアタッチしないとエラーになることがあります。

AWS Cloud9 環境を起動します。画面左上の Cloud9 アイコンから Preference メニューを選択します。AWS Settings から Credentials メニューに進み、AWS managed temporary credentials の設定を OFF (赤) にします。

ターミナルから、Cloud9 環境内にコンフィグファイルを作成します。

ディレクトリを ~/.aws に移動し、config という名前のファイルを作成します。

cd ~/.aws
vi config

config ファイルの中身は以下のように記述します。
profile の CrossAccountCodeCommit の部分は任意の名前で良いですが、6. で登場するコマンドと合わせる必要があります。
role_arn は 2. で作成したアカウント A 側の IAM ロールの ARN です。
region も指定します。

[profile CrossAccountCodeCommit]
role_arn = arn:aws:iam::xxxxxxxxxxxx:role/xxx-xxx-CodeCommitAccessRole
credential_source = Ec2InstanceMetadata
region = ap-northeast-1

以上で AWS Cloud9 環境のセットアップは完了です。

6. アカウント B の AWS Cloud9 からアカウント A の AWS CodeCommit に接続する

environment ディレクトリに戻り、AWS Cloud9 のターミナルで git の初期設定をします。これは通常の git コマンドです。

git config --global user.name "名前"
git config --global user.email メールアドレス

この後 git clone をしますが、同一アカウントの AWS Code Commit に接続するときとコマンドが異なります。
先ほど作成した config ファイルに記入した内容に合わせます。@マーク以下は AWS CodeCommit のリポジトリ名を記入します。

git clone codecommit::ap-northeast-1://CrossAccountCodeCommit@CodeCommitのリポジトリ名

ここまで完了すれば、以降は通常の git コマンドを使用します。git add, git commit, git push, git pull など。

まとめ

いかがでしたでしょうか。

AWS Cloud9 が新規アカウントで利用不可となったので今後長きに亘り重宝される情報ではないですが、一時的には役立つと思います。

Cloud9 って、AWS 上でアプリを公開していて、AWS CodeCommit を使用し、かつクラウド上に開発環境を置きたい人にとっては本当に便利だったんですけどね。今後の利用不可が残念でならないです。

本記事が皆様のお役に立てれば幸いです。

著者について
広野 祐司

AWS サーバーレスアーキテクチャを駆使して社内クラウド人材育成アプリとコンテンツづくりに勤しんでいます。React で SPA を書き始めたら快適すぎて、他の言語には戻れなくなりました。サーバーレス & React 仲間を増やしたいです。AWSは好きですが、それよりもフロントエンド開発の方が好きでして、バックエンド構築を簡単にしてくれたAWSには感謝の気持ちの方が強いです。
取得資格:AWS 認定は13資格、ITサービスマネージャ、ITIL v3 Expert 等
2020 - 2024 Japan AWS Top Engineer 受賞
2022 - 2024 AWS Ambassador 受賞
2023 当社初代フルスタックエンジニア認定
好きなAWSサービス:AWS Amplify / AWS AppSync / Amazon Cognito / AWS Step Functions / AWS CloudFormation

広野 祐司をフォローする

クラウドに強いによるエンジニアブログです。

SCSKクラウドサービス(AWS)は、企業価値の向上につながるAWS 導入を全面支援するオールインワンサービスです。AWS最上位パートナーとして、多種多様な業界のシステム構築実績を持つSCSKが、お客様のDX推進を強力にサポートします。

AWSアプリケーション開発クラウドソリューション
シェアする
タイトルとURLをコピーしました