AWS Stop Function에서 ECS 작업을 정기적으로 수행하는 메커니즘을 SAM으로 설계

18642 단어 AWSStep Functionstech

개요


ECS에서 서비스의 디버깅을 하는 경우 같은 용기에서 대량으로 수행하려는 경우도 있다.이때 ECS의 기능으로'임무의 스케줄링'이 있어 콘솔에서 파치만 설정하면 정기적으로 임무를 시작할 수 있고 외부에서 명령을 주입하면 임의의 횟수를 수행할 수 있다.
단, 작업의 스케줄링 기능을 사용할 때 시간 초과와 재시도 등 상세한 설정은 할 수 없다.구체적인 위험으로는 예상을 뛰어넘는 비준 집행에 시간이 걸리고 예상을 뛰어넘는 비용이 들었다는 것을 열거할 수 있다.
이 사안에 대해서는 AWS 지원에 문의했고, Step Function을 추천했다.이 글에서 우리는 한 내용에 대해 일지와 참고 문헌을 정리할 것이다.

Step Function은


Step Function을 사용하면 AWS만의 JSON 형식의 기술을 통해 여러 램바다 함수, SNS, 배치, ECS, 다이나모DB 등 여러 서비스의 협업을 기술할 수 있다.이번 초점은 ECS와의 협력이다.
거의 무사이즈인 것 같아요.생각보다 간단하니까 이름만 들어본 느낌이라면 콘솔로 만져보는 게 좋을 것 같아요.특별히 움직이고 싶은 람다 함수 없이도 튜토리얼을 만들어 바로 피부 감각을 얻을 수 있다.
JSON 기법을 통해 실행 시 재시도나 시간 초과 등 응용 프로그램 주체와 다른 요구를 지정할 수 있다는 장점이 있다.이렇게 되면 ECS 임무 수행에 시간 초과를 설정해 최초 과제를 해결할 수 있게 된다.

SAM


SAM을 사용하면 전용 SAM CLI(주로sam 명령)를 이용하여yaml 형식으로 기술된 인프라 시설 설정을 설계할 수 있다.SAM은 Serverless Application Model의 약자로 Lambda를 활용 상황의 중심으로 고려하지만 이번 요구와 같이 ECS 임무를 수행하는 Step Function에도 해당한다.
sam init 명령을 실행하면 샘플 프로그램이 설정된 상태에서 디렉터리는 로컬에서 전개되며, 전개된 코드만 읽으면 알 수 있습니다.
나는 개인적으로 cdk와 구별되는 것을 아직 잘 모른다.장기적으로는 CDK가 더 보편화한 것 같지만 이번처럼 작은 사례로는 CDK가 어떻게 구현되는지 알기 어려워 애초에 SAM으로 해보다가 시간이 나면 CDK로 하면 딱 맞을 것 같다.이번에도 CDK에 도전했지만 형식 정의상 어떻게 해야 할지 알 수 없었고, 기릿허브의 아이슈도 방치돼 조금 힘들었다.

Step Function 상태기 설명


Step Function 상태기(워크플로우. 단계가 기술된 JSON)는 다음과 같습니다.
{
    "Comment": "A Hello World example of the Amazon States Language using Pass states",
    "StartAt": "Run Fargate Task",
    "States": {
      "Run Fargate Task": {
        "Type": "Task",
        "Resource": "arn:aws:states:::ecs:runTask.sync",
        "TimeoutSeconds": 300,
        "Parameters": {
          "LaunchType": "FARGATE",
          "Cluster": "CLUSTER ARN",
          "TaskDefinition": "TASK DEFINITION ARN",
          "NetworkConfiguration": {
            "AwsvpcConfiguration": {
              "Subnets": [
                "SUBNET ID"
              ],
              "SecurityGroups": [
                "SECURITY GROUP ID"
              ],
              "AssignPublicIp": "ENABLED"
            }
          },
          "Overrides": {
            "ContainerOverrides": [
              {
                "Name": "CONTAINER NAME",
                "Command.$": "$.commands"
              }
            ],
            "TaskRoleArn": "ROLE ARN"
          }
        },
        "Next": "Notify Success",
        "Catch": [
          {
            "ErrorEquals": [
              "States.ALL"
            ],
            "Next": "Notify Failure"
          }
        ]
      },
      "Notify Success": {
        "Type": "Pass",
        "Result": "Success",
        "End": true
      },
      "Notify Failure": {
        "Type": "Pass",
        "Result": "Failure",
        "End": true
      }
    }
  }
