[소소한 개발 일지] serverless-next.js를 사용한 배포에서 새로운 Role이 계속 생성되는 문제 해결하기

Explanation

오늘은 serverless-next.js를 사용한 프로젝트 배포에서 새로운 Role이 계속 생성되는 문제를 해결하는 방법에 대하여 적어보려 합니다.

간단한 글이지만, 이전에 작성했던 /새로운-버전-serverless-framework를-사용하여-nextjs-프로젝트를-aws-lambda를-통/ 글에서 사용한 serverless.yml 파일을 가지고 이어서 사용합니다.

1. 문제의 상황

// serverless.yml
falsyExempleServerlessNext:
  component: "@sls-next/serverless-component@1.18.0"
  inputs:
    bucketName: "falsy-exemple-s3"
    cloudfront:
      distributionId: ABCDEFG..
    name:
      defaultLambda: "falsy-exemple-default-lambda"
      apiLambda: "falsy-exemple-api-lambda"

이전 글에서 적었던 것 처럼 위와 같은 설정으로 배포를 하면,

이렇게 xxxxxx-xxxxxxx 형식의 이름으로 매번 배포할 때마다 Role이 생성된답니다.

2. 문제의 해결

우선 깃헙에서 관련한 내용을 확인해보니
https://github.com/serverless-nextjs/serverless-next.js

// serverless.yml
myNextApplication:
  component: "@sls-next/serverless-component@{version_here}"
  inputs:
    roleArn: "arn:aws:iam::123456789012:role/MyCustomLambdaRole"

위와 같이 role을 지정해주면 된다고 써있답니다.

우선 Role에 적용할 Policy를 만들어야겠죠?

AWS의 IAM에서 '정책' 메뉴로 가서 '정책 생성' 버튼을 눌러서 새로운 정책을 만들어 줍니다.
정책은 JSON 탭으로 가서 아래와 같이 만들어 줍니다.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Resource": "*",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ]
    },
    {
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::falsy-exemple-s3/*",
      "Action": [
        "s3:GetObject",
        "s3:PutObject"
      ]
    }
  ]
}

arn:aws:s3:::falsy-exemple-s3/*
여기에 버킷 이름을 적어주세요.

이름은 falsy-exemple-policy 로 할게요.

이어서 Role을 만들어 줍니다.

AWS의 IAM에서 '역할' 메뉴로 가서 '역할 만들기' 버튼을 눌러서 새로운 역할을 만들어 줍니다.
사용 사례에 Lambda를 선택하고 다음 탭에서 조금 전에 만들었던 falsy-exemple-policy를 선택해줍니다.
이름은 falsy-exemple-role 로 할게요.

다음으로 만들어진 falsy-exemple-role을 선택한후 '신뢰 관계' 탭으로 가서, '신뢰 관계 편집' 버튼을 눌러서

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "lambda.amazonaws.com",
          "edgelambda.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

edgelambda.amazonaws.com - 엣지람다도 추가해줍니다.

이렇게 역할을 만드는 건 끝났고 이제 위 '역할 ARN' 을 복사합니다.
대충 arn:aws:iam::123456789012:role/falsy-exemple-role 이런식이겠죠?

이제 다시 serverless.yml에 깃헙에서 봤던 것처럼 roleArn을 지정해줍니다.

// serverless.yml
falsyExempleServerlessNext:
  component: "@sls-next/serverless-component@1.18.0"
  inputs:
    roleArn: "arn:aws:iam::123456789012:role/falsy-exemple-role"
    bucketName: "falsy-exemple-s3"
    cloudfront:
      distributionId: ABCDEFG..
    name:
      defaultLambda: "falsy-exemple-default-lambda"
      apiLambda: "falsy-exemple-api-lambda"

이제 다시 배포를 해보면 새로운 역할이 생성되지 않...
을 줄 알았지만. 왠 걸 roleArn 이 적용되지 않고 새로운 또 xxxxxx-xxxxxxx 역할이 추가되었습니다...

다시 깃헙으로 가서 이슈를 찾아본 결과.

https://github.com/serverless-nextjs/serverless-next.js/issues/854
'evangow'님께서 1.19.0-alpha.30 버전에서 새로운 롤이 생기는 문제가 있다라고 이야기 해주셨고
'dphang'님께서 업데이트 해주셨다고 2월 11일에 답변을 달아주셨답니다.

그리고 Releases를 확인해보니 2월 11일에 1.19.0-alpha.31 버전이 프리 릴리스 된 것으로 보아 alpha.31 버전부터 해당 문제가 해결되었을 거 같아요. 그리고 이왕 알파버전을 사용하는 거 최신 버전(alpha.37)으로 적용하면.

// serverless.yml
falsyExempleServerlessNext:
  component: "@sls-next/serverless-component@1.19.0-alpha.37"
  inputs:
    roleArn: "arn:aws:iam::123456789012:role/falsy-exemple-role"
    bucketName: "falsy-exemple-s3"
    cloudfront:
      distributionId: ABCDEFG..
    name:
      defaultLambda: "falsy-exemple-default-lambda"
      apiLambda: "falsy-exemple-api-lambda"

이제 다시 npx serverless 커맨드를 통해 배포하면 람다에 falsy-exemple-role 역할이 적용되고 새로운 역할이 만들어지지 않는답니다!

끝