AWS Step Functions에서 AWS Systems Manager 자동화 작업을 동기적으로 실행 - AWS 권장 가이드

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

AWS Step Functions에서 AWS Systems Manager 자동화 작업을 동기적으로 실행

작성자: Elie El khoury(AWS)

코드 리포지토리: amazon-stepfunctions-ssm-waitfortasktoken

환경: 프로덕션

기술: 서버리스 DevOps, 최종 사용자 컴퓨팅, 운영

AWS 서비스: AWS Step Functions, AWS Systems Manager

요약

이 패턴은 AWS Step Functions 과 통합하는 방법을 설명합니다 AWS Systems Manager. AWS SDK 서비스 통합을 사용하여 상태 머신 워크플로의 작업 토큰으로 Systems Manager startAutomationExecutionAPI를 호출하고 성공 또는 실패 호출과 함께 토큰이 반환될 때까지 일시 중지됩니다. 통합을 보여주기 위해 이 패턴은 AWS-RunShellScript or 문서 주변에 자동화 문서 (런북) 래퍼를 구현하고 이를 사용하여 동기적으로 or를 AWS-RunPowerShellScript 호출합니다. .waitForTaskToken AWS-RunShellScript AWS-RunPowerShellScript Step AWS Functions의 SDK 서비스 통합에 대한 자세한 내용은 AWS Step Functions 개발자 안내서를 참조하십시오.

Step Functions는 서비스를 사용하여 AWS 분산 애플리케이션을 구축하고, IT 및 비즈니스 프로세스를 자동화하고, 데이터 및 기계 학습 파이프라인을 구축하는 데 사용할 수 있는 코드가 적은 시각적 워크플로 서비스입니다. 워크플로는 장애, 재시도, 병렬화, 서비스 통합 및 관찰성을 관리하므로 더 중요한 비즈니스 로직에 집중할 수 있습니다.

자동화는 아마존 Elastic Compute Cloud (Amazon EC2), 아마존 관계형 데이터베이스 서비스 (Amazon RDS), 아마존 Redshift, 아마존 심플 스토리지 서비스 (Amazon S3) 와 AWS 서비스 같은 일반적인 유지 관리, 배포 및 수정 작업을 간소화합니다. AWS Systems Manager Automation을 사용하면 자동화의 동시성을 세부적으로 제어할 수 있습니다. 예를 들어 동시에 대상으로 지정할 리소스 수와 자동화가 중지되기 전에 발생할 수 있는 오류 수를 지정할 수 있습니다.

런북 단계, 파라미터 및 예제를 포함한 구현 세부 정보는 추가 정보 섹션을 참조하십시오.

사전 조건 및 제한 사항

사전 조건 

  • 활성 계정 AWS

  • AWS Identity and Access Management Step Functions 및 Systems Manager에 액세스할 수 있는 (IAM) 권한

  • 인스턴스에 Systems Manager 에이전트 (SSM 에이전트) 가 설치된 EC2 인스턴스

  • 런북을 실행하려는 인스턴스에 연결된 Systems Manager용 IAM 인스턴스 프로파일

  • 다음과 같은 IAM 권한 (최소 권한 원칙을 따름) 을 가진 Step Functions 역할:

{ "Effect": "Allow", "Action": "ssm:StartAutomationExecution", "Resource": "*" }

제품 버전

  • SSM 문서 스키마 버전 0.3 이상

  • SSM Agent 버전 2.3.672.0 이상

아키텍처

대상 기술 스택

  • AWS Step Functions

  • AWS Systems Manager 자동화

대상 아키텍처 

Step Functions에서 Systems Manager 자동화 작업을 동기적으로 실행하기 위한 아키텍처

자동화 및 규모 조정

  • 이 패턴은 여러 인스턴스에 Runbook을 배포하는 데 사용할 수 있는 AWS CloudFormation 템플릿을 제공합니다. (Step GitHub Functions 및 Systems Manager 구현 리포지토리를 참조하십시오.)

도구

AWS 서비스

  • AWS CloudFormation AWS 리소스를 설정하고, 빠르고 일관되게 프로비저닝하고, 라이프사이클 AWS 계정 전반과 지역에 걸쳐 리소스를 관리할 수 있도록 도와줍니다.

  • AWS Identity and Access Management (IAM) 을 사용하면 리소스 인증 및 사용 권한을 부여받은 사용자를 제어하여 AWS 리소스에 대한 액세스를 안전하게 관리할 수 있습니다.

  • AWS Step Functions AWS Lambda 기능 및 기타 AWS 서비스 기능을 결합하여 비즈니스에 중요한 애플리케이션을 구축하는 데 도움이 되는 서버리스 오케스트레이션 서비스입니다.

  • AWS Systems Manager은 AWS 클라우드에서 실행되는 애플리케이션 및 인프라를 관리하는 데 도움을 줍니다. 애플리케이션 및 리소스 관리를 간소화하고, 운영 문제를 감지하고 해결하는 시간을 단축하며, 리소스를 대규모로 안전하게 관리할 수 있도록 지원합니다. AWS

