【Alibaba Cloud】【Resource Orchestration Service】ROSを使用して、VPC、VSwitch、SG、ECSを作成する。

はじめに

Resource Orchestration Service(以下、ROS)とは中国のクラウドサービスであるAlibaba Cloudを監視するサービスです。
AWSでいうと CloudFormationと同様のサービスです。
一度、テンプレートを作成してしまえば、構築が簡単にできます。
また、リソース単位でを構成管理でき、うっかりしたインスタン立ち上げっぱなし、削除間違いを防げます。
今回はROSでの、ECS+VPC+VSwitch+SGのテンプレート作成方法を説明します。
ROSのコンソールの説明は公式サイトを参考にしてください。

ROSTemplate

---
ROSTemplateFormatVersion: '2015-09-01'
Description: " A simple ECS instance includes a security group. You only need to designate
  an imageID."

Parameters:
  prefix:
    Type: String
    AllowedPattern: "[a-zA-Z0-9]*"
    Description: Resource prefix(Alphabet/Number Only, No Space)
    Label: prefix
  InstanceType:
    Type: String
    Description: ECS Instance Type    #インスタンスタイプ
    AllowedValues:
    - ecs.t5-lc1m1.small
    - ecs.n4.small
    - ecs.sn1.medium
    - ecs.sn1ne.large
    Default: ecs.t5-lc1m1.small
    Label: ECS Instance Type
  SourceCidrIp:
    Type: String
    AllowedPattern: "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/32"
    Description: "Security Group Source ssh, Your Global Address (XXX.XXX.XXX.XXX/32)"
    Default:                # グローバルアドレス
    Label: SourceCidrIp
  KeyPairName:
    Type: String
    Description: "KeyPairName"
    Default:                # keypairName
    Label: KeyPairName  

# ROSでの成果物
Resources:
  vpc1:
    Type: ALIYUN::ECS::VPC
    Description: test_vpc
    Properties:
      CidrBlock: 10.0.0.0/8     #   VPC IP
      VpcName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - VPC
  VSwitch1:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VpcId:
        Ref: vpc1
      VSwitchName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - VSwitch
      Description: test_vswtich
      ZoneId: ap-northeast-1a       #   リージョンとゾーン
      CidrBlock: 10.1.0.0/24        #   VSitch IP
  sg1:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      VpcId:
        Ref: vpc1
      SecurityGroupName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - sg
      Description: test_securitygrorup
      SecurityGroupIngress:         #   インバウンドの設定
      - PortRange: 22/22            #   ポートをレンジで設定
        Priority: '1'               #   優先度
        IpProtocol: tcp             #  プロトコル all/tcp/udp/icmp
        SourceCidrIp:
          Ref: SourceCidrIp
        NicType: intranet
      SecurityGroupEgress:          #  アウトバウントの設定
      - PortRange: "-1/-1"          # allまたはicmpは-1/-1を指定
        Priority: '1'
        IpProtocol: all             # プロトコル all/tcp/udp/icmp
        DestCidrIp: 0.0.0.0/0
        NicType: intranet
  ecs1:
    Type: ALIYUN::ECS::Instance
    Properties:
      InstanceName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - ECS
      HostName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - ECS
      Description: test ec2
      PrivateIpAddress: 10.1.0.1        # プライベートアドレス
      ZoneId: ap-northeast-1a
      InstanceType:
        Ref: InstanceType
      InstanceChargeType: PostPaid      # 従量課金
      SpotStrategy: NoSpot              # 通常の従量課金インスタンス
      ImageId: centos_7                 # OSのイメージを設定
      SystemDiskCategory: cloud_ssd     # ディスクのタイプ
      SystemDiskSize: '40'              # ディスクサイズ
      InternetMaxBandwidthIn: '5'       # 最大トラフィック
      InternetChargeType: PayByTraffic  # トラフィックで課金
      KeyPairName:
        Ref: KeyPairName
      VpcId:
        Ref: vpc1
      VSwitchId:
        Ref: VSwitch1
      SecurityGroupId:
        Ref: sg1

