EC2を開発環境として利用する際の構築手順


開発環境としてEC2を選ぶ理由

  • 高速な通信環境が欲しかったから
  • 自宅での開発と、外出先での開発を行っており、それらでローカル開発環境を統一したかったから。
  • 持っているマシンが貧弱だった為、ローカル開発環境くらいは良いマシンでコンパイル速度を早めたい
  • EC2にIAM roleを付与することで、Secretを保存する必要がなくなり、セキュリティ事故の可能性を低減することができる

VPCを作成する

aws ec2 create-vpc --cidr-block 10.0.0.0/16 --query Vpc.VpcId --output text
vpc-0a73e042f9d80bd32

サブネットを作成する

EC2を立てるためのサブネットを作成します。

aws ec2 create-subnet --vpc-id vpc-0a73e042f9d80bd32 --cidr-block 10.0.1.0/24

今回は使いませんが、今後のため2つ目のサブネットを作成します。こちらはプライベートサブネットとする予定です。

aws ec2 create-subnet --vpc-id vpc-0a73e042f9d80bd32 --cidr-block 10.0.0.0/24

サブネットをパブリックにする

サブネットをパブリックにするために、VPCにインターネットゲートウェイをアタッチします。
まずインターネットゲートウェイを作成します。インターネットゲートウェイが無いとパブリックサブネットを作成することができないためです。

ws ec2 create-internet-gateway --query InternetGateway.InternetGatewayId --output text
igw-0df36c496ef768575

次にインターネットゲートウェイを作成したVPCにアタッチします

aws ec2 attach-internet-gateway --vpc-id vpc-0a73e042f9d80bd32 --internet-gateway-id igw-0df36c496ef768575

次に空のカスタムルートテーブルを作成します。この時点ではルーティングが設定されていません。

aws ec2 create-route-table --vpc-id vpc-0a73e042f9d80bd32 --query RouteTable.RouteTableId --output text
rtb-025cf33f51376831a

ルートテーブルにルーティングを設定します。全てのトラフィックが作成したインターネットゲートウェイにルーティングされるルートを作成します。この時点ではルーティングテーブルにルートを設定しただけですので、各サブネットにルートが関連付けられているわけではありません。

aws ec2 create-route --route-table-id rtb-025cf33f51376831a --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0df36c496ef768575

作成したルートテーブルの状況を確認してみます。確かに全てのトラフィックがインターネットゲートウェイに流れる仕様になっていることが確認できます。

 $ aws ec2 describe-route-tables --route-table-id rtb-025cf33f51376831a
{
    "RouteTables": [
        {
            "Associations": [],
            "PropagatingVgws": [],
            "RouteTableId": "rtb-025cf33f51376831a",
            "Routes": [
                {
                    "DestinationCidrBlock": "10.0.0.0/16",
                    "GatewayId": "local",
                    "Origin": "CreateRouteTable",
                    "State": "active"
                },
                {
                    "DestinationCidrBlock": "0.0.0.0/0",
                    "GatewayId": "igw-0df36c496ef768575",
                    "Origin": "CreateRoute",
                    "State": "active"
                }
            ],
            "Tags": [],
            "VpcId": "vpc-0a73e042f9d80bd32",
            "OwnerId": "776203529156"
        }
    ]
}

実際に作成されているサブネットの状況を確認します

aws ec2 describe-subnets --filters "Name=vpc-id,Values=vpc-0a73e042f9d80bd32" --query "Subnets[*].{ID:SubnetId,CIDR:CidrBlock}"

サブネットのうちの一つをルーティングテーブルに関連付けます。これによりアタッチされたサブネットでインターネットゲートウェイへのルーティングが行われる様になった為、このサブネットがパブリックサブネットとなります。

aws ec2 associate-route-table  --subnet-id subnet-0291570ec75ebe8f4 --route-table-id rtb-025cf33f51376831a

作成したパブリックサブネットに対して、パブリックサブネットに起動されたインスタンスに自動的にパブリックIPを付与する設定に変更します。

aws ec2 modify-subnet-attribute --subnet-id subnet-0291570ec75ebe8f4 --map-public-ip-on-launch

インスタンスを作成する

EC2インスタンスを作成するために、まずはkey pairを作成します

aws ec2 create-key-pair --key-name MyKeyPair --query "KeyMaterial" --output text > MyKeyPair.pem

VPCに空のセキュリティグループを作成します

aws ec2 create-security-group --group-name SSHAccess --description "Security group for SSH access" --vpc-id vpc-0a73e042f9d80bd32
{
    "GroupId": "sg-0d39ab3f94597b16e"
}

作成した空のセキュリティグループにあらゆる場所からの SSHアクセスを許可するインバウンドルールを設定します。cidrブロックの部分は、今後アクセス元のIPアドレスに絞る様にします。

aws ec2 authorize-security-group-ingress --group-id sg-0d39ab3f94597b16e --protocol tcp --port 22 --cidr 0.0.0.0/0

パブリックサブネット内部に(ようやく)インスタンスを起動します。
コマンドで最新のAMIを取得しています。

aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type  t3a.large --key-name MyKeyPair --security-group-ids sg-0d39ab3f94597b16e --subnet-id subnet-0291570ec75ebe8f4

以下のコマンドを打つことで接続できます。

ssh -i "MyKeyPair.pem" [email protected]

今後、このEC2上で開発を行うことができる様になりました。
次は EC2にIAM roleを付与し、AWS CLIを使って全リソースにアクセスできる様にしていきます。