Deploy 레시피 - AWS OpsWorks

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

Deploy 레시피

중요

이 AWS OpsWorks Stacks 서비스는 2024년 5월 26일에 수명이 종료되었으며 신규 고객과 기존 고객 모두 사용할 수 없습니다. 고객은 가능한 한 빨리 워크로드를 다른 솔루션으로 마이그레이션할 것을 강력히 권장합니다. 마이그레이션에 대해 궁금한 점이 있으면 AWS re:Post 또는 Premium AWS Support를 통해 AWS Support 팀에 문의하세요.

Deploy 레시피는 계층의 Deploy 수명 주기 이벤트에 할당됩니다. 이는 일반적으로 앱을 배포할 때마다 스택의 모든 인스턴스에서 발생하지만, 선택적으로 이벤트를 지정된 인스턴스로만 제한할 수 있습니다. AWS OpsWorks 또한 Stacks는 설치 레시피가 완료된 후 새 인스턴스에서 배포 레시피를 실행합니다. Deploy 레시피의 주된 목적은 코드와 관련 파일을 리포지토리에서 애플리케이션 서버 계층의 인스턴스에 배포하는 것입니다. 하지만 다른 계층에서도 Deploy 레시피를 실행하는 경우가 종종 있습니다. 그러면 예를 들어 해당 계층의 인스턴스가 구성을 업데이트하여 새로 개발된 앱을 수용할 수 있습니다. Deploy 레시피를 구현할 때 Deploy 이벤트가 반드시 앱이 인스턴스에 배포되는 것을 의미하지는 않음을 염두에 두어야 합니다. 단지 인스턴스가 필요한 업데이트를 할 수 있도록 스택 내 다른 인스턴스에 앱이 배포되고 있다는 알림일 수도 있습니다. 이 레시피는 적절히 대응할 수 있어야 합니다. 이는 아무 작업도 하지 않음을 의미하기도 합니다.

AWS OpsWorks 스택은 표준 앱 유형의 앱을 해당 빌트인 애플리케이션 서버 계층에 자동으로 배포합니다. 앱을 사용자 지정 계층에 배포하려면 앱의 파일을 리포지토리에서 인스턴스 내 적절한 위치로 다운로드하는 사용자 지정 Deploy 레시피를 구현해야 합니다. 하지만 내장 배포 쿡북을 사용하여 배포의 일부 측면을 처리함으로써 작성할 코드의 양을 줄일 수도 있습니다. 예를 들어 파일을 지원되는 리포지토리 중 하나에 저장할 경우 내장 쿡북이 리포지토리에서 계층의 인스턴스로 파일을 다운로드하는 세부 작업을 처리할 수 있습니다.

tomcat::deploy 레시피는 Deploy 수명 주기 이벤트에 할당됩니다.

include_recipe 'deploy' node[:deploy].each do |application, deploy| opsworks_deploy_dir do user deploy[:user] group deploy[:group] path deploy[:deploy_to] end opsworks_deploy do deploy_data deploy app application end ...

tomcat::deploy 레시피는 애플리케이션에 고유하지 않은 배포에 대해 내장 배포 쿡북을 사용합니다. deploy 레시피(내장 deploy::default 레시피의 약칭)는 deploy 속성의 데이터를 기반으로 사용자, 그룹 등을 설정하는 세부 작업을 처리하는 내장 레시피입니다.

이 레시피는 두 개의 내장 Chef 정의 opsworks_deploy_diropworks_deploy를 사용하여 애플리케이션을 설치합니다.

opsworks_deploy_dir 정의는 앱의 배포 JSON에 포함된 데이터를 기반으로 디렉터리 구조를 설정합니다. 정의는 기본적으로 리소스 정의를 패키징하는 편리한 방법으로, definitions 디렉터리에 위치합니다. 레시피는 사용자 정의를 리소스와 거의 비슷하게 사용할 수 있지만, 정의 자체에는 연결된 공급자가 없고 정의에 포함된 리소스만 있습니다. 레시피에서 변수를 정의할 수 있습니다. 그러면 해당 변수가 기본 리소스 정의로 전달됩니다. tomcat::deploy 레시피는 배포 JSON의 데이터를 기반으로 user, grouppath 변수를 설정합니다. 이들 변수는 정의의 디렉터리를 관리하는 디렉터리 리소스로 전달됩니다.

참고

배포된 앱의 사용자 및 그룹은 [:opsworks][:deploy_user][:user][:opsworks][:deploy_user][:group] 속성을 통해 결정되며, 각 속성은 내장 배포 쿡북의 deploy.rb 속성 파일에서 정의됩니다. [:opsworks][:deploy_user][:user]의 기본값은 deploy입니다. [:opsworks][:deploy_user][:group]의 기본값은 인스턴스의 운영 체제에 따라 다릅니다.

  • Ubuntu 인스턴스의 경우, 기본 그룹은 www-data입니다.

  • Nginx와 Unicorn을 사용하는 Rails 앱 서버 계층에 속하는 Amazon Linux 인스턴스의 경우, 기본 그룹은 nginx입니다.

  • 다른 모든 Amazon Linux 인스턴스의 경우, 기본 그룹은 apache입니다.

