안녕하세요, 저는 요시다, 엔지니어입니다.
지난번에는 HTTP/2(OpsWorks)로의 마이그레이션에 관한 글을 썼는데, 이번에는 후속작으로 나올 예정입니다. (지난번에 읽은 이후로 시간이 좀 걸려서 죄송합니다, 땀 나눠요)
이전 글에서는 AWS OpsWorks를 이용해 Chef12 스택에서 HTTP/2로 마이그레이션하는 간단한 환경을 구축하는 방법에 대해 이야기했습니다. 하지만 실제로 Chef12 스택은 Chef11 이전의 스택과 다르며, 레시피 운영 방식도 변경되어야 합니다. 이번에는 현장에서 OpsWorks Chef12 스택의 문제를 해결하는 실용적인 부분이 될 예정입니다.
실용적인 거야
1부. OpsWorks의 Chef 12 스택에서 커뮤니티 요리책 기반 레시피를 실행하세요
Chef12 스택에서 가장 중요한 점은 레시피를 실행할 때 사용되는 커뮤니티 요리책 참조가 더 이상 자동화되지 않는다는 것입니다. 커뮤니티 요리책을 그대로 사용해 레시피를 실행하려고 하면 "커뮤니티 요리책인가요?"라는 메시지가 뜨게 됩니다. 그걸 찾을 수가 없어요!" 저는 화가 납니다.
그래서 해결책으로, 커뮤니티 요리책을 미리 담은 요리책 아카이브를 만들고 업로드한 위치를 S3에 참조하세요.
커뮤니티 요리책으로 요리책 아카이브를 만드세요
전제 조건 아카이브를 생성하려면 BerkShelf를 설치해야 합니다. 아카이브가 없다면 ChefDK를 설치하거나 BerkShelf를 Gem으로 설치하세요. ChefDK: https://downloads.chef.io/chefdk Gem: 'gem install berkshelf'
절차 1. 요리책 디렉토리로 로컬로 이동하기
'berks package' 명령어를 실행하여 아카이브를 생성하세요. 기본적으로 cookbooks-1506749951.tar.gz과 같은 타임스탬프가 있는 아카이브가 있습니다. 파일 이름을 지정하고 싶다면, 'berks package {filename}.tar.gz' 같은 명령어를 실행하세요.
아카이브를 저장할 S3 버킷 생성
3단계에서 만든 버킷에 아카이브를 업로드합니다
AWS CLI의 S3 명령어가 유용합니다. 'AWS S3 CP cookbooks.tar.gz S3 @{bucket name}'
실행 후에는 아카이브 파일이 S3에 업로드되었는지 확인하세요.

- OpsWorks 스택을 아카이브 파일을 참조하도록 구성
AWS 콘솔에서 방금 만든 아카이브 파일을 선택하고 나타나는 대화상자의 링크 URL을 복사하세요.

OpsWorksスタック設定編集ページに移動して、以下の様に設定します。 [eos]・Use custom Chef cookbooks: ON ・Repository type: S3 Archive ・Repository URL: コピーしたアーカイブファイルリンクURLを貼り付け

