Setup 레시피 - AWS OpsWorks

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Setup 레시피

중요

AWS OpsWorks Stacks은 더 이상 신규 고객을 받지 않습니다. 기존 고객은 2024년 5월 26일까지 OpsWorks 콘솔, API, CLI 및 CloudFormation 리소스를 정상적으로 사용할 수 있으며, 이때 사용이 중단됩니다. 이러한 전환에 대비하려면 가능한 한 빨리 스택을 AWS Systems Manager으로 전환하는 것이 좋습니다. 자세한 정보는 AWS OpsWorks Stacks 수명 종료 관련 자주 묻는 질문AWS Systems Manager 애플리케이션 관리자로 AWS OpsWorks Stacks 애플리케이션 마이그레이션 섹션을 참조하십시오.

Setup 레시피는 계층의 Setup 수명 주기 이벤트에 할당되고 인스턴스 부팅 후 실행됩니다. 이 레시피는 패키지 설치, 구성 파일 생성, 서비스 시작과 같은 작업을 수행합니다. Setup 레시피가 실행을 마치면 AWS OpsWorks Stacks가 Deploy 레시피를 실행하여 모든 앱을 새 인스턴스에 배포합니다.

tomcat::setup

tomcat::setup 레시피는 계층의 Setup 수명 주기 이벤트에 할당됩니다.

include_recipe 'tomcat::install' include_recipe 'tomcat::service' service 'tomcat' do action :enable end # for EBS-backed instances we rely on autofs bash '(re-)start autofs earlier' do user 'root' code <<-EOC service autofs restart EOC notifies :restart, resources(:service => 'tomcat') end include_recipe 'tomcat::container_config' include_recipe 'apache2' include_recipe 'tomcat::apache_tomcat_bind'

tomcat::setup 레시피는 대체로 메타 레시피입니다. Tomcat 및 관련 패키지를 설치하고 구성하는 세부 작업을 대부분 처리하는 일련의 종속 레시피가 포함됩니다. tomcat::setup의 첫 번째 부분은 다음 레시피를 실행합니다(각 레시피에 대해서는 나중에 설명).

tomcat::setup의 중간 부분은 Tomcat 서비스를 활성화하고 시작합니다.

  • Chef 서비스 리소스는 부팅 시 Tomcat 서비스를 활성화합니다.

  • Chef bash 리소스는 Bash 스크립트를 실행하여 Amazon EBS 지원 인스턴스에 필요한 autofs 대몬(daemon)을 시작합니다. 그런 다음 이 리소스는 service 리소스에 Tomcat 서비스를 재시작하라고 알립니다.

    자세한 정보는 autofs(Amazon Linux) 또는 Autofs(Ubuntu)를 참조하십시오.

tomcat::setup의 마지막 부분은 구성 파일을 생성하고 프런트 엔드 Apache 서버를 설치하고 구성합니다.

  • tomcat::container_config 레시피는 구성 파일을 생성합니다.

  • apache2 레시피(apache2::default의 약칭)는 Apache 서버를 설치하고 구성하는 AWS OpsWorks Stacks 내장 레시피입니다.

  • tomcat::apache_tomcat_bind 레시피는 Apache 서버가 Tomcat 서버의 프런트 엔드로 기능하도록 구성합니다.

참고

내장 레시피를 사용하여 일부 필요한 작업을 수행하면 시간과 노력을 아낄 수 있는 경우가 자주 있습니다. 이 레시피는 처음부터 Apache를 구현하는 것이 아니라 내장 apache2::default 레시피를 사용하여 Apache를 설치합니다. 내장 레시피를 사용하는 방법의 또 하나의 예는 Deploy 레시피 단원을 참조하십시오.

다음 섹션에서는 Tomcat 쿡북의 Setup 레시피에 대해 보다 자세히 설명합니다. apache2 레시피에 대한 자세한 정보는 opsworks-cookbooks/apache2를 참조하십시오.

tomcat::install

tomcat::install 레시피는 Tomcat 서버, OpenJDK, 그리고 MySQL 서버 연결을 처리하는 Java 커넥터 라이브러리를 설치합니다.