# ROSのOutPuts(出力)に表記する値の設定
Outputs:
  vpc1_id:
    Value:
      Fn::GetAtt:
      - vpc1
      - VpcId
    Description: test_vpc
  vswitch1_id:
    Value:
      Fn::GetAtt:
      - VSwitch1
      - VSwitchId
    Description: test_VSwitch
  sg1_id:
    Value:
      Fn::GetAtt:
      - sg1
      - SecurityGroupId
    Description: test_sg
  ecs1_id:
    Value:
      Fn::GetAtt:
        - ecs1
        - InstanceId
    Description: test_ecs
  ecs1_PrivateIp:
    Value:
      Fn::GetAtt:
        - ecs1
        - PrivateIp
    Description: test_ecs
  ecs1_PublicIp:
    Value:
      Fn::GetAtt:
        - ecs1
        - PublicIp
    Description: test_ecs

上記をAlibaba CloudのROSコンソールより、アップロードすれば、スタックが作成されます。

Parameter

Parameters:
  prefix:
    Type: String
    AllowedPattern: "[a-zA-Z0-9]*"
    Description: Resource prefix(Alphabet/Number Only, No Space)
    Label: prefix
  InstanceType:
    Type: String
    Description: ECS Instance Type    #インスタンスタイプ
    AllowedValues:
    - ecs.t5-lc1m1.small
    - ecs.n4.small
    - ecs.sn1.medium
    - ecs.sn1ne.large
    Default: ecs.t5-lc1m1.small
    Label: ECS Instance Type
  SourceCidrIp:
    Type: String
    AllowedPattern: "(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/32"
    Description: "Security Group Source ssh, Your Global Address (XXX.XXX.XXX.XXX/32)"
    Default:                # グローバルアドレス
    Label: SourceCidrIp
  KeyPairName:
    Type: String
    Description: "KeyPairName"
    Default:                # keypairName
    Label: KeyPairName  

ROS内で使用するパラメータを設定します。各変数ごとに以下の設定します。
また、テンプレートパラメータの設定時に値を入力することができます。

項目 備考
Type 型を設定
AllowedPattern テンプレートパラメータの設定時の入力規則 を設定
AllowedValues ここに設定した値のみ、記入できる。テンプレートパラメータの設定時にドロップダウンメニューになる。
Default テンプレートパラメータの設定時のデフォルト値を設定
Label 任意のラベルを設定
Description 説明を入力

SourceCidrIpでは入力規則により、グローバルアドレスのみの入力を許可しています。

