こんにちは! サーバーワークスの松井(Tik Tokを愛してやまない東京の会社員)です。
今回は、Visual Studio Code(以降、VS Code)でAWS CloudShell(以降、CloudShell)使えるようにしたら環境作成もコード編集も楽ちんじゃね!!
という期待のもと実際にやってみました。
ということで、行ってみよーー!
※AWS CloudShellの仕様について知りたい人は弊社エンジニアのブログを御覧ください。 blog.serverworks.co.jp
今回使うのは、VS CodeのプラグインAWS CloudShell plugin for VS Codeです。 プラグインをVS Codeの画面からインストールしてください。
このプラグインを使うには、以下の設定が必要になります。
AWS CLIのインストール
Session Manager pluginのインストール
IAMユーザー(アクセスキー・シークレットキー作成済み)を作成し、AWS credencialの設定が完了している
CloudShellのアクセス権限を持ったIAMロール
AWS CLIやSession Manager pluginのインストールがまだ済んでいないよって方は、先にインストールをお願いします。(以下、参考資料)
AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface
(オプション) AWS CLI 用の Session Manager plugin をインストールする - AWS Systems Manager
今回は、CloudFormationを使ってVS Code用のユーザーを作成してIAMロールを引き渡す設定をするので、別でCloudFormationの作成権限を持ったユーザーを先に作成しておいてAWS credencialの設定をしておいてください。(以下、参考資料)
設定ファイルと認証情報ファイルの設定 - AWS Command Line Interface
CLI上でVS Codeのプラグインの設定に必要なAWSリソースは以下のテンプレートを使って一発デプロイします。
IAMロールでCloudIShellの操作権限だけを許可してもAWSリソースを操作できないので、IAMロールにEC2の操作権限も追加します。
cloudshellforvscode.yml
AWSTemplateFormatVersion: "2010-09-09" Description: IAM role for cloudshell Parameters: AssumeRoleName: Type: String Default: "CloudShell-AssumeRole" Resources: IAMUserSecret: Type: AWS::SecretsManager::Secret Properties: Name: !Sub ${CloudShellUser}-credentials SecretString: !Sub | [${CloudShellUser}] aws_access_key_id = ${CloudShellUserAccessKey} aws_secret_access_key = ${CloudShellUserAccessKey.SecretAccessKey} CloudShellUser: Type: AWS::IAM::User Properties: UserName: "CloudShellUser" CloudShellUserAccessKey: Type: AWS::IAM::AccessKey Properties: UserName: !Ref CloudShellUser AssumeRole: Type: AWS::IAM::Role Properties: RoleName: !Ref AssumeRoleName AssumeRolePolicyDocument: Version: 2012-10-17 Statement: - Effect: Allow Action: sts:AssumeRole Principal: AWS: !GetAtt CloudShellUser.Arn ManagedPolicyArns: - arn:aws:iam::aws:policy/AmazonEC2FullAccess - arn:aws:iam::aws:policy/AWSCloudShellFullAccess Outputs: CloudShellIamRoleArn: Description: IAM role for CloudShell Value: !GetAtt AssumeRole.Arn GetSecretValueByCLI: Value: !Sub |+ aws secretsmanager get-secret-value --secret-id ${IAMUserSecret} --region ${AWS::Region} --query SecretString --output text >> ~/.aws/credentials
CloudFormationのスタック作成
> template=cloudshellforvscode aws cloudformation create-stack --stack-name $template \ --template-body "file://./$template.yml" \ --capabilities CAPABILITY_NAMED_IAM
スタック完成したらシークレット情報を ~/.aws/credencialに書き込んでいきます。
以下コマンドを実行します。
> aws cloudformation describe-stacks --stack-name $template \ --query 'Stacks[].Outputs[?OutputKey==`GetSecretValueByCLI`].OutputValue' \ --output text
以下のような結果が出力されたらそのままコピペして実行します。
> aws secretsmanager get-secret-value --secret-id arn:aws:secretsmanager:ap-northeast-1:{AWSアカウントID}:secret:CloudShellUser-credentials-xxxxx --region ap-northeast-1 --query SecretString --output text >> ~/.aws/credentials
~/.aws/credentialsを開くとIAMユーザーのアクセスキーの情報が入力されています。
次にIAMロールのARN情報を取り出したいので以下を実行
> aws cloudformation describe-stacks --stack-name $template \ --query 'Stacks[].Outputs[?OutputKey==`CloudShellIamRoleArn`].OutputValue' \ --output text
以下のようにロールの情報が出てきます。
arn:aws:iam::{AWSアカウントID}:role/CloudShell-AssumeRole
これで必要な情報の準備が完了したのでVSCodeの画面に移り、設定>cloudshell で検索するとプラグインの設定画面が出てきます。
入力項目が4つあるので順番に入力してきます。
- Awscloudshell: Assume Role
先ほど作成したロール
arn:aws:iam::{AWSアカウントID}:role/CloudShell-AssumeRole
- Awscloudshell: Enable Upload
ファイルアップロードの可否
- Awscloudshell: Profile
~/.aws/credentialsに記載したCredential情報の名前
CloudShellUser
- Awscloudshell: Region
ap-northeast-1
設定が完了したら画像の赤枠の部分を押してみてください。 そうするとCloudShellが起動します。 connectingとしばらく表示された後、connectedにステータスが変わると自動的にCloudShellのシェルが立ち上がります。
EC2の一覧が表示させられることも確認できました。
まとめ
VS CodeからCloudShellを使えるようにしてみましたが、Remort SSHのようにサイドバーにサーバー内のディレクトリー階層を表示させて、ファイルを画面上に自由に表示させて編集するというようなことが出来ないのが想像とは違っていてとても惜しかったです。。。
しかし、ドキュメントを見ると今後改善していきそうな表現も見受けられたのでアップデート情報を期待しています。