본문 바로가기

Cloud/CloudFoundry

paas-ta 사용해보기(2)

오늘은 만들어진 python 서비스에 작성한 웹(Django)을 푸시하여 서비스해보는 것을 해보려고 한다. python 설치야 알아서 하실거고 django 1.8.6. 버전을 설치한다. (튜토리얼에 이 버전을 추천하고 있다)

pip install Django==1.8.6

다음 명령어로 django project를 만들어준다.

django-admin startproject my_sampleproject

그럼 이렇게 프로젝트가 생성된 것을 확인할 수 있다. 샘플 프로젝트 디렉터리로 이동하여 애플리케이션을 생성해준다.

cd my_sampleproject
python manage.py startapp my_sampleapp

아래와 같은 구조가 됐을 것이다.

어플리케이션의 환경설정을 지정해주는 setting.py를 편집한다.

"""
Django settings for my_sampleproject project.

Generated by 'django-admin startproject' using Django 1.8.6.

For more information on this file, see
https://docs.djangoproject.com/en/1.8/topics/settings/

For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.8/ref/settings/
"""

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))


# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.8/howto/deployment/checklist/

# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'yzswc%+eo*k8vul$xw%c8ef)@8t!_c_a$n47x)lfbxqswk798n'

# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []


# Application definition

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'my_sampleapp',
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
)

ROOT_URLCONF = 'my_sampleproject.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'static/templates'), ],
    },
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [os.path.join(BASE_DIR, 'static/jinja2'), ],
    },
]

WSGI_APPLICATION = 'my_sampleproject.wsgi.application'


# Database
# https://docs.djangoproject.com/en/1.8/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Internationalization
# https://docs.djangoproject.com/en/1.8/topics/i18n/

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Seoul'

USE_I18N = True

USE_L10N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.8/howto/static-files/
STATIC_BASE_DIR = os.path.dirname(os.path.abspath(__file__))
STATICFILES_DIRS = (os.path.join(STATIC_BASE_DIR, '../static/resources'),)
STATICFILES_ROOT = 'staticfiles'
STATIC_URL = '/resources/'

 

import os
from django.core.wsgi import get_wsgi_application
from whitenoise.django import DjangoWhiteNoise

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my_sampleproject.settings")


application = DjangoWhiteNoise(get_wsgi_application())

이후 진짜 티스토리 편집기 존나 구리다 꼭 소스코드 저거 넣으면 편집 제대로 안됨 ㅅㅂ 개빡치네

화이트노이즈를 사용하기 위해서 wsgi.py를 편집해준다. 중간에 from 에러나면 라이브러리 다운로드해주면 된다. 이후 접속 정보를 넣어준다. mysql 생성 이후 알맞은 정보를 넣어주면된다.

import json
if 'VCAP_SERVICES' in os.environ:
    vcap_services = json.loads(os.environ['VCAP_SERVICES'])

    if 'Mysql-DB' in vcap_services:
        mysql_srv = vcap_services['Mysql-DB'][0]
        mysql_cred = mysql_srv['credentials']

        DATABASES = {
            'default': {
                'ENGINE': 'django.db.backends.mysql',  
                'NAME': mysql_cred['name'],  
                'USER': mysql_cred['username'],  
                'PASSWORD': mysql_cred['password'],  
                'HOST': mysql_cred['hostname'],  
                'PORT': mysql_cred['port'],  
            }, 
        }

그리고 my_sampleapp 아래에 mysql_views.py를 생성하여 커서를 생성해준다.

from django.db import connections

def make_connection():
    db_type = 'default'
    cursor = connections[db_type].cursor()
    return cursor

이제 로그인해서 배포해본다. -> cf로 접속해야하는데 나는 너무 하기 싫었다...그냥 테스트만 하고 싶다고@!@! 그래서 잔머리 써봤다...

pip install cloudfoundry-client

아 자꾸 DNS 다시 보라고 나옴..endpoint가 다른걸까? 제발 cf 설치하기싫다고

