Step Functions를 사용하여 Amazon EKS 클러스터 생성 및 관리 - AWS Step Functions

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Step Functions를 사용하여 Amazon EKS 클러스터 생성 및 관리

Step Functions를 Amazon과 통합하여 Kubernetes 클러스터EKS를 관리하는 방법을 알아봅니다. Step Functions는 Amazon Elastic Kubernetes Service와 통합하기 APIs 위한 두 가지 유형의 서비스 통합을 제공합니다. 이를 통해 Amazon을 사용하여 Amazon EKS 클러스터EKSAPIs를 생성하고 관리할 수 있습니다. 다른를 사용하면 Kubernetes를 사용하여 클러스터와 상호 작용API하고 애플리케이션 워크플로의 일부로 작업을 실행할 수 있습니다.

Step Functions를 사용하여 생성된 Amazon EKS 클러스터, eksctl 도구 또는 Amazon EKS 콘솔에서 생성된 Amazon EKS 클러스터 또는 유사한 메서드와 Kubernetes API 통합을 사용할 수 있습니다. 자세한 내용은 Amazon 사용 설명서의 Amazon EKS 클러스터 생성을 참조하세요. EKS

Step Functions의 AWS 서비스와 통합하는 방법에 대한 자세한 내용은 서비스 통합 및 단원을 참조하십시오Step FunctionsAPI의 서비스에 파라미터 전달.

최적화된 Amazon EKS 통합의 주요 기능
참고

Step Functions EKS 통합은 퍼블릭 엔드포인트 액세스 권한이 APIs 있는 Kubernetes만 지원합니다. 기본적으로 EKS 클러스터 API 서버 엔드포인트에는 퍼블릭 액세스 권한이 있습니다. 자세한 내용은 Amazon 사용 설명서의 Amazon EKS 클러스터 엔드포인트 액세스 제어를 참조하세요. EKS

Step Functions는 실행이 중지된 경우 Amazon EKS 클러스터를 자동으로 종료하지 않습니다. Amazon EKS 클러스터가 종료되기 전에 상태 시스템이 중지되면 클러스터가 무기한 계속 실행될 수 있으며 추가 요금이 발생할 수 있습니다. 이를 방지하려면 생성한 모든 Amazon EKS 클러스터가 올바르게 종료되었는지 확인합니다. 자세한 내용은 다음을 참조하세요.

참고

Step Functions에는 작업의 최대 입력 또는 결과 데이터 크기에 대한 할당량이 있습니다. 이렇게 하면 다른 서비스로 데이터를 전송하거나 수신할 때 UTF-8 인코딩된 문자열로 256KiB의 데이터로 제한됩니다. 상태 시스템 실행과 관련된 할당량을 참조하세요.

Kubernetes API 통합

Step Functions는 다음 Kubernetes를 지원합니다APIs.

RunJob

eks:runJob 서비스 통합을 사용하면 Amazon EKS 클러스터에서 작업을 실행할 수 있습니다. 이 eks:runJob.sync 변형을 사용하면 작업이 완료될 때까지 기다릴 수 있으며 선택적으로 로그를 검색할 수 있습니다.

Kubernetes API 서버는 상태 시스템에서 사용하는 IAM 역할에 권한을 부여해야 합니다. 자세한 내용은 권한 단원을 참조하십시오.

작업 실행(.sync) 패턴의 경우 작업 상태는 폴링을 통해 결정됩니다. Step Functions는 처음에 1분당 약 1회 속도로 폴링합니다. 결국 이 속도는 5분당 약 1회 폴링으로 느려집니다. 더 자주 폴링해야 하거나 폴링 전략을 더 세밀하게 제어해야 하는 경우 eks:call 통합을 사용하여 작업 상태를 쿼리하면 됩니다.

eks:runJob 통합은 batch/v1 Kubernetes 작업에만 해당됩니다. 자세한 내용은 Kubernetes 문서의 작업을 참조하세요. 사용자 지정 리소스를 포함하여 다른 Kubernetes 리소스를 관리하려면 eks:call 서비스 통합을 사용합니다. Lambda 및를 사용한 작업 상태에 대한 폴링 AWS Batch 샘플 프로젝트에 나와 있는 것처럼 Step Functions를 사용하여 폴링 루프를 빌드할 수 있습니다.

