1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS】Cloud9をCloudFormationで自動構築する

1
Last updated at Posted at 2024-04-22

チームメンバーにCloud9環境を払い出すたびに、AWS Consoleで手作業していませんか?
この記事では、CloudFormationテンプレートでCloud9を自動構築し、EBS拡張やセキュリティグループの制御まで一括で行う方法を紹介します。

AWS Cloud9とは

AWS Cloud9は、ブラウザからアクセスできるクラウドベースのIDEです。実体はEC2インスタンスで、IDE用のWebインタフェースが追加されたものと捉えられます。

Cloud9を選ぶメリット

  • 構築が容易で機能が豊富 -- AWS Consoleの画面に沿って構築でき、開発に必要な機能一式が揃っている。IAMユーザを招待してペアプログラミングも可能
  • ブラウザだけで利用可能 -- アプリのインストール不要。プロキシ環境下でもアクセスできる
  • 自動停止でコスト削減 -- IDEが一定時間使われないと自動でインスタンスが停止する
  • AWSリソースとの連携 -- 実体がEC2なのでVPC内通信でAWSリソースにアクセスでき、踏み台としても使える

CloudFormationでCloud9を構築する

AWS Consoleでの構築も簡単ですが、CloudFormationテンプレート化すればヒューマンエラーを防ぎ、再現性のある構築が可能になります。

AWSTemplateFormatVersion: "2010-09-09"
Description: >
  create Cloud9 instance.
Parameters:
  AWSCloud9InstanceType:
    Type: String
    Default: t3.micro
    AllowedValues:
      - t3.nano
      - t3.micro
      - t3.medium
      - t3.large
      - m5.large
  AWSCloud9SubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: "The subnet in which AWS Cloud9 instance will be deployed."
  AWSCloud9OwnerARN:
    Type: String
    Description: "ARN of the owner of AWS Cloud9 instance"
Resources:
  AWSCloud9SSMInstance:
    Type: AWS::Cloud9::EnvironmentEC2
    Properties:
      AutomaticStopTimeMinutes: 30
      ConnectionType: "CONNECT_SSM"
      Description: "AWS Cloud9 instance accessible with AWS Systems Manager. Created by cfn"
      InstanceType: !Ref AWSCloud9InstanceType
      ImageId: amazonlinux-2-x86_64
      SubnetId: !Ref AWSCloud9SubnetId
      OwnerArn: !Ref AWSCloud9OwnerARN
      Tags: [ {
      "Key" : "cloud9owner",
      "Value" : !Ref AWSCloud9OwnerARN
   } ]

テンプレートのポイント

  • SSM接続 -- ConnectionType: "CONNECT_SSM" を指定し、インバウンドの22番ポート開放を不要にしている
  • オーナータグ -- cloud9owner タグで誰の環境か検索しやすくしている

EBSのサイズを拡張する

Cloud9のデフォルトEBS容量は10GBです。開発を進めると不足しがちなので、以下のコマンドでサイズを拡張します。

CLOUD9_INSTANCE_ID="<払い出したAWS Cloud9のインスタンスID>"
SIZE="<拡張後のEBSのサイズ>"
VOLUMEID=$(aws ec2 describe-instances \
  --instance-id $CLOUD9_INSTANCE_ID \
  --query "Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.VolumeId" \
  --output text)
aws ec2 modify-volume --volume-id $VOLUMEID --size $SIZE

次にCloud9の内側からパーティションを拡張します。
AWS公式ドキュメントのresize.shをCloud9上で実行してください。

アウトバウンド通信をHTTP/HTTPSに制限する

Cloud9ではデフォルトですべてのアウトバウンド通信が許可されています。セキュリティ要件に応じて、HTTP/HTTPS通信のみに制限できます。

# セキュリティグループIDを取得
CLOUD9_SG_ID=$(aws ec2 describe-instances \
  --instance-id $CLOUD9_INSTANCE_ID \
  | jq -r '.Reservations[].Instances[].NetworkInterfaces[].Groups[].GroupId')

# 既存のアウトバウンドルールをすべて削除
aws ec2 revoke-security-group-egress --group-id ${CLOUD9_SG_ID} \
  --ip-permissions \
  "$(aws ec2 describe-security-groups --output json \
    --group-id ${CLOUD9_SG_ID} \
    --query "SecurityGroups[0].IpPermissionsEgress")"

# HTTP(80番ポート)を許可
aws ec2 authorize-security-group-egress \
  --group-id ${CLOUD9_SG_ID} --protocol tcp --port 80 --cidr 0.0.0.0/0

# HTTPS(443番ポート)を許可
aws ec2 authorize-security-group-egress \
  --group-id ${CLOUD9_SG_ID} --protocol tcp --port 443 --cidr 0.0.0.0/0

まとめ

  • CloudFormationテンプレートでCloud9を構築すると、手作業のミスを防ぎ再現性が向上する
  • SSM接続を使えばインバウンドの22番ポート開放が不要になる
  • EBSサイズの拡張とアウトバウンド通信の制限はAWS CLIで対応できる
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?