code

이 패턴의 코드는 Step GitHub Functions 및 Systems Manager 구현 리포지토리에서 사용할 수 있습니다. 

에픽

작업설명필요한 기술

CloudFormation 템플릿을 다운로드하십시오.

GitHub 리포지토리 cloudformation  폴더에서 ssm-automation-documents.cfn.json 템플릿을 다운로드합니다.

AWS DevOps

런북을 생성하십시오.

에 로그인하여 AWS Management ConsoleAWS CloudFormation 콘솔을 열고 템플릿을 배포합니다. CloudFormation 템플릿 배포에 대한 자세한 내용은 CloudFormation 설명서의 AWS CloudFormation 콘솔에서 스택 만들기를 참조하십시오. 

CloudFormation 템플릿은 세 가지 리소스를 배포합니다.

  • SfnRunCommandByInstanceIds— 인스턴스 ID를 AWS-RunShellScript 실행하거나 AWS-RunPowerShellScript 사용할 수 있는 런북.

  • SfnRunCommandByTargets— 대상을 AWS-RunShellScript 실행하거나 AWS-RunPowerShellScript 사용하여 실행할 수 있는 런북.

  • SSMSyncRole— 런북이 맡는 IAM 역할.

AWS DevOps
작업설명필요한 기술

테스트 상태 머신을 생성하십시오.

AWS Step Functions 개발자 안내서의 지침에 따라 스테이트 머신을 생성하고 실행하십시오. 정의를 위해 다음 코드를 사용하세요. 계정에 있는 유효한 Systems Manager 활성화 인스턴스의 ID로 InstanceIds 값을 업데이트해야 합니다.

{ "Comment": "A description of my state machine", "StartAt": "StartAutomationWaitForCallBack", "States": { "StartAutomationWaitForCallBack": { "Type": "Task", "Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution.waitForTaskToken", "Parameters": { "DocumentName": "SfnRunCommandByInstanceIds", "Parameters": { "InstanceIds": [ "i-1234567890abcdef0" ], "taskToken.$": "States.Array($$.Task.Token)", "workingDirectory": [ "/home/ssm-user/" ], "Commands": [ "echo \"This is a test running automation waitForTaskToken\" >> automation.log", "sleep 100" ], "executionTimeout": [ "10800" ], "deliveryTimeout": [ "30" ], "shell": [ "Shell" ] } }, "End": true } } }

이 코드는 런북을 직접 호출하여 Systems Manager Automation에 대한 waitForTaskToken 직접 호출을 보여주는 두 개의 명령을 실행합니다.

shell매개변수 값 (Shell또는PowerShell) 에 따라 자동화 문서의 실행 AWS-RunShellScript 여부가 결정됩니다AWS-RunPowerShellScript.

작업은 /home/ssm-user/automation.log 파일에 “이것은 테스트 실행 자동화 waitForTask 토큰입니다”라고 쓴 후 100초 동안 휴면 상태가 된 후 작업 토큰으로 응답하여 워크플로의 다음 작업을 릴리스합니다.

대신 SfnRunCommandByTargets 런북을 직접 호출하려면 이전 코드의 Parameters 섹션을 다음과 같이 바꾸십시오.