지원되는 파라미터는 다음과 같습니다.

  • ClusterName: 호출하려는 Amazon EKS 클러스터의 이름입니다.

    • Type: String

    • 필수 항목 여부: 예

  • CertificateAuthority: 클러스터와 통신하는 데 필요한 Base64로 인코딩된 인증서 데이터입니다. Amazon EKS 콘솔에서 또는 Amazon EKS DescribeCluster를 사용하여이 값을 얻을 수 있습니다API.

    • Type: String

    • 필수 항목 여부: 예

  • Endpoint: Kubernetes API 서버의 엔드포인트URL입니다. Amazon EKS 콘솔에서 또는 Amazon EKS DescribeCluster를 사용하여이 값을 얻을 수 있습니다API.

    • Type: String

    • 필수 항목 여부: 예

  • Namespace: 작업을 실행할 네임스페이스입니다. 제공되지 않으면 default 네임스페이스가 사용됩니다.

    • Type: String

    • 필수 항목 여부: 아니요

  • Job: Kubernetes 작업 정의입니다. Kubernets 문서의 작업을 참조하세요.

    • Type: JSON 또는 String

    • 필수 항목 여부: 예

  • LogOptions: 선택적 로그 검색을 제어하는 옵션 집합입니다. 실행 작업(.sync) 서비스 통합 패턴을 사용하여 작업 완료를 기다리는 경우에만 적용 가능합니다.

    • Type: JSON

    • 필수 항목 여부: 아니요

    • 로그는 logs 키 아래의 응답에 포함됩니다. 작업 내에 포드가 여러 개 있을 수 있으며 포드마다 컨테이너가 여러 개 있을 수 있습니다.

      { ... "logs": { "pods": { "pod1": { "containers": { "container1": { "log": <log> }, ... } }, ... } }
    • 로그 검색은 최선의 노력을 기반으로 수행됩니다. 로그를 검색하는 동안에 오류가 발생하는 경우 log 필드 대신 errorcause 필드가 표시됩니다.

  • LogOptions.RetrieveLogs: 작업 완료 후 로그 검색을 활성화합니다. 기본적으로 로그는 검색되지 않습니다.

    • Type: Boolean

    • 필수 항목 여부: 아니요

  • LogOptions.RawLogs: RawLogs이 true로 설정된 경우 로그는에 구문 분석하지 않고 원시 문자열로 반환됩니다JSON. 기본적으로 로그는 JSON 가능하면 역직렬화됩니다. 경우에 따라 이러한 파싱으로 인해 많은 자릿수가 포함된 숫자의 정밀도 제한과 같은 원치 않는 변경 사항이 발생할 수 있습니다.

    • Type: Boolean

    • 필수 항목 여부: 아니요

  • LogOptions.LogParameters: KubernetesAPI의 읽기 로그는 쿼리 파라미터를 API 지원하여 로그 검색을 제어합니다. 예를 들어 tailLines 또는 limitBytes를 사용하여 검색된 로그의 크기를 제한하고 Step Functions 데이터 크기 할당량 이내로 유지할 수 있습니다. 자세한 내용은 Kubernetes API 참조의 로그 읽기 섹션을 참조하세요.

    • Type: List of Strings에 대한 String

    • 필수 항목 여부: 아니요

    • 예제:

      "LogParameters": { "tailLines": [ "6" ] }

다음 예제에는 작업을 실행하고 작업이 완료될 때까지 기다린 다음 작업 로그를 검색하는 Task 상태가 포함됩니다.

{ "StartAt": "Run a job on EKS", "States": { "Run a job on EKS": { "Type": "Task", "Resource": "arn:aws:states:::eks:runJob.sync", "Parameters": { "ClusterName": "MyCluster", "CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE", "Endpoint": "https://AKIAIOSFODNN7EXAMPLE.yl4.us-east-1.eks.amazonaws.com", "LogOptions": { "RetrieveLogs": true }, "Job": { "apiVersion": "batch/v1", "kind": "Job", "metadata": { "name": "example-job" }, "spec": { "backoffLimit": 0, "template": { "metadata": { "name": "example-job" }, "spec": { "containers": [ { "name": "pi-2000", "image": "perl", "command": [ "perl" ], "args": [ "-Mbignum=bpi", "-wle", "print bpi(2000)" ] } ], "restartPolicy": "Never" } } } } }, "End": true } } }

Call

eks:call 서비스 통합을 통해 Kubernetes를 사용하여 Kubernetes API 엔드포인트API를 통해 Kubernetes 리소스 객체를 읽고 쓸 수 있습니다.

Kubernetes API 서버는 상태 시스템에서 사용하는 IAM 역할에 권한을 부여해야 합니다. 자세한 내용은 권한 단원을 참조하십시오.

사용 가능한 작업에 대한 자세한 내용은 Kubernetes API 참조를 참조하세요.

지원되는 Call 파라미터는 다음과 같습니다.

  • ClusterName: 호출하려는 Amazon EKS 클러스터의 이름입니다.

    • Type: 문자열 목록

    • 필수 여부: 예

  • CertificateAuthority: 클러스터와 통신하는 데 필요한 Base64로 인코딩된 인증서 데이터입니다. Amazon EKS 콘솔에서 또는 Amazon EKS DescribeCluster를 사용하여이 값을 얻을 수 있습니다API.

    • Type: String

    • 필수 여부: 예

  • Endpoint: Kubernetes API 서버의 엔드포인트URL입니다. 이 값은 Amazon EKS 콘솔에서 또는 Amazon EKS'를 사용하여 찾을 수 있습니다 DescribeCluster API.

    • Type: String

    • 필수 여부: 예

  • Method: 요청의 HTTP 메서드입니다. GET, POST, PUT, DELETE, HEAD 또는 PATCH 중 하나입니다.

    • Type: String

    • 필수 여부: 예

  • Path: Kubernetes REST API 작업의 HTTP 경로입니다.

    • Type: String

    • 필수 여부: 예

  • QueryParameters: Kubernetes REST API 작업의 HTTP 쿼리 파라미터입니다.

    • Type: List of Strings에 대한 String

    • 필수 여부: 아니요

    • 예제:

      "QueryParameters": { "labelSelector": [ "job-name=example-job" ] }
  • RequestBody: Kubernetes REST API 작업의 HTTP 메시지 본문입니다.

    • Type: JSON 또는 String

    • 필수 여부: 아니요

다음에는eks:call을 사용하여 example-job 작업에 속하는 포드를 나열하는 Task 상태가 포함됩니다.

{ "StartAt": "Call EKS", "States": { "Call EKS": { "Type": "Task", "Resource": "arn:aws:states:::eks:call", "Parameters": { "ClusterName": "MyCluster", "CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE", "Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com", "Method": "GET", "Path": "/api/v1/namespaces/default/pods", "QueryParameters": { "labelSelector": [ "job-name=example-job" ] } }, "End": true } } }

다음에는 eks:call을 사용하여 example-job 작업을 삭제하고 propagationPolicy를 설정하여 작업 포드도 삭제되었는지 확인하는 Task 상태가 포함됩니다.

{ "StartAt": "Call EKS", "States": { "Call EKS": { "Type": "Task", "Resource": "arn:aws:states:::eks:call", "Parameters": { "ClusterName": "MyCluster", "CertificateAuthority": "ANPAJ2UCCR6DPCEXAMPLE", "Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com", "Method": "DELETE", "Path": "/apis/batch/v1/namespaces/default/jobs/example-job", "QueryParameters": { "propagationPolicy": [ "Foreground" ] } }, "End": true } } }

지원되는 Amazon EKS APIs

지원되는 Amazon EKS APIs 및 구문은 다음과 같습니다.

  • CreateCluster

    • 요청 구문

    • 응답 구문

      eks:createCluster 서비스 통합을 사용하여 Amazon EKS 클러스터를 생성하면 IAM 역할이 관리자로 Kubernetes RBAC 권한 부여 테이블에 추가됩니다(시스템:마스터 권한 사용). 처음에는 해당 IAM 개체만 Kubernetes API 서버에 호출할 수 있습니다. 자세한 내용은 다음을 참조하세요.

      AmazonEKS은 사용자를 대신하여 다른 서비스를 호출하는 데 EKS 필요한 권한이 포함된 서비스 연결 역할을 사용합니다. 이러한 서비스 연결 역할이 계정에 아직 없는 경우 Step Functions에서 사용하는 IAM 역할에 iam:CreateServiceLinkedRole 권한을 추가해야 합니다. 자세한 내용은 Amazon EKS 사용 설명서서비스 연결 역할 사용을 참조하세요.

      Step Functions에서 사용하는 IAM 역할에는 클러스터 IAM 역할을 Amazon에 전달할 수 있는 iam:PassRole 권한이 있어야 합니다EKS. 자세한 내용은 Amazon 사용 설명서의 Amazon EKS 클러스터 IAM 역할을 참조하세요. EKS

  • DeleteCluster

    • 요청 구문

    • 응답 구문

      클러스터를 삭제하기 전에 Fargate 프로필이나 노드 그룹을 삭제해야 합니다.

  • CreateFargateProfile

    • 요청 구문

    • 응답 구문

      AmazonEKS은 사용자를 대신하여 다른 서비스를 호출하는 데 EKS 필요한 권한이 포함된 서비스 연결 역할을 사용합니다. 이러한 서비스 연결 역할이 계정에 아직 없는 경우 Step Functions에서 사용하는 IAM 역할에 iam:CreateServiceLinkedRole 권한을 추가해야 합니다. 자세한 내용은 Amazon EKS 사용 설명서서비스 연결 역할 사용을 참조하세요.

      Amazon EKS on Fargate는 일부 리전에서 사용하지 못할 수 있습니다. 리전 가용성에 대한 자세한 내용은 Amazon EKS 사용 설명서Fargate 섹션을 참조하세요.

      Step Functions에서 사용하는 IAM 역할에는 포드 실행 IAM 역할을 Amazon에 전달할 수 있는 iam:PassRole 권한이 있어야 합니다EKS. 자세한 내용은 Amazon EKS 사용 설명서포드 실행 역할을 참조하세요.

  • DeleteFargateProfile

  • CreateNodegroup

    • 요청 구문

    • 응답 구문

      AmazonEKS은 사용자를 대신하여 다른 서비스를 호출하는 데 EKS 필요한 권한이 포함된 서비스 연결 역할을 사용합니다. 이러한 서비스 연결 역할이 계정에 아직 없는 경우 Step Functions에서 사용하는 IAM 역할에 iam:CreateServiceLinkedRole 권한을 추가해야 합니다. 자세한 내용은 Amazon EKS 사용 설명서서비스 연결 역할 사용을 참조하세요.

      Step Functions에서 사용하는 IAM 역할에는 노드 IAM 역할을 Amazon에 전달할 수 있는 iam:PassRole 권한이 있어야 합니다EKS. 자세한 내용은 Amazon EKS 사용 설명서서비스 연결 역할 사용을 참조하세요.

  • DeleteNodegroup

다음은 Amazon EKS 클러스터를 Task 생성하는를 포함합니다.

{ "StartAt": "CreateCluster.sync", "States": { "CreateCluster.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:createCluster.sync", "Parameters": { "Name": "MyCluster", "ResourcesVpcConfig": { "SubnetIds": [ "subnet-053e7c47012341234", "subnet-027cfea4b12341234" ] }, "RoleArn": "arn:aws:iam::123456789012:role/MyEKSClusterRole" }, "End": true } } }