여기의 JSON 설정에는 몇 가지 전제가 있으니 양해해 주십시오.
  • FARGATE를 통한 작업 정의 기술
  • 일괄 처리를 위한 외부 명령 주입
  • JSON의 구문은 States라는 객체에 상태를 기술합니다.Run Fargate Task 이 State를 보았는데Next라는 키에 다음 이동 상태 이름Notify Success이 적혀 있었다.또한 오류가 발생했을 때Catch 키에 써야 하고, 거기에 옮겨야 한다. Notify Failure그런 다음 AWS 콘솔에 다음 상태 마이그레이션 다이어그램이 자동으로 그려집니다.이곳은 매우 평범하고 대단한 곳이다.이거 직접 조립한 거예요?
    Image from Gyazo
    주제 밖의 이야기를 하자면 자바스크립트의 xstate 아이디어와 가깝게 느껴진다.( https://github.com/davidkpiano/xstate)
    다음 행은 외부에서 입력을 받는 부분입니다.
                    "Command.$": "$.commands"
    
    제작된 JSON은 sfn이다.asl.json의 이름으로 statemachine 디렉터리 아래에 놓으십시오.이곳의 명칭은 무엇이든지 다 된다.

    SAM의 template입니다.yaml


    SAM 측 설정은 다음과 같습니다.
    AWSTemplateFormatVersion: '2010-09-09'
    Transform: AWS::Serverless-2016-10-31
    Description: >
      sam-step-functions-test
      Sample SAM Template for sam-step-functions-test
    
    Parameters:
      StateMachineName:
        Description: Please type the Step Functions StateMachine Name.
        Type: String
        Default: 'sfn-sam-app-statemachine-for-test'
      
    Resources:
      SampleStateMachine:
        Type: AWS::Serverless::StateMachine
        Properties:
          Name: !Sub ${StateMachineName}
          DefinitionUri: statemachine/sfn.asl.json
          Role: ROLE_ARN
          Events:
            SampleScheduleEvents:
              Type: Schedule
              Properties:
                Input: '{"commands": ["php", "artisan", "command:artisan-command"]}'
                Schedule: 'rate(3 hours)'
          Logging:
            Level: ALL
            IncludeExecutionData: True
            Destinations:
              - CloudWatchLogsLogGroup:
                  LogGroupArn: !GetAtt StateMachineLogGroup.Arn
      StateMachineLogGroup:
        Type: AWS::Logs::LogGroup
        Properties:
          LogGroupName : !Join [ "", [ '/aws/states/', !Sub '${StateMachineName}', '-Logs' ] ]
    
    Definition Uri라는 키에는 방금 만든 JSON이 적혀 있다.
    DefinitionUri를 지정하여 Step Function을 실행할 수 있지만 이번 목적은 배치 처리를 수행하기 위한 것이기 때문에 Events 키를 사용하여 3시간마다 명령을 주입하여 실행하기로 결정했습니다.
    다음 그림에서 보듯이 commands 키가 있는 JSON을 Input으로 지정하면 이전 섹션에서 만든 Step Function의 상태기"$.commands"에서 매개변수를 받은 후 실행할 수 있습니다.여기서는 같은 임무 정의지만 자유롭게 집행할 수 있을 때 지정한 명령의 운용을 구상했다.
                Input: '{"commands": ["php", "artisan", "command:artisan-command"]}'
    
    SAM 측의 문서https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-statemachine.html만 읽으면 무엇을 지정해야 하는지 알 수 있을 것 같습니다.

    명령하다


    SAM 정의 구축


    sam build
    

    설계를 진행하다


    sam deploy --guided
    
    또는
    sam deploy --config-file samconfig.toml --config-env {任意の環境名}
    

    함정.

  • Role에 대한 사용 권한이 부족하여 실패하므로 오류 내용에 따라 Role에 적절한 사용 권한을 부여합니다.Step Function은 특히 최초에는 실패할 수 있기 때문에 현재 상황의 추천으로 먼저 콘솔에 JSON을 써서 반복적으로 집행하고, 순조롭게 진행되는 JSON을 SAM
  • 에 가져간다.
  • 클라우드 포메이션이 있다고 생각하지만 창고를 업데이트하는 도중에 다시 디버깅을 합니다. 실패할 때 굴러가는 과정에서 디버깅을 하면 실패 등 오류가 발생할 수 있으니 조급해하지 마세요
  • SAM, Stop Function, 개별 서비스의 API 문서를 각각 보아야 하기 때문에 난이도가 좀 높다.ECS API 문서의 내용을 참조할 때 최종적으로 파스칼 케이스에 YAML 등이 기재되지만, 문서에는 낙타 껍질이 나와 있으니 주의해야 한다.가등도 가짜로 쓴다
  • 시간표식의cron과rate는 취미가 있나요?무슨 요일에 쓰여진 곳에서rate식 unit는 단수 형식 또는 복수 형식
  • 참고 문헌


    20190731 Black Belt Online Seminar Amazon ECS Deep Dive
    https://www.slideshare.net/AmazonWebServicesJapan/20190731-black-belt-online-seminar-amazon-ecs-deep-dive-162160987/41
    단계 Function에서 Task 기술
    https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/amazon-states-language-task-state.html
    단계 Function의 컨테이너 작업 관리(Amazon ECS, Amazon SNS)
    https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/sample-project-container-task-notification.html
    SAM CLI 설치
    https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-sam-cli-install-mac.html
    SAM 자습서
    https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/serverless-getting-started-hello-world.html
    SAM의 상태기(Step Function)에 대한 설명
    https://docs.aws.amazon.com/ja_jp/serverless-application-model/latest/developerguide/sam-resource-statemachine.html
    ECS에 대한 API 참조 정보
    https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/APIReference/API_RunTask.html#API_RunTask_RequestSyntax

    좋은 웹페이지 즐겨찾기