데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      AWS ChatOps 이용하기 I : AWS Chatbot과 Slack으로 AWS Lambda 함수 실행하기

      JIK 23.06.07
      3,498 11 0

      글 기고를 시작하며!

      가끔 아이패드랑 개발 PC는 없고, 핸드폰만 있을 때 특정 lambda를 slack 메시지를 통해 실행하고 싶을 때가 있다.

      그때 사용할 수 있는 서비스가 AWS Chatbot이다.

      해당 글에서는 AWS chatbot을 소개하고, 이를 활용하여 Slack을 연결하는 방법을 AWS CDK와 AWS 콘솔을 이용한 방법 두가지를 소개하고자 한다.

      마지막으로 Slack에서 Lambda 함수를 실행하는 방법까지 소개한다.

      AWS Chatbot이란?

      AWS Chatbot은 대화형 ChatOps가 가능한 AWS 서비스로 아래와 같이 공식페이지에서 소개하고 있다.

      스크린샷 2023-05-26 오후 3.48.46.png

      AWS Chatbot을 통해 ChatOps가 가능하며, Microsoft Teams, Slack 채널에 대화형 방식을 통해 AWS 리소스 모니터링, 운영 및 문제 해결이 가능하다고 한다[1].

      대표적인 예는 아래와 같다.

      1. ECS, EC2, Lambda 함수를 호출

      2. AWS Support 케이스 생성

      3. CI/CD 모니터링

      4. AWS Cloudwatch와 연동을 통한 알람 등

      사실 AWS cli 명령어를 slack에 바로 줄 수 있기 때문에 대부분의 업무를 AWS 콘솔에 로그인하지 않고, Slack에서 설정하고 모니터링하는 것이 가능하다.

      이번 기고글에서는 slack을 이용하여 Lambda 함수를 실행할 수 있는 예제를 중심으로 정리해 봤다.

      AWS Chatbot을 slack에 연결하기

      연결 방법은 간단하다. aws chatbot 페이지에 들어가서 아래 configure new client → Slack 선택 → Configure를 선택하면 바로 slack의 workspace와 연결 가능하다.

      (물론 Slack에 로그인 되어 있어야 한다)

      1. configure new client

        스크린샷 2023-05-26 오후 3.53.35.png

      2. Slack 선택

        스크린샷 2023-05-26 오후 3.54.59.png

      3. Configure에서 workspace 선택

        1.png

      4. configuration 생성

        2.png

      5. configuration 생성 결과 확인 (workspace ID 확인 가능)

        image.png

      최종 생성된 configuration 결과를 보면 workspace ID를 확인 가능하다.

      이제 새로운 채널만 연결해 주면 끝나는데, AWS CDK를 이용하거나 AWS 콘솔에서 이용해 채널 연결할 수 있다.

      친절하게(?) 둘다 소개해 보려고 한다.

      Slack 채널에 연결하는 방법1: AWS CDK를 이용

      AWS CDK를 활용해 구성하는 경우, 바로 이전 그림에서 Slack의 workspace를 확인해야 하며, 아래 코드와 같이 구성할 수 있다.

      new chatbot.SlackChannelConfiguration(this, 'SlackChannelECSAutoRun', {
            slackChannelConfigurationName: 'aws-cli-cmd',
            slackWorkspaceId: 'T025xxxxxx',
            slackChannelId: 'C059xxxxxx',
            role: AWSChatbotSlackRole
          })

      slackChannelConfigurationName은 channel 명으로 설정되는 이름이고, slackWorkspaceId는 위에 Workspace ID 값을 넣어주면 된다.

      slackChannelId는 slack의 채널에서 마우스 오른쪽을 클릭하면 아래 그림과 같이 “채널 세부정보 보기”를 확인할 수 있다.

      image.png

      그러면, 맨 밑에 아래 그림과 같이 채널 ID 확인이 가능한데, 그 값을 slackChannelId에 넣어주면 된다.

      5.png

      사실 어려운 부분이 role이다. 우선 여기서는 코드와 해당 role을 정리하면 다음과 같다.

      const AWSChatbotSlackRole = new iam.Role(this, 'AWSSlackECSAutoRunRole', {
            assumedBy: new iam.ServicePrincipal('chatbot.amazonaws.com'),
            roleName: `AWSSlackECSAutoRunRole`,
            managedPolicies: [
              iam.ManagedPolicy.fromManagedPolicyArn(this, 'ReadOnlyAccess', 'arn:aws:iam::aws:policy/ReadOnlyAccess'),
            ]
          })
          const policyChatbotReadOnlyCmd = new iam.Policy(this, 'AWSChatbotReadonlyCommandsPolicy', {
            statements: [
              new iam.PolicyStatement({
                effect: iam.Effect.DENY,
                actions: [
                  "iam:*",
                  "s3:GetBucketPolicy",
                  "ssm:*",
                  "sts:*",
                  "kms:*",
                  "cognito-idp:GetSigningCertificate",
                  "ec2:GetPasswordData",
                  "ecr:GetAuthorizationToken",
                  "gamelift:RequestUploadCredentials",
                  "gamelift:GetInstanceAccess",
                  "lightsail:DownloadDefaultKeyPair",
                  "lightsail:GetInstanceAccessDetails",
                  "lightsail:GetKeyPair",
                  "lightsail:GetKeyPairs",
                  "redshift:GetClusterCredentials",
                  "storagegateway:DescribeChapCredentials"
                ],
                resources: [`*`]
              })
            ]
          })
          AWSChatbotSlackRole.attachInlinePolicy(policyChatbotReadOnlyCmd)
          const policyLambdaInvoke = new iam.Policy(this, 'AWSChatbotLambdaInvokePolicy', {
            statements: [
              new iam.PolicyStatement({
                effect: iam.Effect.ALLOW,
                actions: [
                  "lambda:invokeAsync",
                  "lambda:invokeFunction"
                ],
                resources: [`*`]
              })
            ]
          })
          AWSChatbotSlackRole.attachInlinePolicy(policyLambdaInvoke)

      크게 role은 두개의 기본 policy와 lambda를 호출하기 위한 policy 3개로 구성되어 있다.

      • ReadOnlyAccess

      • AWSChatbotReadonlyCommandsPolicy

      • AWSChatbotLambdaInvokePolicy

      먼저 ReadOnlyAccess policy는 기본적으로 모니터링 하는 사용에게 부여하는 권한으로, AWS 내 모든 리소스에 대한 확인이 가능한 policy이다.

      보안팀이나 운영팀에게 권한 할당할때 한번씩은 사용했을 그런 policy이다.

      그럼 slack에 모든 읽기 권한을 다 주면 어떤 문제가 생길까? ssm이나 kms와 같이 암호나 파라미터, 키, iam 등 읽어서도 보안상 문제가 생기는 리소스들이 있다.

      그것을 DENY로 선언하여 조회하지 못하도록 하는 것이 두번때 policy인 policyChatbotReadOnlyCmd이다.

      마지막으로 policyLambdaInvoke는 lambda의 함수를 invoke하는 권한으로 함수 호출이 가능하게 한다.

      Slack 채널에 연결하는 방법2: AWS 콘솔을 이용

      AWS 콘솔을 이용해서 어떻게 구성해야 할까? 사실 콘솔로 구성하는 것이 더 도 간단하다.

      아래 그림과 같이 configured channels에서 Configure new channel -> 이름 및 Logging을 설정 -> 슬랙 채널 설정 -> Role 까지하면 설정이 가능하다.

      1. Configure new channel 클릭

        6.png

      2. 이름 및 Logging을 설정: 개인적으로는 최소한 에러는 로깅을 해줘야 뭐가 문제가 있는지 알 수 있기 때문에 Errors only로 선택

        스크린샷 2023-05-28 오전 6.40.56.png

      3. 슬랙 채널 설정: 개인적인 채널에 만들거라 Private을 선택. Channel ID는 위 CDK 설명하는 부분의 채널 ID 값을 넣어주면 설정 됨

        7.png

      4. 권한(Role) 설정: lambda invoke 명령을 줄거라 아래와 같이 선택

        스크린샷 2023-05-28 오전 6.41.39.png

      5. Notification: AWS 서비스의 알람이나 이벤트를 slack에 전달하기 위한 경우 설정 (lambda 함수 실행하는 경우에는 설정 안해줘도 됨)

        스크린샷 2023-05-28 오전 6.41.54.png

      AWS Lambda 함수 실행해 보기!

      그러면 실제로 Lambda 함수를 실행해 보자. 여기서는 ecs를 stop 하거나 start하는 함수를 미리 만들어 놓고, 함수 실행하는 예제를 만들어 보았다.

      함수를 실행하는 코드는 아래와 같다.

      @aws lambda invoke --function-name auto_stop_ecs_service --region ap-northeast-2

      물론 @aws 를 먼저 slack 메시지에 넣어줘야 되고, 그 후 위 함수를 실행하면 아래와 같이 실행된다.

      image.png

      그리고 command를 클릭하거나 "@aws Run"을 타이핑 해주면 해당 함수가 아래과 같이 성공적으로 실행되었다고 뜬다.

      image.png

      여기에 더 쉽게 명령을 실행할 수 있는 방법이 있다. 아래와 같이 alias 명령을 이용해 명령을 간략화 할 수도 있다.

      @aws alias create ecs-stop lambda invoke --function-name auto_stop_ecs_service --region ap-northeast-2

      이렇게 하면 "@aws run ecs-stop"으로 위 명령을 간단히 실행할 수 있다. 자세한 것은 [2] 를 참고하면 된다.

      마무리하며!

      오늘은 AWS Chatbot을 실행해서 AWS Lambda 함수를 실행하는 방법을 정리하였다. (다른 다양한 예제들은 [4]를 참고하라)

      AWS Chatbot과 Slack의 workspace 및 채널을 연결하는 방법을 AWS CDK와 콘솔을 활용하여 설정하는 방법도 소개하였다.

      그리고, 실제 AWS Lambda를 Slack에 실행하는 방법과 alias 명령을 활용해 간단한 명령으로 실행하는 팁도 소개하였다.


      해당 내용은 클라우드 인코더 과제에서 Hibernation 을 적용하기 위해, 관련 팀과 논의 중 slack 메시지를 통해 lambda를 실행하도록 아이디어를 내고 해결 방법을 정리한 글이다.

      많은 도움이 되셨으면 좋겠다. 끝!

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      JIK 님의 최신 블로그

      더보기
      동영상 기고하기