tomcat_pkgs = value_for_platform( ['debian', 'ubuntu'] => { 'default' => ["tomcat#{node['tomcat']['base_version']}", 'libtcnative-1', 'libmysql-java'] }, ['centos', 'redhat', 'fedora', 'amazon'] => { 'default' => ["tomcat#{node['tomcat']['base_version']}", 'tomcat-native', 'mysql-connector-java'] }, 'default' => ["tomcat#{node['tomcat']['base_version']}"] ) tomcat_pkgs.each do |pkg| package pkg do action :install end end link ::File.join(node['tomcat']['lib_dir'], node['tomcat']['mysql_connector_jar']) do to ::File.join(node['tomcat']['java_dir'], node['tomcat']['mysql_connector_jar']) action :create end # remove the ROOT webapp, if it got installed by default include_recipe 'tomcat::remove_root_webapp'

이 레시피가 수행하는 작업은 다음과 같습니다.

  1. 인스턴스의 운영 체제에 따라 설치할 패키지의 목록을 생성합니다.

  2. 목록의 각 패키지를 설치합니다.

    Chef 패키지 리소스는 Amazon Linux의 경우 yum와 Ubuntu의 경우 apt-get인 적절한 공급자를 사용하여 설치를 처리합니다. 패키지 공급자가 OpenJDK를 Tomcat 종속성으로 설치하지만, MySQL 커넥터 라이브러리는 명시적으로 설치되어야 합니다.

  3. Chef 링크 리소스를 사용하여 Tomcat 서버의 라이브러리 디렉터리에서 JDK 내 MySQL 커넥터 라이브러리에 대한 symlink를 생성합니다.

    기본 속성 값을 사용할 경우 Tomcat 라이브러리 디렉터리는 /usr/share/tomcat6/lib이고, MySQL 커넥터 라이브러리(mysql-connector-java.jar)는 /usr/share/java/에 위치합니다.

tomcat::remove_root_webapp 레시피는 ROOT 웹 애플리케이션(기본적으로 /var/lib/tomcat6/webapps/ROOT)을 제거하여 일부 보안 문제를 방지합니다.

