aws cloud9 for environment ec2 で開発環境を構築するときに困ったこと

2020.04.08

お疲れさまです。

私は固定回線を契約しておらず、モバイル wifi ルータを使って作業しているのですが、 連日リモートワークでの作業になると 3 日で 10GB といった通信容量の上限を超過することが増えてきました。

通信制限を受けてしまった場合、推しのライブ配信を高画質で閲覧することが難しく、仕事に支障をきたしてしまう恐れがあります。 そのため、業務に直接の関係がない作業に関しては AWS Cloud9 にて行うことにしました。

その際、色々悩みが発生したので共有します。

構築手順について

こちらの記事が丁寧にまとまっています。

構築時の TIPS

コンソール からしかできないオプションがある

AWS Cloud9 SSH 環境を作成する場合は コンソールからのみ作成可能で、 Ubuntu をベースとした AWS Cloud9 EC2 環境を作成する場合でも コンソールからのみ作成可能です。

AWS STS を使用した一時的な認証情報の取得して awscli から構築する際にも注意が必要です。 OwnerARN を明示的に指定しない場合、自動生成された名前が OwnerARN に採用されるからです。 OwnerARN に関しては後から修正可能ですが、コンソール 上の Open IDE は非活性となるため、awscli からのみ追加可能です。

webConsole から SwitchRole してアクセスする際の OwnerARN は下記のような形式になります。

arn:aws:sts::${アカウントID}:assumed-role/${AssumeRoleするRole名}/${AssumeRoleするIAM User名}

参考

CloudForfmation 経由での変更には気を配る

CloudFormation 経由で変更し、AWS::EC2::Instance が Replacement になった場合は AWS Cloud9 からは接続できなくなります。

例えば、AmazonLinux ベースから Ubuntu ベースに変更しようとした時に発生します。

AWS Cloud9 EC2 環境 には StackID, SSHPublicKey だけでなく InstanceID が紐づいているからだと思われます。

参考

ec2 instance connect での接続を考慮する場合はベースイメージに Ubuntu を採用する

ec2 instance connect は AmazonLinux2 と Ubuntu のみサポートしています。

現状 AmazonLinux はサポートされていないため 私は Ubuntu を採用しました。

参考

余談

EC2 Instance Connect でサポートしている鍵のフォーマットは RSA のみのようです。

# ? $ ssh-keygen -t ed25519 -f id_ed25519 -N '' -C padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_padding_
# ? $ aws ec2-instance-connect send-ssh-public-key --ssh-public-key file://id_ed25519.pub --availability-zone ap-northeast-1a --instance-os-user ubuntu --instance-id i-xxxxxxxxxxxxxxxxx

An error occurred (InvalidArgsException) when calling the SendSSHPublicKey operation: Invalid input parameter received for Illegal argument exception: RSA - SSH Public key is invalid
参考

ターミナルから自動停止時間を延長する

ブラウザからの操作に慣れない、ローカルとのファイルのやりとりが頻繁な場合など、SSH 接続したほうが良いケースもあると思います。

その際、インスタンスの自動停止時間をリセットするためだけにブラウザにログインするのは億劫です。

~/.c9/stop-if-inactive.sh を参照したところ、毎分下記のチェックを行っています。

  • shutdown が予約されている かつ vfs-worker が動作している場合、shutdown をキャンセル
  • shutdown が予約されていない かつ vfs-worker が動作していない場合、shutdown を予約

なので、そのままキャンセルすれば良さそうです。

sudo shutdown -c

そのまま自動停止が無効になるか不安だと思いますが、次の cron 動作時に shutdown が予約されるので大丈夫です。

まとめ

AWS Cloud9 は NoCode で開発環境を用意でき、柔軟なユーザ管理、スペックのコントロールまで可能な非常に便利なサービスです。

ただ、クラウド上でスタンドアロンな開発環境を構築する場合は AWS AWS Cloud9 EC2 環境 ではないほうが良さそうです。

独自に EC2 を立てて、AWS AWS Cloud9 SSH 環境 で接続した方が環境構築に関してはコードに落とし込みやすく、設定上も小回りは効くように思われました。 自動停止の機構もかなりシンプルだったので流用可能そうです。

なので、AWS Cloud9 EC2 環境 は初期スペックや柔軟なユーザ管理のことを考えると用途毎に環境を立てたほうが好ましそうです。