다음은 Amazon EKS 클러스터를 삭제하는 Task 상태를 포함합니다.

{ "StartAt": "DeleteCluster.sync", "States": { "DeleteCluster.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:deleteCluster.sync", "Parameters": { "Name": "MyCluster" }, "End": true } } }

다음에는 Fargate 프로필을 만드는 Task 상태가 포함됩니다.

{ "StartAt": "CreateFargateProfile.sync", "States": { "CreateFargateProfile.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:createFargateProfile.sync", "Parameters": { "ClusterName": "MyCluster", "FargateProfileName": "MyFargateProfile", "PodExecutionRoleArn": "arn:aws:iam::123456789012:role/MyFargatePodExecutionRole", "Selectors": [{ "Namespace": "my-namespace", "Labels": { "my-label": "my-value" } }] }, "End": true } } }

다음에는 Fargate 프로필을 삭제하는 Task 상태가 포함됩니다.

{ "StartAt": "DeleteFargateProfile.sync", "States": { "DeleteFargateProfile.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:deleteFargateProfile.sync", "Parameters": { "ClusterName": "MyCluster", "FargateProfileName": "MyFargateProfile" }, "End": true } } }

다음에는 노드 그룹을 만드는 Task 상태가 포함됩니다.

{ "StartAt": "CreateNodegroup.sync", "States": { "CreateNodegroup.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:createNodegroup.sync", "Parameters": { "ClusterName": "MyCluster", "NodegroupName": "MyNodegroup", "NodeRole": "arn:aws:iam::123456789012:role/MyNodeInstanceRole", "Subnets": ["subnet-09fb51df01234", "subnet-027cfea4b1234"] }, "End": true } } }

