CloudFormation을 사용하지 않고 Lambda 지원 API를 내 Transfer Family 서버의 사용자 지정 자격 증명 공급자로 사용하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 8월 20일

AWS Lambda 지원 Amazon API Gateway API를 AWS Transfer Family 서버의 사용자 지정 자격 증명 공급자로 사용하고자 합니다. 그러나 구성에 AWS CloudFormation 스택 템플릿 중 하나를 사용하고 싶지 않습니다. 또는 구성을 사용자 지정하고 싶습니다. 이 방식으로 사용자 지정 자격 증명 공급자를 설정하려면 어떻게 해야 합니까?

간략한 설명

CloudFormation 스택 템플릿 중 하나를 사용하는 대신, 수동으로 Lambda 지원 API Gateway API를 Transfer Family 서버의 사용자 지정 자격 증명 공급자로 구성하도록 선택할 수 있습니다. 이렇게 하려면 서버와 함께 Lambda 함수와 API Gateway API를 직접 구성할 수 있습니다.

예를 들어 기본 스택 템플릿과 동일한 구성을 설정하려면 다음 단계를 수행합니다.

1.     Lambda 실행 역할을 위한 AWS Identity and Access Management(IAM) 역할을 생성합니다.

2.     Lambda 함수를 생성합니다.

3.     (선택 사항) API Gateway 로깅 역할을 위한 IAM 역할을 생성합니다.

4.     API Gateway API를 자격 증명 공급자로 설정합니다.

5.    Transfer Family 서버 및 서버 사용자를 위한 IAM 역할을 생성합니다.

6.    Transfer Family 서버를 생성합니다.

7.    자격 증명 저장소를 설정합니다.

​해결 방법

중요: 이 구성은 CloudFormation 스택 템플릿을 사용하지 않고 사용자 지정 자격 증명 공급자를 설정하는 방법의 한 예입니다. 사용자 지정 자격 증명 공급자에 대한 특정 요구 사항에 따라 구성 단계를 수정해야 합니다.

Lambda 실행 역할을 위한 IAM 역할 생성

1.    IAM 콘솔을 사용하여 실행 역할을 생성합니다.
참고: 이 구성에서는 기본 실행 권한만 있으면 됩니다. 그러나 실제 사용 사례에서는 사용 권한을 사용자 정의해야 합니다.

2.    역할의 신뢰 정책을 수정하여 다음 문을 추가합니다.

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

Lambda 함수 생성

단계를 따라 콘솔을 사용하여 Lambda 함수를 생성합니다. 다음을 구성해야 합니다.

1.    실행 역할(Execution role)에서, 생성한 Lambda 실행 역할을 선택합니다.

2.    함수 코드(Function code)에 대해 인증을 위한 기본 Lambda 함수를 사용할 수 있습니다. 또는 사용자 지정 함수를 사용할 수 있습니다.

(선택 사항) API Gateway 로깅 역할을 위한 IAM 역할 생성

Amazon CloudWatch Logs를 사용하면 REST API 오류를 디버깅하는 데 도움이 될 수 있습니다. 로깅 역할을 생성하려면 다음 단계를 따릅니다.

1.    API Gateway에 대한 IAM 역할을 생성하고 해당 역할에 AmazonAPIGatewayPushToCloudWatchLogs 관리형 정책을 연결합니다.

2.    역할의 신뢰 정책을 수정하여 다음 문을 추가합니다.

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

API Gateway API를 자격 증명 제공자로 설정

1.    API Gateway 콘솔을 엽니다.

2.    탐색 창에서 API를 선택합니다.

3.    API 생성(Create API)을 선택합니다.

4.    API 유형 선택(Choose an API type)에서 REST API로 이동한 다음 빌드(Build)를 선택합니다. 그런 후, 다음을 입력합니다.
프로토콜 선택(Choose the protocol)에서 REST를 선택합니다.
새 API 생성(Create new API)에서 새 API(New API)를 선택합니다.
API 이름(API name)에 API 이름을 입력합니다.
엔드포인트 유형(Enpoint Type)에서 리전별(Regional)을 선택합니다.

참고: REST API 프라이빗 옵션에서 API를 빌드하지 마십시오.

5.    API 생성(Create API)을 선택합니다.

6.    탐색 창에서 모델(Models)을 선택합니다. 그런 다음 생성(Create)을 선택합니다.

7.    모델 이름(Model name)UserConfigResponseModel을 입력합니다.

8.    콘텐츠 유형(Content type)application/json을 입력합니다.

9.    모델 스키마(Model schema)에 다음을 입력합니다.