그게 전부예요, 커뮤니티 요리책을 사용해 레시피를 돌릴 수 있어요.
2부. 요리책 아카이브 생성 및 S3로 업로드 자동화
파트 1에서는 이제 OpsWorks에서 커뮤니티 쿡북을 사용할 수 있습니다.
하지만 요리책 아카이브를 만들고 레시피를 수정할 때마다 S3에 업로드하는 것은 너무 번거롭습니다. 또한, 현장에 요리책을 저장하는 Git 저장소가 있다면, 각 환경에 따라 마스터, 스테이지, 개발(Stage), 개발 등 분기를 생성하고, 각 분기별로 요리책 아카이브를 S3에 저장하는 것이 바람직합니다.
이 작업들은 자동화되어 있습니다.
자동화 절차
자동화를 위해 여기서는 Travis CI라는 CI 도구를 사용할 예정입니다. Travis CI가 아니더라도, Github와 연동할 수 있는 CI 도구라면 가능하다고 생각하니 꼭 시도해 보세요.
자동화의 전제로, 쿡북의 Git 저장소도 Git 흐름에 따라 분기되어 개발된다고 가정해 봅시다. 그리고 각 브랜치의 요리책(마스터, 스테이지, 개발 등)은 각 환경(스택)에서 참조되어야 합니다.
예를 들어, 마스터 브랜치는 S3에 master.tar.gz라는 요리책 아카이브를 가지고 있으며, 생산 환경의 스택에서 참조됩니다. 스테이지 브랜치라면, 검증 환경의 스택에서 stage.tar.gz이라는 요리책 아카이브가 참조되는 등,
따라서 자동화의 목표는 "소스가 지정된 브랜치에 병합될 때 자동으로 쿡북 아카이브를 생성하고 S3에 업로드하는 것"입니다.
Travis CI 구성 파일 생성 (.travis.yml)
Travis CI를 사용하려면 먼저 .travis.yml이라는 설정 파일을 만들어야 합니다. 다음 .travis.yml 파일을 요리책 저장소의 루트 디렉터리에 넣으세요. 그냥 있는 그대로 복사해서 붙여넣기만 하면 됩니다.
어떤 설정을 가지고 있는지 순서대로 설명해 드리겠습니다.
지점 명칭
첫 번째 분기~ 부분은 트래비스를 병합할 때 어떤 분기를 실행할지 지정하는 설명입니다. 여기서는 마스터, 스테이지, 개발 분기를 지정합니다. 이렇게 지정하면 추가 아카이브를 만들 필요가 없으므로 가능한 한 많이 작성하는 것이 좋습니다.
시즌 3 설정
Travis가 S3에 파일 업로드 설정을 설정할 것입니다. 공식 문서는 여기에서 확인할 수 있습니다. Travis CI에 아티팩트 업로드
업로드할 S3 버킷의 지역을 지정하세요. 버킷이 도쿄 지역에 있다면 명세를 ap-northeast-1로 변경하고, 그렇지 않으면
업로드된 쿡북 아카이브의 파일 경로를 지정하세요. 이해하기 쉽도록 파일 이름은 분기 이름을 따서 "$TRAVIS_BRANCH.tar.gz"로 합니다. *$TRAVIS_BRANCH는 Travis의 목표 분기 이름을 가리키는 변수입니다.
업로드하려는 S3 버킷의 파일 경로를 지정하세요. target_paths를 지정하지 않으면 기본적으로 꽤 깊은 계층 구조에 배치되며, 여기에는 Git 저장소 이름의 디렉터리도 포함됩니다. 버킷 바로 아래에 맞게 "./"를 지정하세요.
실행 명령 설정
마지막으로, 명령을 Travis에서 실행하도록 설정하세요. 즉, 요리책 아카이브가 생성될 때까지 이 과정을 반복하는 것입니다.
아카이브를 만들려면 위에서 말한 대로 BerkShelf를 설치해야 합니다. 먼저 Ruby를 설치한 후 BerkShelf를 젬으로 삭제하세요.
'berks 패키지'를 넣고 아카이브를 생성해 마무리하세요.
트래비스 CI 실행 저장소 설정
물론, 단순히 .travis.yml을 Git에 푸시하는 것만으로는 Travis가 실행되지 않습니다. Travis CI 관리자 화면에서 요리책 저장소에서 여러 설정을 설정해야 합니다.
먼저, 저장소 설정 화면으로 가려면 관리 화면에서 요리책 저장소를 지정하세요. 다음으로, 아래 화면과 같이 오른쪽 상단에 표시된 "더 많은 옵션" 버튼을 누르면 다양한 메뉴가 나타날 수 있으니, 상단의 "설정"을 클릭하세요.

트래비스 런 타이밍 설정
설정 화면 상단에서 이렇게 설정할 수 있습니다.
특히 Build 브랜치 업데이트를 켜고 Build 풀 요청 업데이트를 끄는 것이 중요합니다. Build 브랜치 업데이트는 대상 브랜치가 업데이트될 때 Travis가 실행되는지 여부입니다. 예를 들어, feature 브랜치에서 develop 브랜치로 풀 리퀘스트를 만들고 병합할 때 이 설정을 켜면, develop 브랜치의 쿡북 아카이브가 S3에 업로드되지 않습니다.
빌드 풀 요청 업데이트는 GitHub 풀 리퀘스트가 업데이트될 때 Travis가 실행되는지 여부를 의미합니다. 이 기능이 켜져 있다면, 풀 리퀘스트를 병합하기 전에 병합 소스 브랜치에 수정을 푸시할 때마다 Travis를 끄세요.
S3 업로드에 필요한 자격 증명을 설정하세요
마지막으로, S3 업로드에 필요한 자격 증명을 설정하세요.

세 가지가 필요합니다: ARTIFACTS_KEY=(AWS 접근 키 ID) ARTIFACTS_SECRET=(AWS 비밀 접근 키) ARTIFACTS_BUCKET=(S3 버킷 이름).
공식 문서에도 설명되어 있으니 참고해 주세요. Travis CI에 아티팩트 업로드
이제 Travis CI가 자동으로 OpsWorks 스택에서 참고할 수 있는 요리책을 만들 수 있습니다!
앞선 글 외에도, OpsWorks를 사용하는 프로젝트에서 HTTP/2로 마이그레이션하려면 이러한 단계가 필요하다는 것을 알 수 있습니다.
HTTP/2 생활 잘 하시길 바랍니다!