BETA

AWS CloudFormationテンプレート設定メモ

投稿日:2019-02-15
最終更新:2019-02-24

AWS CloudFormationは、EC2やS3といったリソースをひとまとめに作成できる大変便利な仕組みです。
テンプレートファイルに設定を書くと書いた通りにAWSがよろしくやってくれます。
一度テンプレートファイルが出来てしまえば、何度でも同じリソースの作成が簡単に行えます。

しかしながら、やれることが多いため覚えることもそれなりにあります。
記録しておかないときっと忘れます。
このログには、よく使う設定や覚えておくと便利なことを残していきます。

[1]疑似パラメータ

擬似パラメーター参照 - AWS CloudFormation

  • AWS::AccountId
  • AWS::NotificationARNs
  • AWS::NoValue
  • AWS::Partition
  • AWS::Region
  • AWS::StackId
  • AWS::StackName
  • AWS::URLSuffix

[2]組み込み関数

組み込み関数リファレンス - AWS CloudFormation

関数 使用例 結果
!Sub !Sub “${AWS::StackName}-vpc” “MyStackName-vpc”
!GetAZs !GetAZs “” [ap-northeast-1a, ap-northeast-1c, ap-northeast-1d]
!Select !Selext [0, !GetAZs “”] ap-northeast-1a
!GetAttr !GetAtt MyVpc.CidrBlock 10.0.0.0/16
!FindInMap !FindInMap [RegionMap, !Ref “AWS::Region”, “HVM64”] ami-xxx

[3]Parameters

パラメータ - AWS CloudFormation

InstanceTypeParameter:   
    Type: String  
    Default: t3.micro  
    AllowedValues: ["t3.nano", "t3.micro", "t3.small", "t3.medium", "t3.large"]  
    Description: "EC2 instance type"  
    ConstraintDescription: "must be a valid EC2 instance type."

[4]AWS固有のパラメーター型

AWS 固有のパラメーター型

  • AWS::EC2::AvailabilityZone::Name
  • AWS::EC2::Image::Id
  • AWS::EC2::Instance::Id
  • AWS::EC2::KeyPair::KeyName
  • AWS::EC2::SecurityGroup::GroupName
  • AWS::EC2::SecurityGroup::Id
  • AWS::EC2::Subnet::Id
  • AWS::EC2::Volume::Id
  • AWS::EC2::VPC::Id
  • AWS::Route53::HostedZone::Id

[5]Resources

全般

  • VPC
  MyVpcId:  
    Type: 'AWS::EC2::VPC'  
    Properties:  
      CidrBlock: 10.0.0.0/16  
      Tags:  
        - Key: Name  
          Value: vpc
  • サブネット
  MySubnetId:  
    Type: 'AWS::EC2::Subnet'  
    Properties:  
      VpcId: !Ref MyVpcId  
      CidrBlock: 10.0.0.0/24  
      Tags:  
        - Key: Name  
          Value: sb

ゲートウェイ

  • インターネットゲートウェイ
  MyInternetGatewayId:  
    Type: 'AWS::EC2::InternetGateway'  
    Properties:  
      Tags:  
        - Key: Name  
          Value: igw
  • VPCGatewayAttachment
  MyVPCGatewayAttachmentId:  
    Type: 'AWS::EC2::VPCGatewayAttachment'  
    Properties:  
      InternetGatewayId: !Ref MyInternetGatewayId  
      VpcId: !Ref MyVpcId

ルーティング

  • ルートテーブル
  MyRouteTableId:  
    Type: 'AWS::EC2::RouteTable'  
    Properties:  
      VpcId: !Ref MyVpcId  
      Tags:  
        - Key: Name  
          Value: rt
  • SubnetRouteTableAssociation
  MySubnetRouteTableAssociationId:  
    Type: 'AWS::EC2::SubnetRouteTableAssociation'  
    Properties:  
      SubnetId: !Ref MySubnetId  
      RouteTableId: !Ref MyRouteTableId
  • Route
  MyRouteId:  
    Type: 'AWS::EC2::Route'  
    Properties:  
      GatewayId: !Ref MyInternetGatewayId  
      RouteTableId: !Ref MyRouteTableId  
      InstanceId: !Ref MyInstanceId  
      DestinationCidrBlock: 0.0.0.0/0

ネットワークACL

  • ネットワークACL
  MyNetworkAclId:  
    Type: 'AWS::EC2::NetworkAcl'  
    Properties:  
      VpcId: !Ref MyVpcId  
      Tags:  
        - Key: Name  
          Value: nacl
  • SubnetNetworkAclAssociation
  MySubnetNetworkAclAssociationId:  
    Type: "AWS::EC2::SubnetNetworkAclAssociation"  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      SubnetId: !Ref MySubnetId
  • SSH
  SshRuleId:  
    Type: 'AWS::EC2::NetworkAclEntry'  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      RuleNumber: !Ref SshRuleNumber  
      Protocol: 6  
      PortRange:  
        From: 22  
        To: 22  
      CidrBlock: 0.0.0.0/0  
      Egress: false # Outのときはtrue  
      RuleAction: allow
  • ICMP
  IcmpRuleId:  
    Type: 'AWS::EC2::NetworkAclEntry'  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      RuleNumber: !Ref IcmpRuleNumber  
      Protocol: 1  
      Icmp:  
        Code: -1  
        Type: -1  
      CidrBlock: 0.0.0.0/0  
      Egress: false # Outのときはtrue  
      RuleAction: allow
  • HTTP
  HttpRuleId:  
    Type: 'AWS::EC2::NetworkAclEntry'  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      RuleNumber: !Ref HttpRuleNumber  
      Protocol: 6  
      PortRange:  
        From: 80  
        To: 80  
      CidrBlock: 0.0.0.0/0  
      Egress: false # Outのときはtrue  
      RuleAction: allow
  • HTTPS
  HttpsRuleId:  
    Type: 'AWS::EC2::NetworkAclEntry'  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      RuleNumber: !Ref HttpsRuleNumber  
      Protocol: 6  
      PortRange:  
        From: 443  
        To: 443  
      CidrBlock: 0.0.0.0/0  
      Egress: false # Outのときはtrue  
      RuleAction: allow
  • TCPのエフェメラルポート
  TcpEphemeralRuleId:  
    Type: 'AWS::EC2::NetworkAclEntry'  
    Properties:  
      NetworkAclId: !Ref MyNetworkAclId  
      RuleNumber: !Ref TcpEphemeralRuleNumber  
      Protocol: 6  
      PortRange:  
        From: 1024  
        To: 65535  
      CidrBlock: 0.0.0.0/0  
      Egress: false # Outのときはtrue  
      RuleAction: allow

