EC2 Image Builder를 사용하여 사용자 지정된 Amazon ECS 최적화 AMI 구축
AWS에서는 Amazon ECS 최적화 AMI가 컨테이너 워크로드를 실행하기 위한 요구 사항 및 권장 사항으로 미리 구성되어 있으므로 이를 사용하도록 권장합니다. 소프트웨어를 더 추가하기 위해 AMI를 사용자 지정해야 하는 경우가 있을 수 있습니다. 서버 이미지의 생성, 관리 및 배포를 위해 EC2 Image Builder를 사용할 수 있습니다. 계정에서 생성된 사용자 지정된 이미지에 대한 소유권은 사용자에게 있습니다. EC2 Image Builder 파이프라인을 사용하여 이미지에 대한 업데이트 및 시스템 패치를 자동화하거나 독립 실행형 명령을 사용하여 정의된 구성 리소스로 이미지를 생성할 수 있습니다.
이미지에 대한 레시피를 생성합니다. 레시피에는 상위 이미지와 추가 구성 요소가 포함됩니다. 또한 사용자 지정된 AMI를 배포하는 파이프라인도 생성합니다.
이미지에 대한 레시피를 생성합니다. Image Builder 이미지 레시피는 출력 AMI 이미지에 대해 원하는 구성을 생성하기 위해 기본 이미지 및 기본 이미지에 적용할 구성 요소를 정의하는 문서입니다. 또한 사용자 지정된 AMI를 배포하는 파이프라인도 생성합니다. 자세한 내용은 EC2 Image Builder 사용 설명서의 How EC2 Image Builder works를 참조하세요.
EC2 Image Builder에서 다음과 같은 Amazon ECS 최적화 AMI 중 하나를 '상위 이미지'로 사용하는 것이 좋습니다.
Linux
-
Amazon ECS 최적화 AL2023 x86
-
Amazon ECS 최적화 Amazon Linux 2023(arm64) AMI
-
Amazon ECS 최적화 Amazon Linux 2 커널 5 AMI
-
Amazon ECS 최적화 Amazon Linux 2 x86 AMI
-
Windows
-
Amazon ECS 최적화 Windows 2022 Full x86
-
Amazon ECS 최적화 Windows 2022 Core x86
-
Amazon ECS 최적화 Windows 2019 Full x86
-
Amazon ECS 최적화 Windows 2019 Core x86
-
Amazon ECS 최적화 Windows 2016 Full x86
-
'사용 가능한 최신 OS 버전 사용'을 선택하는 것이 좋습니다. 파이프라인은 상위 이미지의 시맨틱 버전 관리를 사용하므로 자동으로 예약된 작업에서 종속성 업데이트를 감지하는 데 도움이 됩니다. 자세한 내용은 EC2 Image Builder 사용 설명서의 Semantic versioning을 참조하세요.
AWS에서는 보안 패치와 새 컨테이너 에이전트 버전을 사용해 Amazon ECS 최적화 AMI 이미지를 정기적으로 업데이트합니다. 이미지 레시피에서 AMI ID를 상위 이미지로 사용하는 경우 상위 이미지에 대한 업데이트를 정기적으로 확인해야 합니다. 업데이트가 있는 경우 업데이트된 AMI를 사용하여 레시피의 새 버전을 생성해야 합니다. 그러면 사용자 지정 이미지가 상위 이미지의 최신 버전을 통합됩니다. 새로 생성된 AMI로 Amazon ECS 클러스터에서 EC2 인스턴스를 자동으로 업데이트하는 워크플로를 생성하는 방법에 대한 자세한 내용은 How to create an AMI hardening pipeline and automate updates to your ECS instance fleet
관리형 EC2 Image Builder 파이프라인을 통해 게시되는 상위 이미지의 Amazon 리소스 이름(ARN)을 지정할 수도 있습니다. Amazon은 관리형 파이프라인을 통해 Amazon ECS 최적화 AMI 이미지를 정기적으로 게시합니다. 이 이미지에는 퍼블릭 액세스가 가능합니다. 이미지에 액세스하려면 올바른 권한이 있어야 합니다. Image Builder 레시피에서 AMI 대신 이미지 ARN을 사용하는 경우 파이프라인은 실행될 때마다 상위 이미지의 최신 버전을 자동으로 사용합니다. 이 접근 방식을 사용하면 업데이트할 때마다 새 레시피 버전을 수동으로 생성할 필요가 없습니다.
코드형 인프라(IaC)에서 이미지 ARN 사용
EC2 Image Builder 콘솔 또는 코드형 인프라(예: AWS CloudFormation)나 AWS SDK를 사용하여 레시피를 구성할 수 있습니다. 레시피에서 상위 이미지를 지정하는 경우 EC2 AMI ID, Image Builder 이미지 ARN, AWS Marketplace 제품 ID 또는 컨테이너 이미지를 지정할 수 있습니다. AWS에서는 Amazon ECS 최적화 AMI의 AMI ID와 Image Builder 이미지 ARN을 모두 공개적으로 게시합니다. 다음은 이미지의 ARN 형식입니다.
arn:${Partition}:imagebuilder:${Region}:${Account}:image/${ImageName}/${ImageVersion}
ImageVersion
형식은 다음과 같습니다. major
, minor
, patch
를 최신 값으로 바꿉니다.
<
major
>.<minor
>.<patch
>
major
, minor
, patch
를 특정 값으로 바꾸거나 이미지의 버전 없는 ARN을 사용하여 파이프라인이 상위 이미지의 최신 버전을 사용해 최신 상태를 유지할 수 있습니다. 버전이 없는 ARN은 와일드카드 형식 'x.x.x'를 사용하여 이미지 버전을 나타냅니다. 이 접근 방식을 사용하면 Image Builder 서비스에서 이미지의 최신 버전을 자동으로 확인할 수 있습니다. 버전 없는 ARN을 사용하면 참조가 항상 사용 가능한 최신 이미지를 가리키므로 배포에서 이미지를 최신 상태로 유지하는 프로세스가 간소화됩니다. 콘솔에서 레시피를 생성하면 EC2 Image Builder는 상위 이미지의 ARN을 자동으로 식별합니다. IaC를 사용하여 레시피를 생성할 때 ARN을 식별하고 원하는 이미지 버전을 선택하거나 버전 없는 ARN을 사용하여 사용 가능한 최신 이미지를 표시해야 합니다. 기준에 맞는 이미지만 필터링하여 표시할 수 있도록 자동화된 스크립트를 생성하는 것이 좋습니다. 다음 Python 스크립트는 Amazon ECS 최적화 AMI 목록을 검색하는 방법을 보여줍니다.
스크립트는 두 개의 선택적 인수(owner
및 platform
, 기본값: 각각 'Amazon' 및 'Windows')를 허용합니다. 소유자 인수의 유효한 값은 Self
, Shared
, Amazon
및 ThirdParty
입니다. 플랫폼 인수의 유효한 값은 Windows
및 Linux
입니다. 예를 들어, owner
인수를 Amazon
으로 설정하고 platform
을 Linux
로 설정한 상태에서 스크립트를 실행하면 스크립트는 Amazon ECS 최적화 이미지를 포함하여 Amazon에서 게시한 이미지 목록을 생성합니다.
import boto3 import argparse def list_images(owner, platform): # Create a Boto3 session session = boto3.Session() # Create an EC2 Image Builder client client = session.client('imagebuilder') # Define the initial request parameters request_params = { 'owner': owner, 'filters': [ { 'name': 'platform', 'values': [platform] } ] } # Initialize the results list all_images = [] # Get the initial response with the first page of results response = client.list_images(**request_params) # Extract images from the response all_images.extend(response['imageVersionList']) # While 'nextToken' is present, continue paginating while 'nextToken' in response and response['nextToken']: # Update the token for the next request request_params['nextToken'] = response['nextToken'] # Get the next page of results response = client.list_images(**request_params) # Extract images from the response all_images.extend(response['imageVersionList']) return all_images def main(): # Initialize the parser parser = argparse.ArgumentParser(description="List AWS images based on owner and platform") # Add the parameters/arguments parser.add_argument("--owner", default="Amazon", help="The owner of the images. Default is 'Amazon'.") parser.add_argument("--platform", default="Windows", help="The platform type of the images. Default is 'Windows'.") # Parse the arguments args = parser.parse_args() # Retrieve all images based on the provided owner and platform images = list_images(args.owner, args.platform) # Print the details of the images for image in images: print(f"Name: {image['name']}, Version: {image['version']}, ARN: {image['arn']}") if __name__ == "__main__": main()
AWS CloudFormation에서 이미지 ARN 사용
Image Builder 이미지 레시피는 출력 이미지의 의도한 구성을 달성하는 데 필요한 상위 이미지 및 구성 요소를 지정하는 청사진입니다. AWS::ImageBuilder::ImageRecipe
리소스를 사용합니다. ParentImage
값을 이미지 ARN으로 설정합니다. 파이프라인이 항상 최신 버전의 이미지를 사용하도록 원하는 이미지의 버전 없는 ARN을 사용합니다. 예를 들어 arn:aws:imagebuilder:us-east-1:aws:image/amazon-linux-2023-ecs-optimized-x86/x.x.x
입니다. 다음 AWS::ImageBuilder::ImageRecipe
리소스 정의는 Amazon 관리형 이미지 ARN을 사용합니다.
ECSRecipe: Type: AWS::ImageBuilder::ImageRecipe Properties: Name: MyRecipe Version: '1.0.0' Components: - ComponentArn: [<The component arns of the image recipe>] ParentImage: "arn:aws:imagebuilder:us-east-1:aws:image/amazon-linux-2023-ecs-optimized-x86/x.x.x"
AWS::ImageBuilder::ImageRecipe
리소스에 대한 자세한 내용은 AWS CloudFormation 사용 설명서를 참조하세요.
AWS::ImageBuilder::ImagePipeline
리소스의 Schedule
속성을 설정하여 파이프라인에서 새 이미지의 생성을 자동화할 수 있습니다. 일정에는 시작 조건과 cron 표현식이 포함됩니다. 자세한 내용은 AWS CloudFormation 사용 설명서의 AWS::ImageBuilder::ImagePipeline
를 참조하세요.
다음 AWS::ImageBuilder::ImagePipeline
예제에서 파이프라인은 매일 오전 10시 협정 세계시(UTC)에 빌드를 실행합니다. 다음 Schedule
값을 설정합니다.
PipelineExecutionStartCondition
를EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE
으로 설정합니다. 빌드는 시맨틱 버전에서 와일드카드 'x'를 사용하는 상위 이미지나 구성 요소와 같은 종속 리소스가 업데이트된 경우에만 시작됩니다. 이렇게 하면 빌드는 해당 리소스의 최신 업데이트를 통합합니다.-
ScheduleExpression을 cron 표현식
(0 10 * * ? *)
로 설정합니다.
ECSPipeline: Type: AWS::ImageBuilder::ImagePipeline Properties: Name: my-pipeline ImageRecipeArn: <arn of the recipe you created in previous step> InfrastructureConfigurationArn: <ARN of the infrastructure configuration associated with this image pipeline> Schedule: PipelineExecutionStartCondition: EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE ScheduleExpression: 'cron(0 10 * * ? *)'
Terraform에서 이미지 ARN 사용
Terraform에서 파이프라인의 상위 이미지 및 일정을 지정하는 접근 방식은 AWS CloudFormation의 방식과 일관됩니다. aws_imagebuilder_image_recipe
리소스를 사용합니다. parent_image
값을 이미지 ARN으로 설정합니다. 파이프라인이 항상 최신 버전의 이미지를 사용하도록 원하는 이미지의 버전 없는 ARN을 사용합니다. 자세한 내용은 Terraform 설명서의 aws_imagebuilder_image_recipe
aws_imagebuilder_image_pipeline
resource
의 일정 구성 블록에서 schedule_expression
인수 값을 원하는 cron 표현식으로 설정하여 파이프라인 실행 빈도를 지정하고 pipeline_execution_start_condition
을 EXPRESSION_MATCH_AND_DEPENDENCY_UPDATES_AVAILABLE
로 설정합니다. 자세한 내용은 Terraform 설명서의 aws_imagebuilder_image_pipeline