사용자 지정 JSON 또는 사용자 지정 속성 파일을 사용하여 해당 속성을 재정의하면 설정을 변경할 수 있습니다. 자세한 내용은 속성 재정의 섹션을 참조하세요.

다른 정의 opsworks_deploydeploy 속성에 포함된 데이터를 기반으로 앱의 코드와 관련 파일을 리포지토리에서 체크아웃하고 인스턴스에 배포하는 세부 작업을 처리합니다. 모든 앱 유형에서 이 정의를 사용할 수 있습니다. 디렉터리 이름과 같은 배포 세부 정보는 콘솔 또는 API를 통해 지정되며 deploy 속성에 포함됩니다. 하지만 opsworks_deploy는 Git, 하위 버전, S3 및 HTTP 등 네 개의 지원되는 리포지토리 유형에서만 사용할 수 있습니다. 다른 리포지토리 유형을 사용하려면 이 코드를 직접 구현해야 합니다.

앱의 파일은 Tomcat webapps 디렉터리에 설치합니다. 일반적인 방법은 파일을 webapps에 직접 복사하는 것입니다. 하지만 AWS OpsWorks Stacks 배포는 인스턴스에 최대 5개 버전의 앱을 유지하도록 설계되었으므로 필요한 경우 이전 버전으로 롤백할 수 있습니다. AWS OpsWorks 따라서 스택은 다음을 수행합니다.

  1. 이름에 타임스탬프가 포함된 고유 디렉터리(예: /srv/www/my_1st_jsp/releases/20130731141527)에 앱을 배포합니다.

  2. 이 고유 디렉터리에 대한 symlink를 생성하고 current로 명명합니다(예: /srv/www/my_1st_jsp/current).

  3. 이미 존재하지 않으면 webapps 디렉터리에서 2단계에서 생성된 current symlink까지의 symlink를 생성합니다.

이전 버전으로 롤백해야 할 경우 current symlink를 해당하는 타임스탬프가 있는 고유 디렉터리를 가리키도록 수정합니다(예를 들어 /srv/www/my_1st_jsp/current의 링크 대상 변경).

tomcat::deploy의 중간 부분은 symlink를 설정합니다.

... current_dir = ::File.join(deploy[:deploy_to], 'current') webapp_dir = ::File.join(node['tomcat']['webapps_base_dir'], deploy[:document_root].blank? ? application : deploy[:document_root]) # opsworks_deploy creates some stub dirs, which are not needed for typical webapps ruby_block "remove unnecessary directory entries in #{current_dir}" do block do node['tomcat']['webapps_dir_entries_to_delete'].each do |dir_entry| ::FileUtils.rm_rf(::File.join(current_dir, dir_entry), :secure => true) end end end link webapp_dir do to current_dir action :create end ...

이 레시피는 먼저 두 개의 변수 current_dirwebapp_dir을 생성하여 각각 currentwebapp 디렉터리를 표시합니다. 그런 다음 link 리소스를 사용하여 webapp_dircurrent_dir에 링크합니다. AWS OpsWorks Stacks deploy::default 레시피는 이 예제에 필요하지 않은 일부 스텁 디렉터리를 생성하므로 발췌문 중간 부분에서 해당 디렉터리를 제거합니다.

tomcat::deploy의 마지막 부분은 필요할 경우 Tomcat 서비스를 재시작합니다.

... include_recipe 'tomcat::service' execute 'trigger tomcat service restart' do command '/bin/true' not_if { node['tomcat']['auto_deploy'].to_s == 'true' } notifies :restart, resources(:service => 'tomcat') end end include_recipe 'tomcat::context'

이 레시피는 먼저 tomcat::service를 실행하여 서비스가 이 Chef 실행에 대해 정의되도록 합니다. 그런 다음 실행 리소스를 사용하여 ['tomcat']['auto_deploy']'true'로 설정된 경우에만 서비스를 재시작하라고 알립니다. 그렇지 않은 경우에는 Tomcat이 webapps 디렉터리의 변경 사항을 수신 대기합니다. 그러므로 명시적 Tomcat 서비스 재시작은 필요하지 않습니다.

참고

execute 리소스가 실제로는 아무 것도 실행하지 않습니다. /bin/true는 단지 성공 코드를 반환하는 더미 shell 스크립트입니다. 여기서는 단지 재시작 알림을 생성하는 간편한 방법으로 사용됩니다. 앞서 언급한 대로, 알림을 사용하면 서비스가 너무 빈번히 재시작되지 않습니다.

마지막으로, tomcat::deploytomcat::context를 실행합니다. 이는 백 엔드 데이터베이스가 변경된 경우 웹 앱 컨텍스트 구성 파일을 업데이트합니다.