ruby_block 'remove the ROOT webapp' do block do ::FileUtils.rm_rf(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT'), :secure => true) end only_if { ::File.exists?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) && !::File.symlink?(::File.join(node['tomcat']['webapps_base_dir'], 'ROOT')) } end

only_if 문은 파일이 존재하는 경우에만 레시피가 파일을 제거하도록 합니다.

참고

Tomcat 버전은 ['tomcat']['base_version'] 속성에 의해 지정되는데, 속성 파일에서 6으로 설정되어 있습니다. Tomcat 7을 설치하려면 사용자 지정 JSON 속성을 사용하여 속성을 재정의할 수 있습니다. 스택 설정을 편집하고 다음 JSON을 [Custom Chef JSON] 상자에 입력하거나 기존의 사용자 지정 JSON에 추가하면 됩니다.

{ 'tomcat' : { 'base_version' : 7 } }

사용자 지정 JSON 속성은 기본 속성을 재정의하고 Tomcat 버전을 7로 설정합니다. 속성 재정의에 대한 자세한 정보는 속성 재정의 단원을 참조하십시오.

tomcat::service

tomcat::service 레시피는 Tomcat 서비스 정의를 생성합니다.

service 'tomcat' do service_name "tomcat#{node['tomcat']['base_version']}" case node[:platform] when 'centos', 'redhat', 'fedora', 'amazon' supports :restart => true, :reload => true, :status => true when 'debian', 'ubuntu' supports :restart => true, :reload => false, :status => true end action :nothing end

이 레시피는 Chef 서비스 리소스를 사용하여 Tomcat 서비스 이름(기본적으로 tomcat6)을 지정하고 supports 속성을 설정하여 Chef가 운영 체제별로 서비스의 restart, reload 및 status 명령을 관리하는 방법을 정의합니다.

  • true는 Chef가 init 스크립트 또는 그 밖의 서비스 공급자를 사용하여 명령을 실행할 수 있음을 나타냅니다.

  • false는 Chef가 다른 수단을 사용하여 명령을 실행하려 시도해야 함을 나타냅니다.

action:nothing로 설정됩니다. 각 수명 주기 이벤트에서 AWS OpsWorks Stacks는 Chef 실행을 시작하여 적절한 레시피 세트를 실행합니다. Tomcat 쿡북은 레시피가 서비스 정의를 생성하지만 서비스를 재시작하지는 않는 일반 패턴을 따릅니다. Chef 실행의 다른 레시피가 일반적으로 구성 파일을 생성하는 데 사용된 notifies 리소스에 template 명령을 포함시켜 재시작을 처리합니다. 알림은 서비스를 재시작하는 편리한 방법입니다. 구성이 변경된 경우에만 서비스를 재시작하기 때문입니다. 또한 Chef 실행에 특정 서비스에 대한 재시작 알림이 여러 개일 경우 Chef는 서비스를 한 번만 재시작합니다. 이 방법은 완전히 작동하지 않는 서비스를 재시작하려고 시도할 때 발생할 수 있는 문제를 방지하기 위한 것으로, 이 문제는 Tomcat 오류의 일반적인 원인입니다.

Tomcat 서비스는 재시작 알림을 사용하는 모든 Chef 실행에 대해 정의되어야 합니다. tomcat::service는 여러 레시피에 포함되어 서비스가 모든 Chef 실행에 대해 정의되도록 합니다. Chef 실행에 tomcat::service 인스턴스가 여러 번 포함되더라도 Chef는 포함 횟수와 상관없이 Chef 실행당 한 번만 레시피를 실행하므로 페널티는 없습니다.

tomcat::container_config

tomcat::container_config 레시피는 쿡북 템플릿 파일에서 구성 파일을 생성합니다.

include_recipe 'tomcat::service' template 'tomcat environment configuration' do path ::File.join(node['tomcat']['system_env_dir'], "tomcat#{node['tomcat']['base_version']}") source 'tomcat_env_config.erb' owner 'root' group 'root' mode 0644 backup false notifies :restart, resources(:service => 'tomcat') end template 'tomcat server configuration' do path ::File.join(node['tomcat']['catalina_base_dir'], 'server.xml') source 'server.xml.erb' owner 'root' group 'root' mode 0644 backup false notifies :restart, resources(:service => 'tomcat') end

이 레시피는 먼저 tomcat::service를 호출합니다. 필요할 경우 이 레시피가 서비스를 정의합니다. 레시피의 대부분은 2개의 템플릿 리소스로 구성되는데, 각각 쿡북의 템플릿 파일 중 하나에서 구성 파일을 생성하고, 파일 속성을 설정하고, Chef에 서비스를 재시작하라고 알립니다.

Tomcat 환경 구성 파일

첫 번째 template 리소스는 tomcat_env_config.erb 템플릿 파일을 사용하여 Tomcat 환경 구성 파일을 생성합니다. 이 파일은 JAVA_HOME과 같은 환경 변수를 설정하는 데 사용됩니다. 기본 파일 이름은 template 리소스의 인수입니다. tomcat::container_configpath 속성을 사용하여 기본값을 재정의하고 구성 파일을 /etc/sysconfig/tomcat6(Amazon Linux) 또는 /etc/default/tomcat6 (Ubuntu)로 명명합니다. 또한 template 리소스는 파일의 소유자, 그룹 및 모드 설정을 지정하고 Chef에게 백업 파일을 생성하지 않도록 지시합니다.

소스 코드를 보면 실제로 세 버전의 tomcat_env_config.erb가 각각 templates 디렉터리의 서로 다른 하위 디렉터리에 위치합니다. ubuntuamazon 디렉터리에는 해당 운영 체제용 템플릿이 들어 있습니다. default 폴더에는 명령줄 하나로 구성된 더미 템플릿이 들어 있습니다. 이 템플릿은 지원되지 않는 운영 체제를 사용하는 인스턴스에서 이 레시피를 실행하려고 시도할 경우에만 사용됩니다. tomcat::container_config 레시피는 사용할 tomcat_env_config.erb를 지정할 필요가 없습니다. Chef가 File Specificity에 기술된 규칙에 따라 인스턴스의 운영 체제에 적합한 디렉터리를 선택합니다.

이 예제의 tomcat_env_config.erb 파일은 대부분 주석으로 구성되어 있습니다. 추가 환경 변수를 설정하려면 해당 줄의 주석 처리를 해제하고 원하는 값을 제공하면 됩니다.

참고

변경될 수 있는 구성 설정은 템플릿에서 하드코딩하는 것보다는 속성으로 정의해야 합니다. 그러면 설정을 변경하기 위해 템플릿을 재작성할 필요 없이 속성을 재정의하기만 하면 됩니다.

Amazon Linux 템플릿은 다음 코드에 나와 있듯이 하나의 환경 변수만 설정합니다.

... # Use JAVA_OPTS to set java.library.path for libtcnative.so #JAVA_OPTS="-Djava.library.path=/usr/lib" JAVA_OPTS="${JAVA_OPTS} <%= node['tomcat']['java_opts'] %>" # What user should run tomcat #TOMCAT_USER="tomcat" ...

JAVA_OPTS를 사용하여 라이브러리 경로와 같은 Java 옵션을 지정할 수 있습니다. 기본 속성 값을 사용할 경우 템플릿은 Amazon Linux에 대해 어떤 Java 옵션도 설정하지 않습니다. ['tomcat']['java_opts'] 속성을 재정의하여(예를 들어 사용자 지정 JSON 속성을 사용하여) 자체 Java 옵션을 설정할 수 있습니다. 예시는 stack을 만듭니다 섹션을 참조하세요.

Ubuntu 템플릿은 다음 템플릿 코드에 나와 있듯이 여러 환경 변수를 설정합니다.

# Run Tomcat as this user ID. Not setting this or leaving it blank will use the # default of tomcat<%= node['tomcat']['base_version'] %>. TOMCAT<%= node['tomcat']['base_version'] %>_USER=tomcat<%= node['tomcat']['base_version'] %> ... # Run Tomcat as this group ID. Not setting this or leaving it blank will use # the default of tomcat<%= node['tomcat']['base_version'] %>. TOMCAT<%= node['tomcat']['base_version'] %>_GROUP=tomcat<%= node['tomcat']['base_version'] %> ... JAVA_OPTS="<%= node['tomcat']['java_opts'] %>" <% if node['tomcat']['base_version'].to_i < 7 -%> # Unset LC_ALL to prevent user environment executing the init script from # influencing servlet behavior. See Debian bug #645221 unset LC_ALL <% end -%>

기본 속성 값을 사용하면 템플릿은 다음과 같이 Ubuntu 환경 변수를 설정합니다.

  • TOMCAT6_USERTOMCAT6_GROUP(Tomcat 사용자 및 그룹을 표시)이 모두 tomcat6으로 설정됩니다.

    ['tomcat']['base_version']을 tomcat7로 설정할 경우 변수 이름이 TOMCAT7_USERTOMCAT7_GROUP로 확인되고, 모두 tomcat7로 설정됩니다.

  • JAVA_OPTS-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC로 설정됩니다.

    • -Djava.awt.headlesstrue로 설정하면 그래픽 엔진에게 인스턴스가 헤드리스이고 콘솔이 없음을 알려줍니다. 이는 일부 그래픽 애플리케이션의 동작 오류를 해결합니다.

    • -Xmx128m은 JVM이 적절한 메모리 리소스를 사용하도록 지정합니다(이 예제에서는 128MB).

    • -XX:+UseConcMarkSweepGC는 동시 마크 스윕 가비지 수집을 지정합니다. 이는 가비지 수집으로 유발되는 일시 중지를 제한하는 데 도움이 됩니다.

      자세한 정보는 Concurrent Mark Sweep Collector Enhancements를 참조하십시오.

  • Tomcat 버전이 7 미만일 경우 템플릿이 LC_ALL을 설정 해제합니다. 이는 Ubuntu 버그를 해결합니다.

참고

기본 속성을 사용할 경우 이러한 환경 변수 중 일부가 기본값으로 설정됩니다. 하지만 명시적으로 환경 변수를 속성으로 설정하면 사용자 지정 JSON 속성을 정의하여 기본 속성을 재정의하고 사용자 지정 값을 제공할 수 있습니다. 속성 재정의에 대한 자세한 정보는 속성 재정의 단원을 참조하십시오.

전체 템플릿 파일은 source code를 참조하십시오.

Server.xml 구성 파일

두 번째 template 리소스는 server.xml.erb를 사용하여 서블릿/JSP 컨테이너를 구성하는 system.xml 구성 파일을 생성합니다. server.xml.erb에는 운영 체제별 설정이 없으므로 template 디렉터리의 default 하위 디렉터리에 위치합니다.

템플릿은 표준 설정을 사용하지만 Tomcat 6 또는 Tomcat 7에 대해 system.xml 파일을 생성할 수 있습니다. 예를 들어 템플릿의 서버 섹션에서 발췌된 다음 코드는 리스너를 지정된 버전에 따라 적절하게 구성합니다.

<% if node['tomcat']['base_version'].to_i > 6 -%> <!-- Security listener. Documentation at /docs/config/listeners.html <Listener className="org.apache.catalina.security.SecurityListener" /> --> <% end -%> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <% if node['tomcat']['base_version'].to_i < 7 -%> <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html --> <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" /> <% end -%> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <% if node['tomcat']['base_version'].to_i > 6 -%> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <% end -%>

템플릿은 하드코딩된 설정 대신 속성을 사용합니다. 따라서 사용자 지정 JSON 속성을 정의하여 간편하게 설정을 변경할 수 있습니다. 예:

<Connector port="<%= node['tomcat']['port'] %>" protocol="HTTP/1.1" connectionTimeout="20000" URIEncoding="<%= node['tomcat']['uri_encoding'] %>" redirectPort="<%= node['tomcat']['secure_port'] %>" />

자세한 정보는 source code를 참조하십시오.

tomcat::apache_tomcat_bind

tomcat::apache_tomcat_bind 레시피는 Apache 서버가 Tomcat의 프런트 엔드로 동작하여 수신 요청을 수신하고, 요청을 Tomcat으로 전달하고, 응답을 클라이언트로 반환하도록 설정합니다. 이 예제에서는 mod_proxy를 Apache 프록시/게이트웨이로 사용합니다.

execute 'enable mod_proxy for apache-tomcat binding' do command '/usr/sbin/a2enmod proxy' not_if do ::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', 'proxy.load')) || node['tomcat']['apache_tomcat_bind_mod'] !~ /\Aproxy/ end end execute 'enable module for apache-tomcat binding' do command "/usr/sbin/a2enmod #{node['tomcat']['apache_tomcat_bind_mod']}" not_if {::File.symlink?(::File.join(node['apache']['dir'], 'mods-enabled', "#{node['tomcat']['apache_tomcat_bind_mod']}.load"))} end include_recipe 'apache2::service' template 'tomcat thru apache binding' do path ::File.join(node['apache']['dir'], 'conf.d', node['tomcat']['apache_tomcat_bind_config']) source 'apache_tomcat_bind.conf.erb' owner 'root' group 'root' mode 0644 backup false notifies :restart, resources(:service => 'apache2') end

mod_proxy를 활성화하려면 proxy 모듈과 프로토콜 기반 모듈을 활성화해야 합니다. 프로토콜 모듈에는 두 가지 옵션을 사용할 수 있습니다.

레시피의 두 실행 리소스가 모두 a2enmod 명령을 실행합니다. 따라서 필요한 symlink를 생성하여 지정된 모듈을 활성화할 수 있습니다.

  • 첫 번째 execute 리소스는 proxy 모듈을 활성화합니다.

  • 두 번째 execute 리소스는 프로토콜 모듈을 활성화합니다. 이 모듈은 기본적으로 proxy_http로 설정됩니다.

    AJP를 사용할 경우 사용자 지정 JSON을 정의하여 apache_tomcat_bind_mod 속성을 재정의하고 proxy_ajp로 설정할 수 있습니다.

apache2::service 레시피는 Apache 서비스를 정의하는 AWS OpsWorks Stacks 내장 레시피입니다. 자세한 내용은 Stacks 리포지토리의 AWS OpsWorks레시피를 참조하십시오. GitHub

template 리소스는 apache_tomcat_bind.conf.erb를 사용하여 구성 파일을 생성하며, 이 파일의 기본 이름은 tomcat_bind.conf입니다. 그리고 리소스는 이 구성 파일을 ['apache']['dir']/.conf.d 디렉터리에 저장합니다. ['apache']['dir'] 속성은 내장된 apache2 속성 파일에 정의되어 있으며, 기본적으로 /etc/httpd(Amazon Linux) 또는 /etc/apache2(Ubuntu)로 설정됩니다. template 리소스가 구성 파일을 생성하거나 변경할 경우 notifies 명령이 Apache 서비스 재시작을 예약합니다.

<% if node['tomcat']['apache_tomcat_bind_mod'] == 'proxy_ajp' -%> ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/ ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> ajp://localhost:<%= node['tomcat']['ajp_port'] %>/ <% else %> ProxyPass <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/ ProxyPassReverse <%= node['tomcat']['apache_tomcat_bind_path'] %> http://localhost:<%= node['tomcat']['port'] %>/ <% end -%>

템플릿은 ProxyPassProxyPassReverse지시문을 사용하여 Apache와 Tomcat 간에 트래픽을 전달하는 데 사용되는 포트를 구성합니다. 두 서버는 동일한 인스턴스에서 실행되므로 localhost URL을 사용할 수 있으며 모두 기본적으로 http://localhost:8080으로 설정됩니다.