다음에는 노드 그룹을 삭제하는 Task 상태가 포함됩니다.

{ "StartAt": "DeleteNodegroup.sync", "States": { "DeleteNodegroup.sync": { "Type": "Task", "Resource": "arn:aws:states:::eks:deleteNodegroup.sync", "Parameters": { "ClusterName": "MyCluster", "NodegroupName": "MyNodegroup" }, "End": true } } }

권한

eks:createCluster 서비스 통합을 사용하여 Amazon EKS 클러스터를 생성하면 IAM 권한이 있는 관리자로 역할이 Kubernetes RBAC 권한 부여 테이블에 추가됩니다system:masters. 처음에는 해당 IAM 개체만 Kubernetes API 서버에 호출할 수 있습니다. 예를 들어 Step Functions 상태 시스템과 동일한 역할을 맡거나 추가 IAM엔터티에 권한을 부여하도록 Kubernetes를 구성하지 않는 한 Kubectl을 사용하여 Kubernetes API 서버와 상호 작용할 수 없습니다. 자세한 내용은 Amazon EKS 사용 설명서클러스터의 사용자 또는 IAM 역할 관리를 참조하세요.

사용자 또는 역할과 같은 추가 IAM엔터티에 대한 권한을 kube-system 네임스페이스의 aws-authConfigMap에 추가하여 추가할 수 있습니다. Step Functions에서 클러스터를 만드는 경우 eks:call 서비스 통합을 사용합니다.