{"$schema":"http://json-schema.org/draft-04/schema#","title":"UserUserConfig","type":"object","properties":{"Role":{"type":"string"},"Policy":{"type":"string"},"HomeDirectory":{"type":"string"},"PublicKeys":{"type":"array","items":{"type":"string"}}}}

10.    모델 생성(Create model)을 선택합니다.

11.    탐색 창에서 리소스(Resources)를 선택합니다.

12.    작업(Actions)을 확장한 다음 리소스 생성(Create Resource)을 선택합니다.

13.    Transfer Family 서버를 위한 리소스를 생성합니다. 리소스 이름(Resource Name)Servers를 입력합니다. 리소스 경로(Resource Path)servers를 입력합니다.

14.    서버 ID를 위한 리소스를 생성합니다. 리소스 이름(Resource Name)ServerID를 입력합니다. 리소스 경로(Resource Path){serverId}를 입력합니다.

15.    서버 사용자를 위한 리소스를 생성합니다. 리소스 이름(Resource Name)Users를 입력합니다. 리소스 경로(Resource Path)users를 입력합니다.

16.    사용자 이름을 위한 리소스를 생성합니다. 리소스 이름(Resource Name)Username을 입력합니다. 리소스 경로(Resource Path){username}을 입력합니다.

17.    사용자 구성을 위한 리소스를 생성합니다. 리소스 이름(Resource Name)GetUserConfig를 입력합니다. 리소스 경로(Resource Path)config를 입력합니다.

18.    작업(Actions)을 선택한 다음 메서드 생성(Create Method)을 선택합니다.

19.    드롭다운 메뉴에서 GET을 선택합니다. 그런 다음 GET 옆에 있는 확인 아이콘을 선택하여 메서드를 생성합니다.

20.    GET - 설정(Get - Setup)에 다음을 입력합니다.
통합 유형(Integration type)에서 Lambda 함수(Lambda Function)를 선택합니다.
람다 리전(ambda Region)에서 Lambda 함수가 속한 AWS 리전을 선택합니다.
Lambda 함수(Lambda Function)에서 생성한 함수를 선택합니다.

21.    저장(Save)을 선택합니다.

22.    메서드 요청(Method Request)을 선택합니다. 그런 후, 다음을 입력합니다.
권한 부여(Authorization)에서 AWS_IAM을 선택합니다.
HTTP 요청 헤더(HTTP Request Headers)에서 헤더 추가(Add header)를 선택합니다. 그런 다음 헤더 이름으로 Password를 입력합니다.
URL 쿼리 문자열 파라미터(URL Query String Parameters)에서 쿼리 문자열 추가(Add query string)를 선택합니다. 그런 다음쿼리 문자열 이름으로 protocol을 입력합니다.
쿼리 문자열 다시 추가(Add query string again)를 선택한 다음, 추가 쿼리 문자열 이름으로 SourceIp를 입력합니다.

23    GET 메서드의 탐색 모음에서 메서드 실행(Method Execution)을 선택하여 GET - 메서드 실행(GET - Method Execution) 페이지로 돌아갑니다.

24    통합 요청(Integration Request)을 선택합니다. 그런 다음 매핑 템플릿(Mapping Templates)을 확장합니다.

25.    요청 본문 패스스루(Request body passthrough)에서 요청 콘텐츠 유형 헤더와 일치하는 템플릿이 없을 때(When no template matches the request Content-Type header)를 선택합니다.

26.    콘텐츠 유형(Content-Type)application/json을 입력합니다. 확인 아이콘을 선택하여 확인합니다.

27.    템플릿에 다음을 입력합니다.

{ "username": "$input.params('username')", "password": "$util.escapeJavaScript($input.params('Password')).replaceAll("\\'","'")", "serverId": "$input.params('serverId')", "protocol": "$input.params('protocol')","sourceIp": "$input.params('sourceIp')" }

28.     저장(Save)을 선택합니다.

29.    GET 메서드의 탐색 모음에서 메서드 실행(Method Execution)을 선택하여 GET - 메서드 실행(GET - Method Execution) 페이지로 돌아갑니다.

30.    통합 응답(Integration Response)을 선택합니다. 매핑 템플릿이 없으며 응답 본문이 메서드 응답으로 전달되는지 확인합니다.

31.    GET 메서드의 탐색 모음에서 메서드 실행(Method Execution)을 선택하여 GET - 메서드 실행(GET - Method Execution) 페이지로 돌아갑니다.

32.    메서드 응답(Method Response)을 선택합니다. 그런 다음 200을 확장합니다.

33.    200에 대한 응답 본문(Response Body for 200)에서 모델(Models) 값을 편집하고 7~10 단계에서 생성한 UserConfigResponseModel을 선택합니다. 확인 아이콘을 선택하여 확인합니다.