결국 vm에 cf 설치해봤는데 이렇게 나타난다.

root@master:~$ cf api --skip-ssl-validation https://api.cf.open-paas.com
Setting api endpoint to https://api.cf.open-paas.com...
Request error: Get https://api.cf.open-paas.com/v2/info: dial tcp: lookup api.cf.open-paas.com on 127.0.1.1:53: no such host
TIP: If you are behind a firewall and require an HTTP proxy, verify the https_proxy environment variable is correctly set. Else, check your network connection.

dkdh슈발 문서 따흐흑스.. endpoint 이거임

cf login -a https://api.paas-ta.org --skip-ssl-validation
API endpoint: https://api.paas-ta.org

대충 cf 깔아서 로그인 해보면 다음과 같이 나온다.

root@master:~$ cf login -a https://api.paas-ta.org --skip-ssl-validation
API endpoint: https://api.paas-ta.org

Email: 이메일치셈

Password: 
Authenticating...
OK

Select an org:
1. 조직1
2. 조직2

Org (enter to skip): 2
Targeted org 조직2

Targeted space dev



API endpoint:   https://api.paas-ta.org (API version: 3.63.0)
User:           유저명
Org:            유저명2
Space:          dev

제공하는 기능들을 살펴볼 수 있다.

root@master:~$ cf marketplace
Getting services from marketplace in org 어쩌고 / space dev as 저쩌고...
OK

service                  plans                                                   description                                                                                                                              broker
Mysql-DB                 Mysql-Plan1-10con, Mysql-Plan2-100con                   A simple mysql implementation                                                                                                            mysql-service-broker
CubridDB                 utf8, euckr                                             A simple cubrid implementation                                                                                                           cubrid-service-broker
container-service        Micro, Small, Advanced                                  For Container Service Plans, You can choose plan about CPU, Memory, disk.                                                                container-service-broker
glusterfs                glusterfs-5Mb, glusterfs-100Mb, glusterfs-1000Mb        A simple glusterfs implementation                                                                                                        glusterfs-service-broker
Mongo-DB                 default-plan                                            A simple mongo implementation                                                                                                            mongodb-service-broker
p-rabbitmq               standard                                                RabbitMQ is a robust and scalable high-performance multi-protocol messaging broker.                                                      rabbitmq-service-broker
redis                    shared-vm, dedicated-vm                                 Redis service to provide a key-value store                                                                                               redis-service-broker
p-paasta-sourcecontrol   Default                                                 A paasta source control service for application development.provision parameters : parameters {owner : {owner}, org_name : {org_name}}   scm-service-broker
delivery-pipeline-v2     delivery-pipeline-shared, delivery-pipeline-dedicated   A paasta source control service for application development.provision parameters : parameters {owner : owner}                            delivery-pipeline

TIP: Use 'cf marketplace -s SERVICE' to view descriptions of individual plans of a given service.

아 가이드 문서에는 뭐 큐브리드도 엮고 이런데 귀찮고 배포만 보려고 한거니까 배포만 해보자.

pip freeze > requirements.txt

텍스트파일로 빼준다.

그리고 mainfest.yml을 my_sampleproject 아래에 넣어준다.

applications:
- name: python-sample-app      # 애플리케이션 이름
  buildpack: python_buildpack    # 빌드팩 이름
  memory: 512M                # 애플리케이션 메모리 사이즈
  instances: 1                   # 애플리케이션 인스턴스 개수

일단 리눅스 환경으로 옮기고 여기에 와봤다.

root@master:~/Downloads/paas-ta-test/my_sampleproject$ ls
mainfest.yml  manage.py  my_sampleapp  my_sampleproject  requirements.txt

보니까 세션타임이 존재해서 너무 오랫동안 사용안하면 로그아웃된다;; 토큰이슈뜨면 재로그인하면된다.

root@master:~/Downloads/paas-ta-test/my_sampleproject$ cf create-service Mysql-DB Mysql-Plan1-10con python-mysql
Creating service instance python-mysql in org org / space dev as dev...
OK

