VS CodeでAWS CloudShell使えるようにしてみたけど機能が惜しかった件

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

こんにちは! サーバーワークスの松井(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の画面からインストールしてください。

github.com

このプラグインを使うには、以下の設定が必要になります。

  • 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 で検索するとプラグインの設定画面が出てきます。

f:id:swx-matsui:20210330124043p:plain
設定画面

入力項目が4つあるので順番に入力してきます。

  • Awscloudshell: Assume Role

先ほど作成したロール

arn:aws:iam::{AWSアカウントID}:role/CloudShell-AssumeRole

  • Awscloudshell: Enable Upload

ファイルアップロードの可否 チェックをつけましたが、ファイルアップロードの機能は使えませんでした。(3月30日時点) ドキュメントに実験的と書いてあったので今後使えるようになることを願います。

  • Awscloudshell: Profile

~/.aws/credentialsに記載したCredential情報の名前

CloudShellUser

  • Awscloudshell: Region

ap-northeast-1

設定が完了したら画像の赤枠の部分を押してみてください。 そうするとCloudShellが起動します。 connectingとしばらく表示された後、connectedにステータスが変わると自動的にCloudShellのシェルが立ち上がります。

f:id:swx-matsui:20210330125133p:plain

EC2の一覧が表示させられることも確認できました。

f:id:swx-matsui:20210330145211p:plain

まとめ

VS CodeからCloudShellを使えるようにしてみましたが、Remort SSHのようにサイドバーにサーバー内のディレクトリー階層を表示させて、ファイルを画面上に自由に表示させて編集するというようなことが出来ないのが想像とは違っていてとても惜しかったです。。。

しかし、ドキュメントを見ると今後改善していきそうな表現も見受けられたのでアップデート情報を期待しています。