개발자인 경우 애플리케이션 서버 1개만 포함되어 있는 Blueprint 같이 최소한의 WordPress 리소스만 포함되어 있는 Cloud Assembly Blueprint로 작업을 시작합니다.

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

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

사전 요구 사항

인프라에 익숙해야 합니다. 여기에 나와 있는 예시에서는 사용 사례의 첫 번째 부분의 인프라 값을 사용하지만 이러한 값은 실제 값으로 대체해야 합니다.

프로시저

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

    선이 네트워크 블록과 만나는 지점을 클릭하여 누른 상태에서 시스템 블록까지 끌고 가서 마우스 버튼을 놓습니다.

    시스템 2개와 네트워크 1개

    편집기를 확인하면 두 시스템에 네트워크 코드가 추가되는 것을 볼 수 있습니다.

    resources:
      DBTier:    
        type: Cloud.Machine    
        properties:      
            name: mysql      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints:        
                -   tag: env:dev
            networks: - network: '${resource["WP-Network-Private"].id}'
      WebTier:
        type: Cloud.Machine    
        properties:     
            name: wordpress      
            image: 'ubuntu-16'      
            flavor: 'small'      
            constraints:        
                - tag: env:dev
            networks: - network: '${resource["WP-Network-Private"].id}'
      
  8. 사용자 입력 프롬프트를 추가합니다.

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

    • 개발, 테스트 및 운영을 위한 클라우드 영역 환경
    • 소규모, 중간 규모 및 대규모 시스템을 위한 버전 매핑
    • 일반적인 사용 환경 및 고속 사용 환경을 위한 스토리지 디스크 속도

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

    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:
        DBTier:    
          type: Cloud.Machine    
          properties:      
              name: mysql      
              image: 'ubuntu-16'      
              flavor: '${input.size}'      
              constraints:        
                  -   tag: '${input.env}'
              networks:
                  - network: '${resource["WP-Network-Private"].id}'
        WebTier:
          type: Cloud.Machine    
          properties:     
              name: wordpress      
              image: 'ubuntu-16'      
              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
              constraints:
                  - tag: 'type:isolated-net'
                  - tag: '${input.env}'
  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
      databaseDiskSize:
        type: number
        default: 4
        maximum: 10
        title: MySQL Data Disk Size
        description: Database Disk Size
    
    DBTier 리소스
      DBTier:
        type: Cloud.Machine
        properties:
          name: mysql
          image: ubuntu-16
          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 "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
             - mysql -e "FLUSH PRIVILEGES;"
          attachedDisks: []
    WebTier 리소스
      WebTier:
        type: Cloud.Machine
        properties:
          name: wordpress
          flavor: '${input.size}'
          image: ubuntu-16
          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
             - php-mcrypt
             - mysql-client
    
            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 5 ]; 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
             - 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
             - service apache2 reload
    

예: 완성된 기본 Blueprint 코드 예시

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
  databaseDiskSize:
    type: number
    default: 4
    maximum: 10
    title: MySQL Data Disk Size
    description: Database Disk Size
resources:
  DBTier:
    type: Cloud.Machine
    properties:
      name: mysql
      image: ubuntu-16
      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 "GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mysqlpassword';"
         - mysql -e "FLUSH PRIVILEGES;"
      attachedDisks: []
  WebTier:
    type: Cloud.Machine
    properties:
      name: wordpress
      flavor: '${input.size}'
      image: ubuntu-16
      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
         - php-mcrypt
         - mysql-client

        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 5 ]; 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
         - 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
         - service apache2 reload
  WP-Network-Private:
    type: Cloud.Network
    properties:
      name: WP-Network-Private
      networkType: existing
      constraints:
        - tag: 'type:isolated-net'
        - tag: '${input.env}'

다음에 수행할 작업

구문을 검사하고 배포하여 Blueprint를 테스트합니다.