AWS Cloud9 環境をちょっとだけ手軽に作ってサッと接続する

すごく便利にはなりません。ちょっとだけ便利になります。

そこまで手間ではないけどちょっとだけ楽したい

コンバンハ、千葉(幸)です。

たまに AWS Cloud9 環境をサッと作りたくなることがあります。

Docker やら AWS SAM CLI やら各種 AWS SDK やらがあらかじめセットアップ済みなので、ちょっと検証したいけどあまりローカルにいろいろ入れたくないな、というときに使います。とは言えわたしはあまりそれらを頻繁に使うわけではないので、たまに作っていらなくなったらすぐ消す、ということをやっています。

これまではマネジメントコンソールでポチポチして作っていたのですが、ちょっとだけ楽にできないかな、と思い AWS CLI(等)を使うことにしました。

言うほど楽になったかというとそういうわけでもないのですが、学びもあったので共有します。

まとめ

  • Cloud9 IDE への接続 URL は以下の構成
    • `https://{region}.console.aws.amazon.com/cloud9/ide/{環境ID}`
  • Cloud9 環境にはパーミッションの考え方がある
  • Cloud9 環境のオーナーに IAM ロールは指定できず、AssumeRoled セッションプリンシパルの形式である必要がある

マネジメントコンソールから作る場合

AWS CLI で試す前にマネジメントコンソールから作る場合の手順を確認しておきます。

Cloud9 ダッシュボードから環境の作成を実行。

AWS_Cloud9_createenv

各種情報を入力し作成を実行します。

パラメータ自体はたくさんありますが、明示的に入力が必要なのは環境名のみです。そのほかの項目はオプションであったり、デフォルトのパラメータが指定されています。

AWS_Cloud9_create_env

環境の作成が開始され、しばらくすると完了します。Permission という項目が確認できますね。「Cloud9 IDE」で「Open」を押下すると、IDE に接続できます。

AWS_Cloud9_created_Env

IDE はこのような感じ。URL は今回は`https://ap-northeast-1.console.aws.amazon.com/cloud9/ide/24914e7fadc1497c962d52ec7665fe94`でした。

Test-Env_-_AWS_Cloud9_create_env

URL の末尾は環境 ID となっており、これは環境の詳細画面から確認できます。

AWS_Cloud9_Enviroment_ID

自分で書いておいてなんですが、そこまで手間という感じでもないですね。

AWS CLI でちょっとだけ楽に環境を作る

ちょっとだけ楽に作業していきます。しかし楽ができるためには条件があります。

  • IAM ユーザーもしくは IAM ロールでマネジメントコンソールにサインイン済みであること

また、指定するパラメータでコントロールできる部分ではありますが、今回のわたしの実行内容では以下も条件に追加されます。

  • デフォルト VPC が存在すること
  • AWS CLI の実行者とサインイン済みの IAM ユーザー/ IAM ロールセッションプリンシパルが同一であること

今回実行するコマンドは以下です。実行すると URL が出力されます。

% INPUT=$(cat <<EOM
{
    "name": "Test-Env",
    "instanceType": "t2.micro",
    "imageId": "amazonlinux-2-x86_64",
    "connectionType": "CONNECT_SSM"
}
EOM
)

% echo https://ap-northeast-1.console.aws.amazon.com/cloud9/ide/$(aws cloud9 create-environment-ec2 --cli-input-json "$INPUT" --output text)

出力された URL に接続すると作成した環境に接続できる……というわけです。ローカルの端末で実行してそのままシュッと IDE に移れます。

AWS_Cloud9_Cloud9IDE

全く凝ったことはしていなく、aws cloud9 create-environment-ec2コマンドのアウトプットとして環境 ID が返却されるのでそれを URL の末尾に付与して出力する、というだけの内容です。

オプションは個人的な好みで CLI スケルトンでインプットしてます。全量はこんな感じ。指定が必須なのは環境名とインスタンスタイプのみです。

% aws cloud9 create-environment-ec2 --generate-cli-skeleton
{
    "name": "",
    "description": "",
    "clientRequestToken": "",
    "instanceType": "",
    "subnetId": "",
    "imageId": "",
    "automaticStopTimeMinutes": 0,
    "ownerArn": "",
    "tags": [
        {
            "Key": "",
            "Value": ""
        }
    ],
    "connectionType": "CONNECT_SSH",
    "dryRun": true
}

AWS Cloud9 環境のオーナーに IAM ロールは指定できない

ownerArnのパラメータを指定してあげれば AWS CLI 実行者とマネジメントコンソールの接続者が違くてもいけるかな、ということで IAM ロールarn:aws:iam::000000000000:role/cm-chiba.yukihiroを指定してみるとエラーになりました。

An error occurred (ValidationException) when calling the CreateEnvironmentEC2 operation: 1 validation error detected: Value 'arn:aws:iam::000000000000:role/cm-chiba.yukihiro' at 'ownerArn' failed to satisfy constraint: Member must satisfy regular expression pattern: ^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):(iam|sts)::\d+:(root|(user\/[\w+=/:,.@-]{1,64}|federated-user\/[\w+=/:,.@-]{2,32}|assumed-role\/[\w+=:,.@-]{1,64}\/[\w+=,.@-]{1,64}))$

指定するのであればarn:aws:sts::000000000000:assumed-role/cm-chiba.yukihiro/cm-chiba.yukihiroのように AssumeRoled セッションプリンシパルの形式にする必要があります。

なお、AWS CLI を AssumeRoled セッションプリンシパルで実行する場合には、以下のようにセッション名を指定するようにするといいでしょう。

オーナーが違う場合の見え方のイメージ

自身がオーナーでない環境が作成された場合、コンソールでは以下のように見えます。

デフォルトの「My environments」では表示されず、「All account enviroments」に切り替えてあげる必要があります。

AWS_Cloud9_Owner-9818404

また、パーミッションが設定されていないため IDE を開くこともできません。ここからパーミッションを与えるためには、以下のコマンドなどを使用する必要があります。

おまけ:環境のお片付け

わたしはたまにサッと作った環境をそのまま残してしまうことがあります。綺麗にするときは以下コマンドを実行します。

% aws cloud9 list-environments | jq -r '.environmentIds[]' \
  | while read line; do
        aws cloud9 delete-environment --environment-id $line
    done

一覧取得した環境を全部消す内容になっているので、気軽に消すと差し支えがある場合には叩かないでください。

終わりに

AWS Cloud9 環境を少しだけ手軽に作って接続する、というエントリでした。

コマンドにすることで劇的に便利、というほどではないのですが、条件にマッチすればちょっとお手軽度が増すので気になる方は試してみてください。

今回試してみたことによって、Cloud9 IDE の URL の構造や、Cloud9 環境のオーナー・パーミッションの考え方が少し学びとしてありました。

どこかしら参考になれば幸いです。

以上、 チバユキ (@batchicchi) がお送りしました。