僕とリモートで、一緒にモブプロしてよ! 〜AWS Cloud9〜

記事タイトルとURLをコピーする

こんにちは。技術1課の木次です。

弊社では今年も テレワーク・デイズ に参加しており、今週1週間はリモートワーク勤務が推奨されています。
(2019年もテレワーク・デイズに参加いたします)

自宅でモクモクと作業するのもいいのですが、ずっとだと寂しいですよね。気分転換が必要です。
なので、社内勉強会としてリモートでモブプロにチャレンジしてみようかと思います。

モブプロって何?

モブプロとは「Mob programming」の略で、チーム全体が同じことを同時に同じPCで作業する開発アプローチで、PCを操作する人(ドライバー)を交代しながらワイワイと進めていきます。

通常は同じ場所、1つのモニタでやるものですが AWS Cloud9 を使って、リモートでチャレンジしてみます。なお、音声は Google Hangouts Meet を利用します。

AWS Cloud9 とは

AWS Cloud9 は、ブラウザのみでどのマシンからでもコードを記述、実行、デバッグできる、クラウドベースの統合開発環境 (IDE) です。
EC2 環境であれば、素早く新しいプロジェクトを開始でき、リアルタイムに共同コーディングやチャットが可能です。
ペアプロだけでなく、モブプロにも最適です。

共同コーディングをする場合、Cloud9 では2パターンの共有方法があります。

  • 同じ AWS アカウント内の IAM ユーザーと共有する場合
  • 異なる AWS アカウントの IAM ユーザーと共有する場合

同じAWS アカウント内の IAM ユーザー同士の場合は、比較的簡単に出来ますが、異なる AWS アカウントの IAM ユーザーの場合は少し手順が複雑です。今回はこのケースのお話になります。

異なる AWS アカウント同士の共有方法

異なる AWS アカウント同士で共有する場合、IAM ロールによるクロスアカウントアクセスにて主催者側の Cloud9 環境に接続します。
アカウントごとの Cloud9 環境同士が接続するわけではないので注意してください。 

 

おおまかな流れは以下になります。

  • 事前準備
    • (1)【参加者】AWS アカウントとユーザー名を主催者に連絡
    • (2)【主催者】ロール作成
    • (3)【参加者】ロールを引き受けるポリシー設定
  • Cloud9 共有
    • (4)【主催者】Cloud9 共有環境から参加者を招待
    • (5)【参加者】スイッチロール
    • (6)【参加者】Cloud9 共有環境を開く

細かく見ていきましょう。

事前準備

Cloud9 共有をする前に事前準備が必要です。以降、下記の値を例として説明していきます。

  AWS アカウント IAM ユーザー名
主催者 111111111111 kujyo (今回は利用しない)
参加者 999999999999 fukaya
参加者 888888888888 shimonita

1.【参加者】AWSアカウントとユーザー名を主催者に連絡

参加者は、自分の AWS アカウントと管理コンソールで利用している IAM ユーザー名を主催者に連絡します。
AWS アカウントは IAM ロールの信頼ポリシーの関連付けに、IAM ユーザー名は Cloud9 共有環境からの招待時に利用します。

2.【主催者】ロール作成

参加者全員の AWS アカウントと IAM ユーザー名を確認できたら、AWS Cloud9 共有用のロールを作成します。
ロールにはAWSCloud9EnvironmentMember参加者の信頼ポリシーを関連付けします。

今回は IAM ロールを簡単に登録できるように CloudFormation テンプレートを用意してみました。

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  RoleName:
    Type: "String"
    Default: "AWSCloud9EnvironmentMemberCrossAccountRole"
  JoinAccounts:
    Type: "CommaDelimitedList"
    Description: "ex) arn:aws:iam::999999999999:root,arn:aws:iam::888888888888:root"
Resources:
  MyRole:
    Type: "AWS::IAM::Role"
    Description: "role for shared environments in AWS Cloud9"
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          -
            Effect: "Allow"
            Principal: 
              AWS: !Ref JoinAccounts
            Action: "sts:AssumeRole"
      Path: "/"
      ManagedPolicyArns:
        - "arn:aws:iam::aws:policy/AWSCloud9EnvironmentMember"
      RoleName: !Ref RoleName
Outputs:
  RoleArn:
    Description: "closs-account role's ARN"
    Value: !GetAtt MyRole.Arn

テンプレートファイルをアップロードします。スタックの詳細の指定画面で、2つのパラメータを設定します。

  • JoinAccounts
    • 参加者のアカウントを入力
    • arn:aws:iam::{AWSアカウント}:root の形式で、複数ある場合はカンマ区切り
  • RoleName
    • 作成するロール名を入力
    • デフォルトは AWSCloud9EnvironmentMemberCrossAccountRole

スタック作成が完了すると IAM ロールが作成されます。
出力タブに RoleArn の値が表示されるので、コピーして参加者に連絡します。

以下は作成された IAM ロールに紐づく信頼関係のポリシードキュメントです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": [
          "arn:aws:iam::888888888888:root",
          "arn:aws:iam::999999999999:root"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

3.【参加者】ロールを引き受けるポリシー設定

