우리 조직에는 ECS 및 Docker와 같은 다양한 서비스를위한 여러 가지 사용하기 쉬운 기본 AMI가 있습니다. 많은 프로젝트가 CloudFormation과 관련되어 있기 때문에 우리는 cfn-bootstrap
몇 가지 스크립트와 부팅시 실행되어 특정 패키지를 설치하고 특정 구성 관리 작업을 수행하는 서비스로 구성되어 있습니다.
시스템을 시작할 때 다음과 같은 스크립트를 실행해야합니다.
#!/bin/bash
# capture stderr only
output="$(cfn-init -s $STACK_NAME -r $RESOURCE_NAME --region $REGION >/dev/null)"
# if it failed, signal to CloudFormation that it failed and include a reason
returncode=$?
if [[ $returncode == 0]]; then
cfn-signal -e $returncode -r "$output"
exit $returncode
fi
# otherwise, signal success
cfn-signal -s
나는 systemd로 이것을 실행하는 생각을 oneshot
실행 서비스 After=network.target
와 WantedBy=multi-user.target
.
유일한 문제는 AMI를 유연하게 유지하고 특정 파일이있는 경우에만이를 실행한다는 것입니다. 위의 스크립트를 EC2 사용자 데이터에 포함시키는 대신, 사용자 데이터가 필요한 변수를 정의하는 환경 파일을 정의하고 해당 환경 파일이 존재하는 경우에만 원샷 서비스를 실행하도록 할 수 있습니다.
#cloud-init
write_files:
- path: /etc/sysconfig/cloudformation
# ...
content: |
CFN_STACK_NAME="stack-name"
CFN_RESOURCE="resource-name"
CFN_REGION="region"
주어진 조건이 충족 된 경우에만 systemd가 서비스를 실행하도록하는 방법이 있습니까?
while
조건 이 아니라는 것을 주목할 가치가 있습니다. 그러나if
지정된 경로ConditionPathExists
가 서비스가 시작될 때 존재하지 않으면 나머지 서비스는 실행되지 않습니다. 즉, 경로가 존재하기를 기다리지 않습니다.