こんにちは。技術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 name and description
- 構成設定
- Environment settings
- Environment type
- Create a new instance for environment (EC2)
- Instance type
- t2.small (2 GiB RAM + 1 vCPU)
- インスタンスタイプは人数に合わせて変更してください。
- Platform
- Amazon Linux
- Environment type
- [Next step] ボタンを押下
- Environment settings
- 確認
- [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 環境を開きます。うまく共有できたでしょうか?
クロスアカウントアクセスの場合、チャットにロール名が表示されて何のネギだかサッパリわかりません。この辺は改善の余地ありですかねぇ。
モブ最高!!
参考
- AWS Cloud9 の共有環境を使用する