Resources(VPC

Resources:
  vpc1:
    Type: ALIYUN::ECS::VPC
    Description: test_vpc
    Properties:
      CidrBlock: 10.0.0.0/8     #   VPC IP
      VpcName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - VPC

Type でVPCのタイプである。ALIYUN::ECS::VPCを設定します。
PropertiesでVPCの細かい設定を記入しています。

      Fn::Join:
        - "-"
        - - Ref: prefix
          - VPC

VpcNameではVPCの名前を設定しますが関数を使用して、Parametarで設定した変数prefixとVPCを結合させています。 VPC名が<prefixで設定した値>-ECSになります。

Resources(VSwitch)

  VSwitch1:
    Type: ALIYUN::ECS::VSwitch
    Properties:
      VpcId:
        Ref: vpc1
      VSwitchName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - VSwitch
      Description: test_vswtich
      ZoneId: ap-northeast-1a       #   リージョンとゾーン
      CidrBlock: 10.1.0.0/24        #   VSitch IP

基本的にVPCと一緒です。ZoneIdでap-northeast-1a東京リージョンのZoneAをしています。
aを忘れないでください。

Resources(SecurityGroup)

  sg1:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      VpcId:
        Ref: vpc1
      SecurityGroupName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - sg
      Description: test_securitygrorup
      SecurityGroupIngress:         #   インバウンドの設定
      - PortRange: 22/22            #   ポートをレンジで設定
        Priority: '1'               #   優先度
        IpProtocol: tcp             #  プロトコル all/tcp/udp/icmp
        SourceCidrIp:
          Ref: SourceCidrIp
        NicType: intranet
      SecurityGroupEgress:          #  アウトバウントの設定
      - PortRange: "-1/-1"          # allまたはicmpは-1/-1を指定
        Priority: '1'
        IpProtocol: all             # プロトコル all/tcp/udp/icmp
        DestCidrIp: 0.0.0.0/0
        NicType: intranet

SecurityGroupIngressはインバウンド側の設定です。
PortRange22/22、IpProtocol: tcpsshをのみ許可しています。
また、SourceCidrIpでグローバルアドレスのみにし、セキュアにしています。
SecurityGroupEgressはアウンバウンド側の設定です。
全て許可しています。

Resources(ECS)

  ecs1:
    Type: ALIYUN::ECS::Instance
    Properties:
      InstanceName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - ECS
      HostName:
        Fn::Join:
        - "-"
        - - Ref: prefix
          - ECS
      Description: test ec2
      PrivateIpAddress: 10.1.0.1        # プライベートアドレス
      ZoneId: ap-northeast-1a
      InstanceType:
        Ref: InstanceType
      InstanceChargeType: PostPaid      # 従量課金
      SpotStrategy: NoSpot              # 通常の従量課金インスタンス
      ImageId: centos_7                 # OSのイメージを設定
      SystemDiskCategory: cloud_ssd     # ディスクのタイプ
      SystemDiskSize: '40'              # ディスクサイズ
      InternetMaxBandwidthIn: '5'       # 最大トラフィック
      InternetChargeType: PayByTraffic  # トラフィックで課金
      KeyPairName:
        Ref: KeyPairName
      VpcId:
        Ref: vpc1
      VSwitchId:
        Ref: VSwitch1
      SecurityGroupId:
        Ref: sg1

ECSの設置をします。
色々設定項目がありますが、以下の設定は絶対に間違えないでください。
‘InstanceChargeType: PostPaid‘ 従量課金
‘InternetChargeType: PayByTraffic‘ トラフィックで課金
細かい設定は参考文献を元に決定してください。

Outputs

Outputs:
  vpc1_id:
    Value:
      Fn::GetAtt:
      - vpc1
      - VpcId
    Description: test_vpc
  vswitch1_id:
    Value:
      Fn::GetAtt:
      - VSwitch1
      - VSwitchId
    Description: test_VSwitch
  sg1_id:
    Value:
      Fn::GetAtt:
      - sg1
      - SecurityGroupId
    Description: test_sg
  ecs1_id:
    Value:
      Fn::GetAtt:
        - ecs1
        - InstanceId
    Description: test_ecs
  ecs1_PrivateIp:
    Value:
      Fn::GetAtt:
        - ecs1
        - PrivateIp
    Description: test_ecs
  ecs1_PublicIp:
    Value:
      Fn::GetAtt:
        - ecs1
        - PublicIp
    Description: test_ecs

ROSのコンソール画面の出力タブに表示する項目を設定します。
OutPutsは設定しなくても動作しますが、よく使用する項目(IPアドレスとか)を設定しておくことで、構成管理がしやすくなります。

    Value:
      Fn::GetAtt:
        - ecs1
        - PrivateIp

上記は、ECSのIPアドレスを関数により呼び出しています。
ECSとIPがOutPuts画面からわかるので、いちいちECSのコンソール画面に飛ばなくてもよくなります。

さいごに

ROSはCloudFormationと作成方法が似ているので、意外と導入は容易なのではないかと思います。
また、日本語のドキュメントががあるので、そちらを参考に作成するのが良いと感じました。

参考文献