Cloud Assembly 설계 예제에서는 최소한의 WordPress 리소스만 포함된(예: 애플리케이션 서버 1개만 포함) 클라우드 템플릿으로 작업을 시작합니다.

Cloud Assembly는 인프라를 코드로 구현하는 도구입니다. 먼저 설계 캔버스로 리소스를 끌어 와서 작업을 시작합니다. 그런 다음 캔버스의 오른쪽에 있는 코드 편집기를 사용하여 세부 정보를 완성합니다.

코드 편집기를 사용하면 코드를 직접 입력하고, 잘라내고, 붙여 넣을 수 있습니다. 코드 편집이 불편하면 캔버스에서 리소스를 선택하고 코드 편집기 속성 탭을 클릭한 다음 그 곳에 값을 입력하면 됩니다. 입력한 값이 마치 직접 입력한 것처럼 코드에 나타납니다.

프로시저

  1. 설계 > 클라우드 템플릿으로 이동하여 새로 만들기 > 빈 캔버스를 클릭합니다.
  2. 클라우드 템플릿 이름을 Wordpress-BP로 지정합니다.
  3. WordPress 프로젝트를 선택하고 생성을 클릭합니다.
  4. 클라우드 템플릿 설계 페이지의 왼쪽에 있는 리소스에서 클라우드 애그노스틱 시스템 2개를 캔버스로 끌어 옵니다.
    이 두 시스템은 WordPress 애플리케이션 서버(WebTier)와 MySQL 데이터베이스 서버(DBTier)로 사용됩니다.
  5. 오른쪽에서 시스템 YAML 코드를 편집하여 이름, 이미지, 버전 및 제약 조건 태그를 추가합니다.
    resources:
      WebTier:
        type: Cloud.Machine    
        properties:     
            name: wordpress      
            image: ubuntu      
            flavor: small      
            constraints:        
                - tag: env:dev
      DBTier:    
        type: Cloud.Machine    
        properties:      
            name: mysql      
            image: ubuntu      
            flavor: small      
            constraints:        
                - tag: env:dev
    
  6. 클라우드 애그노스틱 네트워크를 캔버스로 끌어 와서 해당 코드를 편집합니다.
     WP-Network-Private:
        type: Cloud.Network
        properties:
            name: WP-Network-Private
            networkType: existing
    
  7. 시스템을 네트워크에 연결합니다.

    캔버스에서 네트워크 블록 위로 마우스를 가져간 후 선이 블록과 만나는 지점을 클릭하여 누른 상태에서 시스템 블록으로 끈 다음 마우스 버튼을 놓습니다.

    연결 줄을 생성할 때 네트워크 코드는 편집기에서 시스템에 자동으로 추가됩니다.

    시스템 2개와 네트워크 1개
  8. 사용자 입력 프롬프트를 추가합니다.

    일부 경우에는 여러 옵션을 사용하도록 예제 인프라가 설정되었습니다. 예를 들면 다음과 같습니다.

    • 개발, 테스트 및 운영을 위한 클라우드 영역 환경
    • 소규모, 중간 규모 및 대규모 시스템을 위한 버전 매핑

    특정 옵션을 클라우드 템플릿에 직접 설정할 수도 있지만, 템플릿 배포 시 사용자가 옵션을 선택할 수 있게 하는 방법이 더 좋습니다. 사용자에게 입력을 요청하면 하드 코딩된 템플릿 여러 개를 사용하는 대신 다양한 방식으로 배포할 수 있는 하나의 템플릿을 생성할 수 있습니다.

    1. 배포 시 사용자가 시스템 크기 및 대상 환경을 선택할 수 있도록 코드에 inputs 섹션을 생성합니다. 선택할 수 있는 값을 정의합니다.
      inputs:
        env:
          type: string
          enum:
            - env:dev
            - env:prod
            - env:test
          default: env:dev
          title: Environment
          description: Target Environment
        size:
          type: string
          enum:
            - small
            - medium
            - large
          description: Size of Nodes
          title: Tier Machine Size
      
    2. 코드의 resources 섹션에 사용자의 선택을 요청하는 ${input.input-name} 코드를 추가합니다.
      resources:
        WebTier:
          type: Cloud.Machine    
          properties:     
              name: wordpress      
              image: ubuntu      
              flavor: '${input.size}'      
              constraints:        
                  - tag: '${input.env}'
              networks:
                  - network: '${resource["WP-Network-Private"].id}'
        DBTier:    
          type: Cloud.Machine    
          properties:      
              name: mysql      
              image: ubuntu      
              flavor: '${input.size}'      
              constraints:        
                  - tag: '${input.env}'
              networks:
                  - network: '${resource["WP-Network-Private"].id}'
        WP-Network-Private:
          type: Cloud.Network
          properties:
              name: WP-Network-Private
              networkType: existing
      
  9. 마지막으로 다음의 예시를 사용하여 WebTierDBTier 코드를 향상시킵니다. WP-Network-Private 코드는 추가적으로 변경할 필요가 없습니다.
    향상된 기능에는 데이터베이스 서버로의 로그인 액세스 및 배포 시점의 cloudConfig 초기화 스크립트가 포함됩니다.
    구성 요소
    추가적인 DBTier 입력
      username:
        type: string
        minLength: 4
        maxLength: 20
        pattern: '[a-z]+'
        title: Database Username
        description: Database Username
      userpassword:
        type: string
        pattern: '[a-z0-9A-Z@#$]+'
        encrypted: true
        title: Database Password
        description: Database Password
    
    DBTier 리소스
      DBTier:
        type: Cloud.Machine
        properties:
          name: mysql
          image: ubuntu
          flavor: '${input.size}'
          constraints:
            - tag: '${input.env}'
          networks:
            - network: '${resource["WP-Network-Private"].id}'
              assignPublicIpAddress: true
          remoteAccess:
            authentication: usernamePassword
            username: '${input.username}'
            password: '${input.userpassword}'
          cloudConfig: |
            #cloud-config
            repo_update: true
            repo_upgrade: all
            packages:
            - mysql-server
            runcmd:
            - sed -e '/bind-address/ s/^#*/#/' -i /etc/mysql/mysql.conf.d/mysqld.cnf
            - service mysql restart
            - mysql -e "CREATE USER 'root'@'%' IDENTIFIED BY 'mysqlpassword';" 
            - mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
            - mysql -e "FLUSH PRIVILEGES;"
          attachedDisks: []
    
    WebTier 리소스
      WebTier:
        type: Cloud.Machine
        properties:
          name: wordpress
          image: ubuntu
          flavor: '${input.size}'
          constraints:
            - tag: '${input.env}'
          networks:
            - network: '${resource["WP-Network-Private"].id}'
              assignPublicIpAddress: true
          cloudConfig: |
            #cloud-config
            repo_update: true
            repo_upgrade: all
            packages:
            - apache2
            - php
            - php-mysql
            - libapache2-mod-php
            - mysql-client
            - gcc
            - make
            - autoconf
            - libc-dev
            - pkg-config
            - libmcrypt-dev
            - php-pear
            - php-dev
            runcmd:
            - mkdir -p /var/www/html/mywordpresssite && cd /var/www/html && wget https://wordpress.org/latest.tar.gz && tar -xzf /var/www/html/latest.tar.gz -C /var/www/html/mywordpresssite --strip-components 1
            - i=0; while [ $i -le 10 ]; do mysql --connect-timeout=3 -h ${DBTier.networks[0].address} -u root -pmysqlpassword -e "SHOW STATUS;" && break || sleep 15; i=$((i+1)); done
            - mysql -u root -pmysqlpassword -h ${DBTier.networks[0].address} -e "create database wordpress_blog;"
            - mv /var/www/html/mywordpresssite/wp-config-sample.php /var/www/html/mywordpresssite/wp-config.php
            - pecl channel-update pecl.php.net
            - pecl update-channels
            - pecl install mcrypt
            - sed -i -e s/"define( 'DB_NAME', 'database_name_here' );"/"define( 'DB_NAME', 'wordpress_blog' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_USER', 'username_here' );"/"define( 'DB_USER', 'root' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_PASSWORD', 'password_here' );"/"define( 'DB_PASSWORD', 'mysqlpassword' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_HOST', 'localhost' );"/"define( 'DB_HOST', '${DBTier.networks[0].address}' );"/ /var/www/html/mywordpresssite/wp-config.php
            - sed -i '950i extension=mcrypt.so' /etc/php/7.4/apache2/php.ini
            - service apache2 reload
    