34.    리소스(Resources) 탐색 창에서 GET을 선택하고 작업(Actions)을 선택한 다음 API 배포(Deploy API)를 선택합니다. 다음을 입력합니다.
배포 스테이지(Deployment stage)에서 [새 스테이지(New Stage)]를 선택합니다.
스테이지 이름(Stage name)에 스테이지의 이름을 입력합니다.

35.    배포(Deploy)를 선택합니다.

36.    탐색 창에서 스테이지(Stages)를 선택합니다. 그런 다음 생성(Create)을 선택하고 다음을 입력합니다.
스테이지 이름(Stage name)prod를 입력합니다.
배포(Deployment)에서 새 스테이지로 생성한 배포를 선택합니다.

37.    생성(Create)을 선택합니다.

Transfer Family 서버 및 서버 사용자를 위한 IAM 역할 생성

1.    다음과 비슷한 방식으로, 생성한 API를 호출할 수 있는 권한을 부여하는 Transfer Family 서버를 위한 IAM 역할을 생성합니다.

{
  "Version": "2012-10-17",
  "Statement": [
      {
          "Action": [
              "execute-api:Invoke"
          ],
          "Resource": "arn:aws:execute-api:{Region}:{AWS-Account-ID}:{API-Gateway-id}/{stage}/GET/*",
          "Effect": "Allow"
      },
      {
          "Action": [
              "apigateway:GET"
          ],
          "Resource": "*",
          "Effect": "Allow"
      }
  ]
}

2.    역할의 신뢰 정책을 수정하여 다음 문을 추가합니다.

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

3.    Amazon S3(Amazon Simple Storage Service) 버킷에 대한 액세스 권한을 부여하는 Transfer Family 서버 사용자를 위한 IAM 역할을 생성합니다. 그런 다음 역할의 신뢰 정책을 수정하여 2단계의 문을 추가합니다.

4.    CloudWatch로 로그를 전송하는 Transfer Family 서버를 위한 IAM 역할을 생성합니다. 그런 다음 역할의 신뢰 정책을 수정하여 2단계의 문을 추가합니다.

Transfer Family 서버 생성

단계에 따라 Transfer Family 서버를 생성합니다. 다음을 구성해야 합니다.

1.    자격 증명 제공자 유형(Identity provider type)에서 사용자 지정(Custom)을 선택합니다. 그런 다음 사용자 지정 공급자(Custom provider)에, 생성한 API를 입력합니다.

2.    호출 역할(Invocation role)에서, 생성한 API를 호출할 수 있는 권한을 서버에 부여하는 IAM 역할을 선택합니다.

3.    로깅 역할(Logging role)에서 CloudWatch로 로그를 전송하는 서버의 IAM 역할을 선택합니다.

자격 증명 저장소 설정

사용자 구성에 대한 자격 증명 저장소를 설정해야 합니다. 자격 증명 저장소 설정에 대한 자세한 내용은 Enable password authentication for AWS Transfer for SFTP using AWS Secrets Manager를 참조하십시오.

사용자가 Amazon S3 버킷에서 작업을 수행할 수 있으려면 최소한 다음 필드를 설정해야 합니다.

  • 사용자 이름(User name)
  • 암호(Password)
  • 홈 디렉터리(HomeDirectory)
  • 역할(Role)

참고: 역할은 서버 사용자에게 Amazon S3 버킷에 대한 액세스 권한을 부여하기 위해 생성한 IAM 역할의 Amazon 리소스 이름(ARN)입니다.

설정 테스트 및 문제 해결

다음과 같은 방법으로 설정을 테스트할 수 있습니다.

설정 관련 문제가 발생하면 다음과 같은 방법으로 문제를 해결할 수 있습니다.

  • 테스트 자격 증명 공급자의 응답을 확인합니다. 상태 코드가 200이 아닌 경우 API 설정에 문제가 있는 것일 수 있습니다.
  • 생성한 IAM 역할에 올바른 권한 및 신뢰 관계가 있는지 확인합니다.
  • 이 구성을 사용하면 로깅이 가능하므로 Lambda 실행 로그, API Gateway 로그 및 Transfer Family 로그를 검토하여 문제를 식별할 수 있습니다.
  • 필요한 사용자 지정 자격 증명 공급자 설정이 사용 가능한 CloudFormation 스택 중 하나와 일치하는 경우 CloudFormation 템플릿의 배포를 시도하고 설정과 비교하여 문제를 식별할 수 있습니다.

이 문서가 도움이 되었습니까?


결제 또는 기술 지원이 필요합니까?