AWS CloudFormation練習帖:EC2を冗長構成にしてELBにぶら下げる

公開日:2019-07-19
最終更新:2019-07-19

何をする?

  • プライベートサブネットにRDSをたてる』の状態からEC2を1台追加してELBにぶら下げます
  • 構成図にするとこんな感じのものを作ります
  • ただしテンプレートが長くなってしまうのでRDS部分は記事からは割愛します

前提条件

  • VPC部分のテンプレートは以下を使用
    ※作成済みリソースのID類は手を抜いてベタ打ちにしています
AWSTemplateFormatVersion: "2010-09-09"  
Description: "Create VPC"  
Resources:  
  # VPCを作成  
  VPC:  
    Type: "AWS::EC2::VPC"  
    Properties:  
      CidrBlock: "10.0.0.0/16"  
      Tags:  
        - Key: "Name"  
          Value: "MyVPC"  
  # Public Subnetを作成  
  PublicSubnetA:  
    Type: "AWS::EC2::Subnet"  
    Properties:  
      VpcId: !Ref VPC  
      CidrBlock: "10.0.10.0/24"  
      AvailabilityZone: "ap-northeast-1a"  
      Tags:  
        - Key: "Name"  
          Value: "PublicSubnetA"  
  PublicSubnetC:  
    Type: "AWS::EC2::Subnet"  
    Properties:  
      VpcId: !Ref VPC  
      CidrBlock: "10.0.30.0/24"  
      AvailabilityZone: "ap-northeast-1c"  
      Tags:  
        - Key: "Name"  
          Value: "PublicSubnetC"  
  # Private Subnetを作成  
  PrivateSubnetA:  
    Type: "AWS::EC2::Subnet"  
    Properties:  
      VpcId: !Ref VPC  
      CidrBlock: "10.0.20.0/24"  
      AvailabilityZone: "ap-northeast-1a"  
      Tags:  
        - Key: "Name"  
          Value: "PrivateSubnetA"  
  PrivateSubnetC:  
    Type: "AWS::EC2::Subnet"  
    Properties:  
      VpcId: !Ref VPC  
      CidrBlock: "10.0.40.0/24"  
      AvailabilityZone: "ap-northeast-1c"  
      Tags:  
        - Key: "Name"  
          Value: "PrivateSubnetC"  
  # InternetGatewayを作成  
  InternetGateway:  
    Type: "AWS::EC2::InternetGateway"  
    Properties:  
      Tags:  
        - Key: "Name"  
          Value: "CloudFormationInternetGateway"  
  # InternetGatewayをVPCにアタッチ  
  VPCGatewayAttachment:  
    Type: "AWS::EC2::VPCGatewayAttachment"  
    Properties:  
      InternetGatewayId: !Ref InternetGateway  
      VpcId: !Ref VPC  
  # Public Subnet用のルートテーブルを作成  
  PublicRouteTable:  
    Type: "AWS::EC2::RouteTable"  
    Properties:  
      VpcId: !Ref VPC  
      Tags:  
        - Key: "Name"  
          Value: "PublicRouteTable"  
  PublicRouting:  
    Type: "AWS::EC2::Route"   
    Properties:  
      RouteTableId: !Ref PublicRouteTable  
      GatewayId: !Ref InternetGateway  
      DestinationCidrBlock: "0.0.0.0/0"  
  # ルートテーブルをサブネットにアタッチ  
  PublicRouteTableAttachToPublicSubnetA:  
    Type: "AWS::EC2::SubnetRouteTableAssociation"  
    Properties:  
      RouteTableId: !Ref PublicRouteTable  
      SubnetId: !Ref PublicSubnetA  
  PublicRouteTableAttachToPublicSubnetC:  
    Type: "AWS::EC2::SubnetRouteTableAssociation"  
    Properties:  
      RouteTableId: !Ref PublicRouteTable  
      SubnetId: !Ref PublicSubnetC  

やってみた

テンプレートを作成

お決まりの部分

AWSTemplateFormatVersion: "2010-09-09"  
Description: "Create EC2 AND ALB"  

リソース部分(セキュリティグループ)

ロードバランサー用/EC2用のセキュリティグループを作成します
ロードバランサーは80と443、EC2はロードバランサー用セキュリティグループからの80のみ許可します

Resources:  
  # セキュリティグループ(ALB用)  
  SecurityGroupForALB:  
    Type: "AWS::EC2::SecurityGroup"  
    Properties:  
      GroupName: "SecurityGroupForALB"  
      GroupDescription: "SecurityGroup For ALB"  
      SecurityGroupIngress:  
        - IpProtocol: "tcp"  
          FromPort: 80  
          ToPort: 80  
          CidrIp: "0.0.0.0/0"  
        - IpProtocol: "tcp"  
          FromPort: 443  
          ToPort: 443  
          CidrIp: "0.0.0.0/0"  
      VpcId: "vpc-0cbeec0c7e2dc25cb"  
  # セキュリティグループ(EC2用)  
  SecurityGroupForEC2:  
    Type: "AWS::EC2::SecurityGroup"  
    Properties:  
      GroupName: "SecurityGroupForEC2"  
      GroupDescription: "SecurityGroup For EC2"  
      SecurityGroupIngress:  
        - IpProtocol: "tcp"  
          FromPort: 80  
          ToPort: 80  
          SourceSecurityGroupId: !Ref SecurityGroupForALB  
      VpcId: "vpc-0cbeec0c7e2dc25cb"  