다음은를 생성하고 사용자 aws-auth ConfigMaparn:aws:iam::123456789012:user/my-user IAM 역할에 system:masters 권한을 부여하는 Task 상태를 포함합니다arn:aws:iam::123456789012:role/my-role.

{ "StartAt": "Add authorized user", "States": { "Add authorized user": { "Type": "Task", "Resource": "arn:aws:states:::eks:call", "Parameters": { "ClusterName": "MyCluster", "CertificateAuthority": "LS0tLS1CRUd...UtLS0tLQo=", "Endpoint": "https://444455556666.yl4.us-east-1.eks.amazonaws.com", "Method": "POST", "Path": "/api/v1/namespaces/kube-system/configmaps", "RequestBody": { "apiVersion": "v1", "kind": "ConfigMap", "metadata": { "name": "aws-auth", "namespace": "kube-system" }, "data": { "mapUsers": "[{ \"userarn\": \"arn:aws:iam::123456789012:user/my-user\", \"username\": \"my-user\", \"groups\": [ \"system:masters\" ] } ]", "mapRoles": "[{ \"rolearn\": \"arn:aws:iam::123456789012:role/my-role\", \"username\": \"my-role\", \"groups\": [ \"system:masters\" ] } ]" } } }, "End": true } }
참고

와 같은 /service-role/ 경로가 포함된 형식으로 표시되는 ARN IAM 역할의를 볼 수 있습니다arn:aws:iam::123456789012:role/service-role/my-role. aws-auth에 역할을 나열할 때 이 service-role 경로 토큰을 포함해서는 안 됩니다.

클러스터를 처음 만들 때는 aws-auth ConfigMap이 존재하지 않지만 Fargate 프로필을 만들면 자동으로 추가됩니다. aws-auth의 현재 값을 검색하고 추가 권한을 추가하고, 새 버전을 PUT할 수 있습니다. 일반적으로 Fargate 프로필 전에 aws-auth를 만드는 것이 더 쉽습니다.

클러스터가 Step Functions 외부에서 생성된 경우 Kubernetes 서버와 통신하도록 kubectl을 구성할 수 있습니다. API 그런 다음 kubectl apply -f aws-auth.yaml을 사용하여 새 aws-auth ConfigMap을 만들거나 kubectl edit -n kube-system configmap/aws-auth를 사용하여 이미 있는 서버를 편집합니다. 자세한 내용은 다음을 참조하세요.

IAM 역할에 Kubernetes에 대한 충분한 권한이 없는 경우 eks:call 또는 eks:runJob 서비스 통합이 실패하고 다음 오류가 발생합니다.

Error: EKS.401 Cause: { "ResponseBody": { "kind": "Status", "apiVersion": "v1", "metadata": {}, "status": "Failure", "message": "Unauthorized", "reason": "Unauthorized", "code": 401 }, "StatusCode": 401, "StatusText": "Unauthorized" }

IAM Amazon 호출 정책 EKS

다음 예제 템플릿은가 상태 시스템 정의의 리소스를 기반으로 IAM 정책을 AWS Step Functions 생성하는 방법을 보여줍니다. 자세한 내용은 Step Functions가 통합 서비스용 IAM 정책을 생성하는 방법Step Functions에서 서비스 통합 패턴 검색 단원을 참조하세요.

CreateCluster

리소스

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:CreateCluster" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "eks:DescribeCluster", "eks:DeleteCluster" ], "Resource": "arn:aws:eks:sa-east-1:444455556666:cluster/*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::444455556666:role/StepFunctionsSample-EKSClusterManag-EKSServiceRole-ANPAJ2UCCR6DPCEXAMPLE" ], "Condition": { "StringEquals": { "iam:PassedToService": "eks.amazonaws.com" } } } ] }

CreateNodeGroup

리소스

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:DescribeSubnets", "eks:CreateNodegroup" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "eks:DescribeNodegroup", "eks:DeleteNodegroup" ], "Resource": "arn:aws:eks:sa-east-1:444455556666:nodegroup/*" }, { "Effect": "Allow", "Action": [ "iam:GetRole", "iam:ListAttachedRolePolicies" ], "Resource": "arn:aws:iam::444455556666:role/*" }, { "Effect": "Allow", "Action": "iam:PassRole", "Resource": [ "arn:aws:iam::444455556666:role/StepFunctionsSample-EKSClusterMan-NodeInstanceRole-ANPAJ2UCCR6DPCEXAMPLE" ], "Condition": { "StringEquals": { "iam:PassedToService": "eks.amazonaws.com" } } } ] }

DeleteCluster

리소스

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DeleteCluster", "eks:DescribeCluster" ], "Resource": [ "arn:aws:eks:sa-east-1:444455556666:cluster/ExampleCluster" ] } ] }

DeleteNodegroup

리소스

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "eks:DeleteNodegroup", "eks:DescribeNodegroup" ], "Resource": [ "arn:aws:eks:sa-east-1:444455556666:nodegroup/ExampleCluster/ExampleNodegroup/*" ] } ] }

Step FunctionsEKS에서 Amazon을 사용하는 방법에 대한 자세한 내용은 섹션을 참조하세요Step Functions를 사용하여 Amazon EKS 클러스터 생성 및 관리.