セキュリティグループ

  MySecurityGroupId:  
    Type: 'AWS::EC2::SecurityGroup'  
    Properties:  
      GroupName: 'Security Group Name'  
      GroupDescription: 'Security Group Description.'  
      VpcId: !Ref MyVpcId  
      Tags:  
        - Key: Name  
          Value:sg  
      # Inbound  
      SecurityGroupIngress:  
        # SSH  
        - IpProtocol: tcp  
          FromPort: 22  
          ToPort: 22  
          CidrIp: 0.0.0.0/0  
        # ICMP  
        - IpProtocol: icmp  
          FromPort: -1 # 0:Echo Reply, 8:Echo Request  
          ToPort: -1  
          CidrIp: 0.0.0.0/0  
        # HTTP  
        - IpProtocol: tcp  
          FromPort: 80  
          ToPort: 80  
          CidrIp: 0.0.0.0/0  
        # HTTPS  
        - IpProtocol: tcp  
          FromPort: 443  
          ToPort: 443  
          CidrIp: 0.0.0.0/0  
      # Outbound  
      SecurityGroupEgress:  
        # 書き方はInboundと同様

インスタンス

  MyInstanceId:  
    Type: 'AWS::EC2::Instance'  
    Properties:  
      ImageId: !Ref MyImageId  
      InstanceType: !Ref MyInstanceType  
      NetworkInterfaces:   
        - AssociatePublicIpAddress: false # 自動割り当てパブリックIP  
          DeviceIndex: 0  
          GroupSet:   
            - !Ref MySecurityGroupId  
          SubnetId:   
            !Ref MySubnetId  
          PrivateIpAddress: 10.0.0.10  
      SourceDestCheck: true # 送信元/送信先のチェック  
      KeyName: !Ref MyKeyPairName  
      CreditSpecification: # T2/T3 Unlimited  
        CPUCredits: standard # stadard:無効, unlimited:有効  
      BlockDeviceMappings:  
        - DeviceName: /dev/xvda  
          Ebs:   
            VolumeSize: 16  
            VolumeType: gp2  
            DeleteOnTermination: true  
      Tags:   
        - Key: Application  
          Value: app  
        - Key: Name  
          Value: inst

[6]cfnヘルパー

UserDataプロパティ

UserDataプロパティに、インスタンス作成後に実行するシェルスクリプトを書きます。

  MyInstance:  
    Properties:  
      UserData: !Base64  
        Fn::Sub: |  
          #!/bin/bash  

          # (1) ソフトウェアの更新  
          yum -y update  

          # (2) cfnヘルパーをインストール  
          yum -y install aws-cfn-bootstrap  

          # (3) Haskell Stackをインストールするためにリポジトリを追加  
          curl -sSL 'https://s3.amazonaws.com/download.fpcomplete.com/centos/7/fpco.repo' | sudo tee /etc/yum.repos.d/fpco.repo  

          # (4) MetaDataプロパティに書かれたリソースをインストールしたり初期化  
          /opt/aws/bin/cfn-init -v --stack ${AWS::StackName} --resource Instance --region ${AWS::Region}  

          # (5) GitHubからHaskell用のファイルを取得  
          cd /home/ec2-user/  
          git clone 'https://github.com/predora005/haskell.git'  
          chown ec2-user:ec2-user -R haskell/  

          # (6) インスタンスが正常に作成されたかを通知する  
          /opt/aws/bin/cfn-signal -e $? --stack ${AWS::StackName} --resource Instance --region ${AWS::Region}

MetaDataプロパティ

cfnヘルパーでインストールするパッケージやファイルを、MetaDataプロパティに記載します。

  Instance:  
    Type: 'AWS::EC2::Instance'  
    Metadata:  
      AWS::CloudFormation::Init:  
        config:  
          # パッケージのインストール  
          packages:  
            yum:  
              stack: []  
              tree: []  
              git: []  
          # ファイルの作成  
          files:   
            '/home/ec2-user/upgrade_haskell.sh':  
              content:  
                Fn::Sub: |  
                  #!/bin/bash  

                  # Haskell Stack Upgrade  
                  stack update  
                  stack upgrade  

                  # PATH Setting  
                  echo "export PATH=~/.local/bin:$PATH" >> /home/ec2-user/.bashrc  

              mode: "000644"  
              owner: 'ec2-user'  
              group: 'ec2-user'
役に立つことから立たないことまで日々のアウトプットを綴る

0件のコメント

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