AWSUtility::CloudFormation::CommandRunner를 사용하여 CloudFormation 스택의 리소스 전후에 명령을 실행하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2021년 6월 15일

AWSUtility::CloudFormation::CommandRunner를 사용하여 AWS CloudFormation 스택의 리소스 전후에서 명령을 실행하려고 합니다.

해결 방법

참고: AWS 명령줄 인터페이스(AWS CLI) 명령을 실행할 때 오류가 발생할 경우 AWS CLI의 최신 버전을 사용하고 있는지 확인하세요.

CloudFormation 스택의 리소스 전후에서 명령을 실행하려면 CloudFormation 템플릿에서 AWSUtility::CloudFormation::CommandRunner 리소스를 정의합니다.

예를 들어 다음과 같습니다.

Resources:
    CommandRunner:
        Type: AWSUtility::CloudFormation::CommandRunner
        Properties: 
            Command: 'aws ssm get-parameter --name BucketName --region us-east-1 --query Parameter.Value --output text > /command-output.txt'
            Role: EC2-Role
            LogGroup: my-cloudwatch-log-group

중요: 아직 AWSUtility::CloudFormation::CommandRunner 리소스를 등록하지 않은 경우 다음 명령을 실행합니다. register.sh 스크립트는 awsutility-cloudformation-commandrunner.zip을 사용하여 리소스 유형을 AWS 리전에 등록합니다. 이 스크립트는 register-type AWS CLI 명령을 사용하여 AWS CLI에 구성된 기본 리전에 리소스 유형을 등록합니다. aws configure get region을 실행하여 구성된 기본 리전을 확인할 수 있습니다. register.sh 스크립트가 수행하는 작업에 대한 자세한 내용은 AWS GitHub 리포지토리의 사용자 설치 단계를 참조하세요.

git clone https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner.git

cd aws-cloudformation-resource-providers-awsutilities-commandrunner

curl -LO https://github.com/aws-cloudformation/aws-cloudformation-resource-providers-awsutilities-commandrunner/releases/latest/download/awsutility-cloudformation-commandrunner.zip

./scripts/register.sh --set-default

중요: Role 속성은 연결된 IAM 역할이 있는 AWS Identity and Access Management(IAM) 인스턴스 프로파일의 이름이어야 합니다. IAM 역할에는 Amazon Elastic Compute Cloud(Amazon EC2) 서비스(ec2.amazonaws.com)와의 신뢰 관계가 있어야 합니다. Role 속성은 명령을 실행하기 위해 AWSUtility::CloudFormation::CommandRunner 리소스가 수임합니다. 선택적 속성인 LogGroup이 지정된 경우 이 속성은 명령 실행을 통해 Amazon CloudWatch 로그 그룹에 로그를 작성합니다. 템플릿에서 AWSUtility::CloudFormation::CommandRunner 리소스를 사용하는 방법에 대한 자세한 내용은 AWS GitHub의 aws-cloudformation-resource-providers-awsutilities-commandrunner 리포지토리에 있는 README.mddocs/README.md를 참조하세요.

AWS CLI 명령에 --region 옵션을 포함해야 합니다. 그런 다음 명령 출력을 /command-output.txt라는 예약된 파일에 작성해야 합니다.

Fn::GetAtt를 사용하여 명령 출력을 참조할 수 있습니다. 예를 들어, 다음과 같습니다.

S3Bucket: 
    Type: AWS::S3::Bucket
    Properties: 
        BucketName: !GetAtt CommandRunner.Output

논리적 이름이 Instance인 리소스 뒤에서 명령을 실행하려면 AWSUtility::CloudFormation::CommandRunner 리소스 정의에서 DependsOn: Instance를 지정합니다. 예를 들어, 다음과 같습니다.

Resources:
   CommandRunner:
      DependsOn: Instance
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
         LogGroup: my-cloudwatch-log-group
         Role: EC2-Role
   Instance:
      Type: AWS::EC2::Instance
      Properties:
         Image: ami-abcd1234

리소스 앞에서 명령을 실행하려면 해당 리소스 정의에서 DependsOnAWSUtility::CloudFormation::CommandRunner 리소스의 논리적 이름으로 설정합니다. 예를 들어 다음과 같습니다.

Resources:
   CommandRunner:
      Type: AWSUtility::CloudFormation::CommandRunner
      Properties:
         Command: aws s3 ls | sed -n 1p | cut -d " " -f3 > /command-output.txt
         LogGroup: my-cloudwatch-log-group
         Role: EC2-Role
   Instance:
      DependsOn: CommandRunner
      Type: AWS::EC2::Instance
      Properties:
         Image: ami-abcd1234

참고: 앞의 예제에서 sed -n 1paws s3 ls에서 반환하는 응답의 첫 번째 줄만 출력합니다. 버킷 이름을 얻기 위해 sed -n 1p는 응답을 cut -d " " -f3에 연결합니다. 그런 다음, cut -d " " -f3은 공백으로 구분된 줄을 분할한 후 생성된 배열에서 세 번째 요소를 선택합니다.


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요하세요?