예: 완료된 기본 클라우드 템플릿 코드 예제

formatVersion: 1
inputs: 
  env:
    type: string
    enum:
      - env:dev
      - env:prod
      - env:test
    default: env:dev
    title: Environment
    description: Target Environment
  size:
    type: string
    enum:
      - small
      - medium
      - large
    description: Size of Nodes
    title: Tier Machine Size
  username:
    type: string
    minLength: 4
    maxLength: 20
    pattern: '[a-z]+'
    title: Database Username
    description: Database Username
  userpassword:
    type: string
    pattern: '[a-z0-9A-Z@#$]+'
    encrypted: true
    title: Database Password
    description: Database Password
resources:
  WebTier:
    type: Cloud.Machine
    properties:
      name: wordpress
      image: ubuntu
      flavor: '${input.size}'
      constraints:
        - tag: '${input.env}'
      networks:
        - network: '${resource["WP-Network-Private"].id}'
          assignPublicIpAddress: true
      cloudConfig: |
        #cloud-config
        repo_update: true
        repo_upgrade: all
        packages:
        - apache2
        - php
        - php-mysql
        - libapache2-mod-php
        - mysql-client
        - gcc
        - make
        - autoconf
        - libc-dev
        - pkg-config
        - libmcrypt-dev
        - php-pear
        - php-dev
        runcmd:
        - mkdir -p /var/www/html/mywordpresssite && cd /var/www/html && wget https://wordpress.org/latest.tar.gz && tar -xzf /var/www/html/latest.tar.gz -C /var/www/html/mywordpresssite --strip-components 1
        - i=0; while [ $i -le 10 ]; do mysql --connect-timeout=3 -h ${DBTier.networks[0].address} -u root -pmysqlpassword -e "SHOW STATUS;" && break || sleep 15; i=$((i+1)); done
        - mysql -u root -pmysqlpassword -h ${DBTier.networks[0].address} -e "create database wordpress_blog;"
        - mv /var/www/html/mywordpresssite/wp-config-sample.php /var/www/html/mywordpresssite/wp-config.php
        - pecl channel-update pecl.php.net
        - pecl update-channels
        - pecl install mcrypt
        - sed -i -e s/"define( 'DB_NAME', 'database_name_here' );"/"define( 'DB_NAME', 'wordpress_blog' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_USER', 'username_here' );"/"define( 'DB_USER', 'root' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_PASSWORD', 'password_here' );"/"define( 'DB_PASSWORD', 'mysqlpassword' );"/ /var/www/html/mywordpresssite/wp-config.php && sed -i -e s/"define( 'DB_HOST', 'localhost' );"/"define( 'DB_HOST', '${DBTier.networks[0].address}' );"/ /var/www/html/mywordpresssite/wp-config.php
        - sed -i '950i extension=mcrypt.so' /etc/php/7.4/apache2/php.ini
        - service apache2 reload
  DBTier:
    type: Cloud.Machine
    properties:
      name: mysql
      image: ubuntu
      flavor: '${input.size}'
      constraints:
        - tag: '${input.env}'
      networks:
        - network: '${resource["WP-Network-Private"].id}'
          assignPublicIpAddress: true
      remoteAccess:
        authentication: usernamePassword
        username: '${input.username}'
        password: '${input.userpassword}'
      cloudConfig: |
        #cloud-config
        repo_update: true
        repo_upgrade: all
        packages:
        - mysql-server
        runcmd:
        - sed -e '/bind-address/ s/^#*/#/' -i /etc/mysql/mysql.conf.d/mysqld.cnf
        - service mysql restart
        - mysql -e "CREATE USER 'root'@'%' IDENTIFIED BY 'mysqlpassword';" 
        - mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';"
        - mysql -e "FLUSH PRIVILEGES;"
      attachedDisks: []
  WP-Network-Private:
    type: Cloud.Network
    properties:
      name: WP-Network-Private
      networkType: existing

다음에 수행할 작업

구문을 검사하고 배포하여 클라우드 템플릿을 테스트합니다.