リソース部分(EC2)

パブリックサブネット(AZ-a、AZ-c)にEC2を作成します

  # パブリックサブネットにEC2を作成  
  EC2onPublicSubnetA:  
    Type: "AWS::EC2::Instance"  
    Properties:  
      ImageId: "ami-0c3fd0f5d33134a76"  
      InstanceType: "t2.micro"  
      SubnetId: "subnet-0bd32ee328fbff0fa"  
      BlockDeviceMappings:  
        - DeviceName: "/dev/xvda"  
          Ebs:  
            VolumeType: "gp2"  
            VolumeSize: 8  
            DeleteOnTermination: true  
      SecurityGroupIds:  
        - !Ref SecurityGroupForEC2  
      KeyName: "cloudformation"  
      Tags:  
        - Key: "Name"  
          Value: "PublicEC2-A"  
  # ElasticIPを割り当て  
  ElasticIPA:  
    Type: "AWS::EC2::EIP"  
    Properties:  
      Domain: "vpc-0cbeec0c7e2dc25cb"  
      InstanceId: !Ref EC2onPublicSubnetA  
  # パブリックサブネットにEC2を作成  
  EC2onPublicSubnetC:  
    Type: "AWS::EC2::Instance"  
    Properties:  
      ImageId: "ami-0c3fd0f5d33134a76"  
      InstanceType: "t2.micro"  
      SubnetId: "subnet-03922cb462b0de134"  
      BlockDeviceMappings:  
        - DeviceName: "/dev/xvda"  
          Ebs:  
            VolumeType: "gp2"  
            VolumeSize: 8  
            DeleteOnTermination: true  
      SecurityGroupIds:  
        - !Ref SecurityGroupForEC2  
      KeyName: "cloudformation"  
      Tags:  
        - Key: "Name"  
          Value: "PublicEC2-C"  
  # ElasticIPを割り当て  
  ElasticIPC:  
    Type: "AWS::EC2::EIP"  
    Properties:  
      Domain: "vpc-0cbeec0c7e2dc25cb"  
      InstanceId: !Ref EC2onPublicSubnetC  

リソース部分(ターゲットグループ)

ALBで利用するターゲットグループを作成します

  # ターゲットグループ  
  TargetGroup:  
    Type: "AWS::ElasticLoadBalancingV2::TargetGroup"  
    Properties:  
      Name: "PublicTargetGroup"  
      Protocol: "HTTP"  
      Port: 80  
      HealthCheckPath: "/index.html"  
      HealthCheckIntervalSeconds: 30  
      TargetType: "instance"  
      VpcId: "vpc-0cbeec0c7e2dc25cb"  
      Targets:  
        - Id: !Ref EC2onPublicSubnetA  
          Port: 80  
        - Id: !Ref EC2onPublicSubnetC  
          Port: 80  

リソース部分(ロードバランサー)

ALBを作成し、リスナーを設定します

  # ロードバランサー  
  ALB:  
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"  
    Properties:  
      Name: "PublicALB"  
      Scheme: "internet-facing"  
      IpAddressType: "ipv4"  
      Subnets:  
        - "subnet-0bd32ee328fbff0fa"  
        - "subnet-03922cb462b0de134"  
      SecurityGroups:  
        - !Ref SecurityGroupForALB  
  # リスナー  
  Listener:  
    Type: "AWS::ElasticLoadBalancingV2::Listener"  
    Properties:  
      LoadBalancerArn: !Ref ALB  
      Port: 80  
      Protocol: "HTTP"  
      DefaultActions:  
        - TargetGroupArn: !Ref TargetGroup  
          Type: "forward"  

実行

  • 今回はパラメータを利用しなかったのでそのまま実行
  • ステータスが「CREATE_COMPLETE」になり、作成完了

結果確認

  • ALBが作成されています
  • リスナーが設定されています
  • ターゲットグループでは指定したEC2が設定されています
    ※nginxの設定およびヘルスチェック用のファイルを置いていないので「unhealthy」になっています

参考情報

記事が少しでもいいなと思ったらクラップを送ってみよう!
0
+1
AWSやAzureについて勉強したことをつらつらと。 基本的には未来の自分に向けたメモ的な何か。

よく一緒に読まれている記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる

技術ブログをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

技術ブログを開設する

Qrunchでアウトプットをはじめよう

Qrunch(クランチ)は、ITエンジニアリングに携わる全ての人のための技術ブログプラットフォームです。

Markdownで書ける

ログ機能でアウトプットを加速

デザインのカスタマイズが可能

技術ブログ開設

ここから先はアカウント(ブログ)開設が必要です

英数字4文字以上
.qrunch.io
英数字6文字以上
ログインする