이렇게 만들고 웹에서 살펴보자.

ㅎㅇㅎㅇ

오타) mainfest(ㅋ)가 아니고 manifest입니다. manifest.yml이 있는 위치에서 push 해주면 올라간다 (!)

root@master:~/Downloads/paas-ta-test/my_sampleproject$ cf push --no-start
Pushing from manifest to org 헉헉 / space dev as 헉헉...
Using manifest file /home/사용자/Downloads/paas-ta-test/my_sampleproject/manifest.yml
Deprecation warning: Use of 'buildpack' attribute in manifest is deprecated in favor of 'buildpacks'. Please see https://docs.cloudfoundry.org/devguide/deploy-apps/manifest-attributes.html#deprecated for alternatives and other app manifest deprecations. This feature will be removed in the future.

Getting app info...
Creating app with these attributes...
+ name:         python-sample-app
  path:         /home/사용자/Downloads/paas-ta-test/my_sampleproject
  buildpacks:
+   python_buildpack
+ instances:    1
+ memory:       512M
  routes:
+   python-sample-app.paas-ta.org

Creating app python-sample-app...
Mapping routes...
Comparing local files to remote cache...
Packaging files to upload...
Uploading files...
 6.82 KiB / 6.82 KiB [===============================================================================================================================================================================] 100.00% 1s

Waiting for API to complete processing files...

name:              python-sample-app
requested state:   stopped
routes:            python-sample-app.paas-ta.org
last uploaded:     
stack:             
buildpacks:        

type:           web
instances:      0/1
memory usage:   512M
     state   since                  cpu    memory   disk     details
#0   down    2019-10-21T10:01:59Z   0.0%   0 of 0   0 of 0  

스탑된 놈이 떠있는걸 볼 수 있다.

바인드 명령어를 통해 대충 바인드 해준다.

cf bind-service python-sample-app python-mysql

서비스 붙은거 확인할 수 있다.

cf start python-sample-app

start 명령어를 통해 시작해주고 빌드를 기다린다... 이런 로그가 뜨는데 상당히 익숙하게 느껴진다.

Staging app and tracing logs...
   Downloading python_buildpack...
   Downloaded python_buildpack
   Cell c0ac69bc-a9a9-4576-9b2d-dd121a5094a2 creating container for instance 56ca38b7-edd9-407a-a811-4e37b45aed30
   Cell c0ac69bc-a9a9-4576-9b2d-dd121a5094a2 successfully created container for instance 56ca38b7-edd9-407a-a811-4e37b45aed30
   Downloading app package...
   Downloaded app package (6.8K)
   -----> Python Buildpack version 1.6.25
   -----> Supplying Python
   -----> Installing python 2.7.15
          Download [https://buildpacks.cloudfoundry.org/dependencies/python/python-2.7.15-linux-x64-cflinuxfs2-e0dd33dd.tgz]
   -----> Installing setuptools 40.6.3
          Download [https://buildpacks.cloudfoundry.org/dependencies/setuptools/setuptools-40.6.3-any-stack-3b474dad.zip]

 도커 이미지 관리하는 거랑 비슷하게 느껴진다. 대충 이러면 시작되고 페이지 조회할 수 있다. 놀라운건 안된다....... 대충 문제가 내 환경은 파이썬3이고 쟤는 보다시피 2.7이여서 그런거같은데 ^^..각잡고 다시 해봐야겠다..cf로 접근하는건 해봤으니가..따흐흐그흐ㅡㄱ..

'Cloud > CloudFoundry' 카테고리의 다른 글

BOSH Component에 대해 정리  (0) 2019.11.14
Diego 작동원리 (How it works Diego)  (0) 2019.11.13
Cloud Foundry VS Kubernetes  (0) 2019.10.31
PaaS-TA 실행환경 아키텍처  (0) 2019.10.24
PaaS-TA 사용해보기  (0) 2019.10.17