主催者から AWS Cloud9 共有用のロール Arn を受け取ったら、ロールを引き受ける(AssumeRole)ポリシーを作成してアカウントに紐づけます。
具体的には、専用のグループを作成してポリシードキュメントを定義し、そのグループに自分のIAMユーザーを追加することで紐づけします。

IAM グループを簡単に登録できるように CloudFormation テンプレートを用意しました。

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  CrossAccountRoleArn:
    Type: "String"
    Description: "ex) arn:aws:iam::111111111111:role/AWSCloud9EnvironmentMemberCrossAccountRole"
  GroupName:
    Type: "String"
    Default: "AWSCloud9CrossAccountGroup"
  JoinUsers:
    Type: "CommaDelimitedList"
    Description: "ex) fukaya-negi,shimonita-negi"
Conditions:
  IsAddition: !Not [!Equals [!Join ["", !Ref JoinUsers], ""]]
Resources:
  MyGroup:
    Type: "AWS::IAM::Group"
    Description: "group for shared environments in AWS Cloud9"
    Properties:
      GroupName: !Ref GroupName
      Path: "/"
      Policies:
        -
          PolicyName: "AWSCloud9CrossAccountGroupPolicy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              Effect: "Allow"
              Action: "sts:AssumeRole"
              Resource: !Ref CrossAccountRoleArn
  MyUserToGroup:
    Type: "AWS::IAM::UserToGroupAddition"
    DependsOn: "MyGroup"
    Condition: IsAddition
    Properties:
      GroupName: !Ref GroupName
      Users: !Ref JoinUsers
Outputs:
  GroupArn:
    Description: "for closs-account group's ARN"
    Value: !GetAtt MyGroup.Arn

テンプレートファイルをアップロードします。スタックの詳細の指定画面で、3つのパラメータを設定します。

  • CrossAccountRoleArn
    • 主催者が作成した IAM ロールの ARN を入力
  • GroupName
    • 作成するグループ名を入力
    • デフォルトは AWSCloud9CrossAccountGroup
  • JoinUsers
    • グループに追加する IAM ユーザー名 を入力
    • 複数ある場合はカンマ区切り

スタック作成が完了すると、IAM グループが作成されます。
以下は作成された IAM グループのインラインポリシーです。

{
  "Version": "2012-10-17",
  "Statement": {
    "Action": "sts:AssumeRole",
    "Resource": "arn:aws:iam::111111111111:role/AWSCloud9EnvironmentMemberCrossAccountRole",
    "Effect": "Allow"
  }
}

 

AWS Cloud9 共有

事前準備が完了したら、AWS Cloud9 で共有できます。

4.【主催者】Cloud9 共有環境から参加者を招待

東京リージョンで AWS Cloud9 EC2 環境を作成します。
Cloud9 コンソールを開き、[Your environments] - [Create environment] ボタンを押下します。

AWS Cloud9 環境作成
  • 環境名
    • Environment name and description
      • [Name] に環境名を入力します。
    • [Next step] ボタンを押下
  • 構成設定
    • Environment settings
      • Environment type
        • Create a new instance for environment (EC2)
      • Instance type
        • t2.small (2 GiB RAM + 1 vCPU)
        • インスタンスタイプは人数に合わせて変更してください。
      • Platform
        • Amazon Linux
    • [Next step] ボタンを押下
  • 確認
    • [Create environment] ボタンを押下

 

参加者を招待

AWS Cloud9 IDE が表示されたら参加者を招待します。
画面右上の [Share] ボタンを押下して [Share this environment] ダイアログを表示します。

[Invite Members] 欄のテキストフィールドに IAM ユーザーを入力して [Invite] ボタンを押下します。

  • IAM ユーザー
    • arn:aws:sts::{主催者AWSアカウント}:assumed-role/{ロール名}/{参加者IAMユーザー名}
    • (例) arn:aws:sts::111111111111:assumed-role/AWSCloud9EnvironmentMemberCrossAccountRole/fukaya
  • 操作権限
    • RW: 読み取り/書き込み権限

※信頼できる参加者のみを共有環境に招待してください。

参加者は信頼する人のみに書き込み権限を付与した場合、セキュリティ警告ダイアログが表示されます。その場合は [OK] ボタンを押下してください。

参加者全員を招待したら [Done] ボタンを押下します。これで主催者側の準備は完了です。

5.【参加者】Cloud9 共有環境を開く

コンソールからロールAWSCloud9EnvironmentMemberCrossAccountRoleへスイッチします。

  • 右上のナビゲーションバーのユーザー名を選択
    • 通常はusername@accountId_or_aliasのように表示
  • [スイッチロール] を選択
  • ロールの切り替え
    • アカウント
      • 111111111111
    • ロール
      • AWSCloud9EnvironmentMemberCrossAccountRole
    • 表示名
      • Cloud9SharedEnv
      • 好きな色を選択
  • [ロールの切り替え] ボタンを押下

スイッチロールをした後は Cloud9 へ接続します。


サービスから Cloud9 コンソールを選択し、[ナビゲーションペイン] - [Shared with you] を選択します。
主催者の共有環境が表示されていたら成功です。

[Open IDE] ボタンを押下して Cloud9 環境を開きます。うまく共有できたでしょうか?

クロスアカウントアクセスの場合、チャットにロール名が表示されて何のネギだかサッパリわかりません。この辺は改善の余地ありですかねぇ。

モブ最高!!

参考