チームメンバーに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で対応できる