のぴぴのメモ

自分用のLinuxとかの技術メモ

SSH接続型のCloud9をセットアップする手順

はじめに

AWS Cloud9は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) です。IDEの画面はこんな感じです。
f:id:nopipi:20220413211500p:plain:w500


AWS Cloud9で、AWS Cloud9サービスからCloud9を動かすEC2インスタンス or VMへの接続方式は以下の3種類があります。

  1. ダイレクトアクセス
  2. Systems Manager経由
  3. SSH接続


この記事ではSSH接続方式の場合のCloud9のセットアップ手順を説明します。

結論としては面倒なので、EC2インスタンスタイプで特にこの方式を採用するメリットはないと思います。しいて言えばCloud9をEC2インスタンス以外で動作させたい場合はこの方式になるのではないでしょうか。

手順

インスタンス作成

前提
  • Public接続ができるVPCがあること(デフォルトVPCでOK)
  • CIDR0.0.0/0からSSH(TCP Port22)へ接続可能なセキュリティーグループがあること
インスタンス作成
#設定が必要なパラメータ
PROFILE="<対象アカウントのプロファイル(デフォルトプロファイル利用時はdefaultを指定)>"
REGION="<インスタンスを作成するリージョンのコード。東京リージョンならap-northeast-1>"
SUBNET_ID="<パブリックサブネットのID>"
SG_ID="<インバウンドでsshを許可しているセキュリティーグループのID>"
KEYNAME="<EC2インスタンスにSSHログインするためのキーペア名>"

#基本固定で良いパラメータ
INSTANCE_TYPE="t2.micro"

#AMI ID取得(ubuntuイメージ利用)
UBUNTU_AMI_ID=$(aws --profile ${PROFILE} --region ${REGION} --output text \
    ec2 describe-images \
        --filters 'Name=name,Values=ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-????????' \
                      'Name=state,Values=available' \
        --query 'reverse(sort_by(Images, &CreationDate))[:1].ImageId' );
echo "
UBUNTU_AMI_ID = ${UBUNTU_AMI_ID}
"

#タグ設定
TAGJSON='
[
    {
        "ResourceType": "instance",
        "Tags": [
            {
                "Key": "Name",
                "Value": "Cloud9-SshType"
            }
        ]
    }
]'

# サーバの起動
aws --profile ${PROFILE} --region ${REGION} \
    ec2 run-instances \
        --image-id ${UBUNTU_AMI_ID} \
        --instance-type ${INSTANCE_TYPE} \
        --key-name ${KEYNAME} \
        --subnet-id ${SUBNET_ID} \
        --security-group-ids ${SG_ID} \
        --associate-public-ip-address \
        --tag-specifications "${TAGJSON}" ;

Cloud9用ユーザ準備

インスタンスへのログイン
#作成したインスタンスのPublic IP取得
PUBLIC_IP=$( aws --profile ${PROFILE} --region ${REGION} --output text \
    ec2 describe-instances \
        --filters \
            "Name=instance-state-name,Values=running" \
            "Name=tag:Name,Values=Cloud9-SshType" \
    --query 'Reservations[].Instances[].PublicIpAddress' );
echo "PUBLIC_IP = ${PUBLIC_IP}"

#インスタンスへのssh接続
ssh "ubuntu@${PUBLIC_IP}"
Cloud9用ユーザ追加
sudo adduser --quiet --gid 100 --disabled-password cloud9


Changing the user information for cloud9
Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] Y

cloud9ユーザでパスワード無しでのsudoでのroot権限利用が必要なため、sudo設定を追加します。

sudo -i
echo 'cloud9 ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/99-cloud9-user
exit
cloud9ユーザのSSH公開鍵用設定

.sshフォルダを作成します。

sudo -i -u cloud9

mkdir ~/.ssh
chmod 700 ~/.ssh

ls -la |grep ssh
drwx------ 2 cloud9 users 4096 Apr 13 11:11 .ssh

exit

Cloud9の前提パッケージセットアップ

Python2.7

デフォルトではPython3しかインストールされていないので、追加でのインストールが必要なはずです。

#pythonの確認
python2 --version

#インストールされていない場合は下記コマンドでインストール
sudo apt update
sudo apt install -y python2
Node.js

恐らくインストールされていないので、Node.jsのインストールが必要なはずです。

#Node.jsの確認(多分コマンドがないはず)
node --version

#Node.jsのインストール
sudo apt update
sudo apt install -y nodejs
ホームディレクトリの権限確認

Cloud9の要件で、Cloud9実行ユーザのホームディレクトリはrwxr-xr-xに設定されている必要があります。
ubuntuでは多分変更不要と思いますが、念の為確認しあってなければ変更します。

#ホームディレクトリの確認
ls -la /home |grep cloud9

drwxr-xr-x  3 cloud9 users  4096 Apr 13 11:11 cloud9  <= drwxr-xr-xならOK

#仮に上記パーミッションでない場合は以下で設定
sudo chmod u=rwx,g=rx,o=rx /home/cloud9

Cloud9のセットアップ

セットアップに必要なパッケージのインストール

パッケージインストールでgccとmakeを利用するため、先にパッケージをインストールします。

sudo apt update
sudo apt install -y make gcc
Cloud9セットアップ

Cのビルドが走り完了までに数分かかります。

curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash

(マネコン)Cloud9サービスでの設定

  • マネージメントコンソールでAWS Cloud9を表示します。(リージョンはどこでもOK)
  • Create environmentでCloud9環境作成のウィザードを開きます
  • 下図を参照に必要項目を入力し公開鍵をコピーします(Next stepは進まない)

f:id:nopipi:20220413204647p:plain:w600

(ubuntu)Cloud9サービスからのSSH接続設定

コピーした公開鍵を、ubuntsのcloud9ユーザに設定します。

sudo -i -u cloud9

echo "[コピーした公開鍵]" >>  ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
(マネコン)environment作成の続き
  • Next stepを実行します
  • ssh接続が成功すると確認画面が表示されるので、Create environmentを実行します。