Amazon EventBridge를 사용한 AWS ECS 작업 배포 실패 알림

Amazon Elastic Container Service(ECS)는 Docker 컨테이너를 지원하고 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스의 관리형 클러스터에서 애플리케이션을 쉽게 실행할 수 있게 해주는 확장성이 뛰어난 고성능 컨테이너 관리 서비스입니다.

우리는 최근 배포를 ECS로 이전하기로 결정했습니다. Ben 삼촌이 말했듯이 — 큰 힘에는 큰 책임이 따른다 — 이 새로운 구현에 대한 모니터링 및 경고를 설정하는 것은 매우 흥미로웠으며 이 블로그 게시물은 우리가 구성한 하나의 특정 경보에 대해 자세히 설명합니다. 배포 중에 ECS 작업이 실패합니까?

실패/오류가 발생할 때 경고를 보내야 하는 Microsoft 팀 웹후크가 있습니다. 이 경고 덤프는 귀하의 경우 다른 응용 프로그램일 수 있습니다.

ECS 작업이 실패할 때마다 알림을 생성하기 위해 Amazon EventBridge 규칙을 활용했습니다. 이를 통해 무엇이 잘못되었는지 확인할 수 있습니다. 아래는 구현의 높은 수준의 블록 다이어그램입니다.



네, 저는 여러분의 눈이 무엇을 찾고 있는지 알고 있습니다. 바로 이벤트 규칙 패턴입니다. 다음은 우리가 사용한 패턴입니다.

{
  "detail": {
    "group": ["service:<<name of your service>>"],
    "lastStatus": ["STOPPED"],
    "stoppedReason": [{
      "anything-but": {
        "prefix": "Scaling activity initiated by (deployment"
      }
    }]
  },
  "detail-type": ["ECS Task State Change"],
  "source": ["aws.ecs"]
}


요지: https://gist.github.com/akhil-ghatiki/1251a54da8eaaca3c20f5322f5106319.js

규칙에 모든 패턴을 사용할 수 있습니다. 위의 예에서는 값이 서비스 이름인 그룹 키를 기반으로 필터링합니다. 따라서 서비스 이름이 있는 모든 이벤트는 SNS로 전송됩니다. 다음은 규칙 패턴에 필요할 수 있는 다른 속성에 도움이 되는 샘플 이벤트입니다.

{
  "version": "0",
  "id": "XXXXXXXXXXXXX",
  "detail-type": "ECS Task State Change",
  "source": "aws.ecs",
  "account": "XXXXXXXXX",
  "time": "2022-10-10T10:06:29Z",
  "region": "XXXXXXXX",
  "resources": [
    "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:task/XXXXXXXXXX/XXXXXX"
  ],
  "detail": {
    "attachments": [
      {
        "id": "XXXXXXXXXXXXX",
        "type": "sdi",
        "status": "DELETED",
        "details": []
      },
      {
        "id": "XXXXXXXXXXXXX",
        "type": "eni",
        "status": "DELETED",
        "details": [
          {
            "name": "subnetId",
            "value": "XXXXXXXX"
          },
          {
            "name": "networkInterfaceId",
            "value": "XXXXXXXX"
          },
          {
            "name": "macAddress",
            "value": "XXXXXXXX"
          },
          {
            "name": "privateDnsName",
            "value": "XXXXXXXX"
          },
          {
            "name": "privateIPv4Address",
            "value": "XXXXXXXX"
          }
        ]
      },
      {
        "id": "XXXXXXXXXXXXX",
        "type": "elb",
        "status": "DELETED",
        "details": []
      }
    ],
    "attributes": [
      {
        "name": "ecs.cpu-architecture",
        "value": "XXXXXXXX"
      }
    ],
    "availabilityZone": "XXXXXXXXa",
    "clusterArn": "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:cluster/XXXXXXXXXX",
    "connectivity": "CONNECTED",
    "connectivityAt": "2022-10-10T10:05:38.02Z",
    "containers": [
      {
        "containerArn": "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:container/XXXXXXXXXX/XXXXXX/XXXXXXXXX",
        "lastStatus": "STOPPED",
        "name": "XXXXXXX",
        "image": "XXXXXXXX.dkr.ecr.XXXXXXXX.amazonaws.com/XXXXXXXX/XXXXXXX:XXXXXX",
        "runtimeId": "XXXXXX-1979092248",
        "taskArn": "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:task/XXXXXXXXXX/XXXXXX",
        "networkInterfaces": [
          {
            "attachmentId": "XXXXXXXXX",
            "privateIpv4Address": "XXXXXXX"
          }
        ],
        "cpu": "0"
      }
    ],
    "cpu": "512",
    "createdAt": "2022-10-10T10:05:34.301Z",
    "desiredStatus": "STOPPED",
    "enableExecuteCommand": false,
    "ephemeralStorage": {
      "sizeInGiB": 20
    },
    "executionStoppedAt": "2022-10-10T10:05:46.497Z",
    "group": "service:XXXXXXX",
    "launchType": "FARGATE",
    "lastStatus": "STOPPED",
    "memory": "1024",
    "overrides": {
      "containerOverrides": [
        {
          "name": "XXXXXXX"
        }
      ]
    },
    "platformVersion": "1.4.0",
    "startedBy": "ecs-svc/XXXXXX",
    "stoppingAt": "2022-10-10T10:05:56.53Z",
    "stoppedAt": "2022-10-10T10:06:29.152Z",
    "stoppedReason": "CannotPullContainerError: inspect image has been retried 1 time(s): failed to resolve ref \"XXXXXXXX.dkr.ecr.XXXXXXXX.amazonaws.com/XXXXXXXX/XXXXXXX:XXXXXX\": XXXXXXXX.dkr.ecr.XXXXXXXX.amazonaws.com/XXXXXXXX/XXXXXXX:XXXXXX: not found",
    "stopCode": "TaskFailedToStart",
    "taskArn": "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:task/XXXXXXXXXX/XXXXXX",
    "taskDefinitionArn": "arn:aws:ecs:XXXXXXXX:XXXXXXXXX:task-definition/XXXXXXX:XXX",
    "updatedAt": "2022-10-10T10:06:29.152Z",
    "version": 4
  }
}


요지: https://gist.github.com/akhil-ghatiki/e2654a551d6989ed0cb652318357f20b.js

신스피드!!

좋은 웹페이지 즐겨찾기