Cloud9で起動するインスタンスタイプを制限する

Cloud9で特定のインスタンスタイプ以外を起動できないように制限するのに少し手こずったので記事にします。
2023.12.13

はじめに

Cloud9の環境を作成すると裏でEC2インスタンスが起動されます。
そのためEC2のインスタンスタイプを制限することでCloud9のインスタンスタイプも制限されると思っていました。
しかし、結果としてはCloud9はCloud9用の設定が必要でした。

EC2のインスタンスタイプを制限してCloud9を起動

まず最初に設定していたポリシーがこちらです。
こちらはEC2をt2.micro以外で起動きでないように制限したポリシーです。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ec2:RunInstances",
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "StringNotEquals": {
                    "ec2:InstanceType": "t2.micro"
                }
            }
        }
    ]
}

このポリシーをアタッチした状態でCloud9を起動しました。
Cloud9はEC2のインスタンスタイプを選択して起動するので、上記のポリシーでt2.micro以外は立ち上がらないと予想しました。

しかし、普通に立ち上がってしまいました。

あれ?おかしいな、ということで、調べてみたところCloud9用にインスタンスタイプの制限をする必要があるようでした。
やっぱりこういう時は公式ドキュメントを読むのが一番ですね。

Cloud9のインスタンスタイプを制限

Cloud9で起動するインスタンスを制限するには以下のようなポリシーを作成します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "cloud9:CreateEnvironmentEC2",
            "Resource": "*",
            "Condition": {
                "StringNotEquals": {
                    "cloud9:InstanceType": "t2.micro"
                }
            }
        }
    ]
}

試してみましょう。

しっかり制限されていますね。
複数のインスタンスをまとめて指定する方法もこちらの記事を参考に試してみます。
今回はt系インスタンス以外は起動できないように制限してみます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "cloud9:CreateEnvironmentEC2",
            "Resource": "*",
            "Condition": {
                "StringNotLike": {
                    "cloud9:InstanceType": "t*"
                }
            }
        }
    ]
}

記事と同じように"StringNotEquals"を"StringNotLike"に変更することでワイルドカードで指定することができました。

m5.largeで試してみます。

こちらもしっかり制限されていますね。

この後t2,t3で起動を確認しましたが、問題なく起動できました。

まとめ

インスタンスタイプを制限することで、思いもよらない課金を防ぐことができます。
EC2の制限をしているから大丈夫!と思ってうっかり抜け穴を防ぐのを忘れないように注意しましょう。