"Parameters": { "Targets": [ { "Key": "InstanceIds", "Values": [ "i-02573cafcfEXAMPLE", "i-0471e04240EXAMPLE" ] } ],
AWS DevOps

상태 머신의 IAM 역할을 업데이트합니다.

이전 단계에서는 상태 머신을 위한 전용 IAM 역할을 자동으로 생성합니다. 하지만 런북 직접 호출 권한은 부여하지 않습니다. 다음 권한을 추가하여 역할을 업데이트합니다.

{ "Effect": "Allow", "Action": "ssm:StartAutomationExecution", "Resource": "*" }
AWS DevOps

동기 직접 호출을 검증합니다.

상태 머신을 실행하여 Step Functions와 Systems Manager Automation 간의 동기 직접 호출을 검증합니다. 

샘플 출력은 추가 정보 섹션을 참조하십시오. 

AWS DevOps

관련 리소스

추가 정보

구현 세부 정보

이 패턴은 두 개의 Systems Manager 런북을 배포하는 CloudFormation 템플릿을 제공합니다.

  • SfnRunCommandByInstanceIds인스턴스 ID를 사용하여 AWS-RunShellScript or AWS-RunPowerShellScript 명령을 실행합니다.

  • SfnRunCommandByTargets대상을 사용하여 AWS-RunShellScript or AWS-RunPowerShellScript 명령을 실행합니다.

각 런북은 Step Functions의 .waitForTaskToken 옵션을 사용할 때 동기 호출을 달성하기 위한 네 단계를 구현합니다.

단계

작업

설명

1

Branch

shell매개 변수 값 (Shell또는PowerShell) 을 검사하여 AWS-RunShellScript Linux용으로 실행할지 Windows용으로 실행할지 결정합니다. AWS-RunPowerShellScript

2

RunCommand_Shell 또는 RunCommand_PowerShell

여러 입력을 받아 RunShellScript or RunPowerShellScript 명령을 실행합니다. 자세한 내용은 Systems Manager 콘솔에서 RunCommand_Shell 또는 RunCommand_PowerShell 자동화 문서의 세부 정보 탭을 확인하십시오.

3

SendTaskFailure

2단계가 중단되거나 취소될 때 실행됩니다. Step Functions send_task_failure API를 직접 호출하며, 이 API는 상태 머신이 전달한 토큰, 실패 오류, 실패 원인에 대한 설명이라는 세 가지 파라미터를 입력으로 받아들입니다.

4

SendTaskSuccess

2단계가 성공하면 실행됩니다. 상태 머신이 전달한 토큰을 입력으로 받아들이는 Step Functions send_task_success API를 직접 호출합니다.

런북 파라미터

SfnRunCommandByInstanceIds런북:

파라미터 이름

Type

선택 또는 필수

설명

shell

String

필수

AWS-RunShellScriptLinux용으로 실행할지 AWS-RunPowerShellScript Windows용으로 실행할지 여부를 결정하는 데 사용되는 인스턴스 셸입니다.

deliveryTimeout

Integer

선택 사항

명령이 인스턴스의 SSM 에이전트에 전달될 때까지 기다리는 시간 (초) 입니다. 이 파라미터의 최소값은 30 (0.5분) 이고 최대값은 2592000 (720시간) 입니다.

executionTimeout

String

선택 사항

명령이 실패로 간주되기 전에 완료해야 할 시간(초). 기본값은 3600 (1시간) 입니다. 최댓값은 172,800(48시간)입니다.

workingDirectory

String

선택 사항

인스턴스 상의 작업 디렉터리에 대한 경로.

Commands

StringList

필수

실행할 쉘 스크립트 또는 명령.

InstanceIds

StringList

필수

명령을 실행하려고 하는 인스턴스의 ID.

taskToken

String

필수

콜백 응답에 사용할 작업 토토큰.

SfnRunCommandByTargets런북:

이름

Type

선택 또는 필수

설명

shell

String

필수

AWS-RunShellScriptLinux용으로 실행할지 AWS-RunPowerShellScript Windows용으로 실행할지 여부를 결정하는 데 사용되는 인스턴스 셸입니다.

deliveryTimeout

Integer

선택 사항

명령이 인스턴스의 SSM 에이전트에 전달될 때까지 기다리는 시간 (초) 입니다. 이 파라미터의 최소값은 30 (0.5분) 이고 최대값은 2592000 (720시간) 입니다.

executionTimeout

Integer

선택 사항

명령이 실패로 간주되기 전에 완료해야 할 시간(초). 기본값은 3600 (1시간) 입니다. 최댓값은 172,800(48시간)입니다.

workingDirectory

String

선택 사항

인스턴스 상의 작업 디렉터리에 대한 경로.

Commands

StringList

필수

실행할 쉘 스크립트 또는 명령.

Targets

MapList

필수

지정한 키,값 쌍을 사용하여 인스턴스를 식별하는 검색 기준 배열. 예: [{"Key":"InstanceIds","Values":["i-02573cafcfEXAMPLE","i-0471e04240EXAMPLE"]}]

taskToken

String

필수

콜백 응답에 사용할 작업 토토큰.

샘플 출력

다음 테이블에는 step 함수의 샘플 출력이 나와 있습니다. 이는 5단계(TaskSubmitted)와 6단계(TaskSucceeded) 사이의 총 실행 시간이 100초 이상임을 보여줍니다. 이는 step 함수가 워크플로의 다음 작업으로 이동하기 전에 sleep 100 명령이 완료될 때까지 기다렸음을 보여줍니다.

ID

Type

단계

리소스

경과 시간(밀리 초)

타임스탬프

1

ExecutionStarted

-

0

2022년 3월 11일 오후 02:50:34. 303

2

TaskStateEntered

StartAutomationWaitForCallBack

-

40

2022년 3월 11일 오후 02:50:34. 343

3

TaskScheduled

StartAutomationWaitForCallBack

-

40

2022년 3월 11일 오후 02:50:34. 343

4

TaskStarted

StartAutomationWaitForCallBack

-

15.4

2022년 3월 11일 오후 02:50:34. 457

5

TaskSubmitted

StartAutomationWaitForCallBack

-

657

2022년 3월 11일 오후 02:50:34. 960

6

TaskSucceeded

StartAutomationWaitForCallBack

-

103835

2022년 3월 11일 오후 02:52:18. 138

7

TaskStateExited

StartAutomationWaitForCallBack

-

103860

2022년 3월 11일 오후 02:52:18. 163

8

ExecutionSucceeded

-

103897

2022년 3월 11일 오후 02:52:18. 200