

# Amazon ECS 작업 정의 예제
<a name="example_task_definitions"></a>

예제와 코드 조각을 복사하여 고유한 작업 정의를 생성할 수 있습니다.

예제를 복사한 다음 클래식 콘솔에서 **JSON을 통한 구성** 옵션을 사용할 때 붙여넣을 수 있습니다. 계정 ID 사용과 같은 예제를 사용자 지정해야 합니다. 이 코드 조각을 작업 정의 JSON에 포함할 수 있습니다. 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md) 및 [Fargate에 대한 Amazon ECS 태스크 정의 파라미터](task_definition_parameters.md)(을)를 참조하세요.

태스크 정의에 대한 추가 예제는 GitHub의 [AWS 샘플 태스크 정의](https://github.com/aws-samples/aws-containers-task-definitions)를 참조하세요.

**Topics**
+ [

## 웹 서버
](#example_task_definition-webserver)
+ [

## `splunk` 로그 드라이버
](#example_task_definition-splunk)
+ [

## `fluentd` 로그 드라이버
](#example_task_definition-fluentd)
+ [

## `gelf` 로그 드라이버
](#example_task_definition-gelf)
+ [

## 외부 인스턴스의 워크로드
](#ecs-anywhere-runtask)
+ [

## Amazon ECR 이미지 및 작업 정의 IAM 역할
](#example_task_definition-iam)
+ [

## 명령의 진입점
](#example_task_definition-ping)
+ [

## 컨테이너 종속성
](#example_task_definition-containerdependency)
+ [

## 작업 정의의 볼륨
](#volume_sample_task_defs)
+ [

## Windows 샘플 태스크 정의
](#windows_sample_task_defs)

## 웹 서버
<a name="example_task_definition-webserver"></a>

다음은 웹 서버를 설정하는 Fargate에서 Linux 컨테이너를 사용하는 태스크 정의 예제입니다.

```
{
   "containerDefinitions": [ 
      { 
         "command": [
            "/bin/sh -c \"echo '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
         ],
         "entryPoint": [
            "sh",
            "-c"
         ],
         "essential": true,
         "image": "public.ecr.aws/docker/library/httpd:2.4",
         "logConfiguration": { 
            "logDriver": "awslogs",
            "options": { 
               "awslogs-group" : "/ecs/fargate-task-definition",
               "awslogs-region": "us-east-1",
               "awslogs-stream-prefix": "ecs"
            }
         },
         "name": "sample-fargate-app",
         "portMappings": [ 
            { 
               "containerPort": 80,
               "hostPort": 80,
               "protocol": "tcp"
            }
         ]
      }
   ],
   "cpu": "256",
   "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
   "family": "fargate-task-definition",
   "memory": "512",
   "networkMode": "awsvpc",
   "runtimePlatform": {
        "operatingSystemFamily": "LINUX"
    },
   "requiresCompatibilities": [ 
       "FARGATE" 
    ]
}
```

다음은 웹 서버를 설정하는 Fargate에서 Windows 컨테이너를 사용하는 태스크 정의 예제입니다.

```
{
    "containerDefinitions": [
        {
            "command": ["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "essential": true,
            "cpu": 2048,
            "memory": 4096,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "name": "sample_windows_app",
            "portMappings": [
                {
                    "hostPort": 80,
                    "containerPort": 80,
                    "protocol": "tcp"
                }
            ]
        }
    ],
    "memory": "4096",
    "cpu": "2048",
    "networkMode": "awsvpc",
    "family": "windows-simple-iis-2019-core",
    "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
    "runtimePlatform": {"operatingSystemFamily": "WINDOWS_SERVER_2019_CORE"},
    "requiresCompatibilities": ["FARGATE"]
}
```

## `splunk` 로그 드라이버
<a name="example_task_definition-splunk"></a>

다음 코드 조각에서는 로그를 원격 서비스로 보내는 작업 정의에서 `splunk` 로그 드라이버를 사용하는 방법을 보여줍니다. Splunk 토큰 파라미터는 민감한 데이터로 취급될 수 있으므로 암호 옵션으로 지정됩니다. 자세한 내용은 [Amazon ECS 컨테이너로 민감한 데이터 전달](specifying-sensitive-data.md) 섹션을 참조하세요.

```
"containerDefinitions": [{
		"logConfiguration": {
			"logDriver": "splunk",
			"options": {
				"splunk-url": "https://cloud.splunk.com:8080",
				"tag": "tag_name",
			},
			"secretOptions": [{
				"name": "splunk-token",
				"valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:splunk-token-KnrBkD"
}],
```

## `fluentd` 로그 드라이버
<a name="example_task_definition-fluentd"></a>

다음 코드 조각에서는 로그를 원격 서비스로 보내는 작업 정의에서 `fluentd` 로그 드라이버를 사용하는 방법을 보여줍니다. `fluentd-address` 값은 민감한 데이터로 취급될 수 있으므로 암호 옵션으로 지정됩니다. 자세한 내용은 [Amazon ECS 컨테이너로 민감한 데이터 전달](specifying-sensitive-data.md) 섹션을 참조하세요.

```
"containerDefinitions": [{
	"logConfiguration": {
		"logDriver": "fluentd",
		"options": {
			"tag": "fluentd demo"
		},
		"secretOptions": [{
			"name": "fluentd-address",
			"valueFrom": "arn:aws:secretsmanager:region:aws_account_id:secret:fluentd-address-KnrBkD"
		}]
	},
	"entryPoint": [],
	"portMappings": [{
             "hostPort": 80,
             "protocol": "tcp",
             "containerPort": 80
             },
             {
		"hostPort": 24224,
		"protocol": "tcp",
		"containerPort": 24224
	}]
}],
```

## `gelf` 로그 드라이버
<a name="example_task_definition-gelf"></a>

다음 코드 조각에서는 Gelf 로그를 입력으로 사용해 Logstash를 실행 중인 원격 호스트로 로그를 보내는 작업 정의에서 `gelf` 로그 드라이버를 사용하는 방법을 보여줍니다. 자세한 내용은 [logConfiguration](task_definition_parameters.md#ContainerDefinition-logConfiguration) 섹션을 참조하세요.

```
"containerDefinitions": [{
	"logConfiguration": {
		"logDriver": "gelf",
		"options": {
			"gelf-address": "udp://logstash-service-address:5000",
			"tag": "gelf task demo"
		}
	},
	"entryPoint": [],
	"portMappings": [{
			"hostPort": 5000,
			"protocol": "udp",
			"containerPort": 5000
		},
		{
			"hostPort": 5000,
			"protocol": "tcp",
			"containerPort": 5000
		}
	]
}],
```

## 외부 인스턴스의 워크로드
<a name="ecs-anywhere-runtask"></a>

Amazon ECS 태스크 정의를 등록할 때는 `requiresCompatibilities` 파라미터를 사용하고 태스크 정의가 호환되는지 확인하는 `EXTERNAL`을 지정하여 외부 인스턴스에서 Amazon ECS 워크로드를 실행할 때 사용합니다. 콘솔을 사용하여 작업 정의를 등록하는 경우 JSON 편집기를 사용해야 합니다. 자세한 내용은 [콘솔을 사용하여 Amazon ECS 작업 정의 생성](create-task-definition.md) 섹션을 참조하세요.

**중요**  
태스크에 태스크 실행 IAM 역할이 필요한 경우 해당 역할이 태스크 정의에 지정되어 있는지 확인합니다.

워크로드를 배포할 때 서비스를 생성하거나 독립 실행형 태스크를 실행하는 경우 `EXTERNAL` 시작 유형을 사용합니다.

다음은 예제 태스크 정의입니다.

------
#### [ Linux ]

```
{
	"requiresCompatibilities": [
		"EXTERNAL"
	],
	"containerDefinitions": [{
		"name": "nginx",
		"image": "public.ecr.aws/nginx/nginx:latest",
		"memory": 256,
		"cpu": 256,
		"essential": true,
		"portMappings": [{
			"containerPort": 80,
			"hostPort": 8080,
			"protocol": "tcp"
		}]
	}],
	"networkMode": "bridge",
	"family": "nginx"
}
```

------
#### [ Windows ]

```
{
	"requiresCompatibilities": [
		"EXTERNAL"
	],
	"containerDefinitions": [{
		"name": "windows-container",
		"image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
		"memory": 256,
		"cpu": 512,
		"essential": true,
		"portMappings": [{
			"containerPort": 80,
			"hostPort": 8080,
			"protocol": "tcp"
		}]
	}],
	"networkMode": "bridge",
	"family": "windows-container"
}
```

------

## Amazon ECR 이미지 및 작업 정의 IAM 역할
<a name="example_task_definition-iam"></a>

다음 코드 조각에서는 `123456789012.dkr.ecr.us-west-2.amazonaws.com` 레지스트리의 `v1` 태그를 포함하는 `aws-nodejs-sample`이라는 Amazon ECR 이미지를 사용합니다. 이 태스크의 컨테이너는 IAM 역할로부터 `arn:aws:iam::123456789012:role/AmazonECSTaskS3BucketRole` 권한을 상속합니다. 자세한 내용은 [Amazon ECS 작업 IAM 역할](task-iam-roles.md) 섹션을 참조하세요.

```
{
    "containerDefinitions": [
        {
            "name": "sample-app",
            "image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/aws-nodejs-sample:v1",
            "memory": 200,
            "cpu": 10,
            "essential": true
        }
    ],
    "family": "example_task_3",
    "taskRoleArn": "arn:aws:iam::123456789012:role/AmazonECSTaskS3BucketRole"
}
```

## 명령의 진입점
<a name="example_task_definition-ping"></a>

다음 코드 조각에서는 진입점과 명령 인수를 사용하는 Docker 컨테이너용 구문을 보여줍니다. 이 컨테이너는 `example.com`을 네 번 ping한 후 종료합니다.

```
{
    "containerDefinitions": [
        {
            "memory": 32,
            "essential": true,
            "entryPoint": ["ping"],
            "name": "alpine_ping",
            "readonlyRootFilesystem": true,
            "image": "alpine:3.4",
            "command": [
                "-c",
                "4",
                "example.com"
            ],
            "cpu": 16
        }
    ],
    "family": "example_task_2"
}
```

## 컨테이너 종속성
<a name="example_task_definition-containerdependency"></a>

이 코드 조각에서는 컨테이너 종속성이 지정된 여러 컨테이너가 있는 작업 정의의 구문을 보여줍니다. 다음 태스크 정의에서 `envoy` 컨테이너를 시작하기 전에 `app` 컨테이너가 필요한 컨테이너 상태 확인 파라미터에 의해 정상 상태에 도달해야 합니다. 자세한 내용은 [컨테이너 종속성](task_definition_parameters.md#container_definition_dependson) 섹션을 참조하세요.

```
{
  "family": "appmesh-gateway",
  "runtimePlatform": {
        "operatingSystemFamily": "LINUX"
  },
  "proxyConfiguration":{
      "type": "APPMESH",
      "containerName": "envoy",
      "properties": [
          {
              "name": "IgnoredUID",
              "value": "1337"
          },
          {
              "name": "ProxyIngressPort",
              "value": "15000"
          },
          {
              "name": "ProxyEgressPort",
              "value": "15001"
          },
          {
              "name": "AppPorts",
              "value": "9080"
          },
          {
              "name": "EgressIgnoredIPs",
              "value": "169.254.170.2,169.254.169.254"
          }
      ]
  },
  "containerDefinitions": [
    {
      "name": "app",
      "image": "application_image",
      "portMappings": [
        {
          "containerPort": 9080,
          "hostPort": 9080,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "dependsOn": [
        {
          "containerName": "envoy",
          "condition": "HEALTHY"
        }
      ]
    },
    {
      "name": "envoy",
      "image": "840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.15.1.0-prod",
      "essential": true,
      "environment": [
        {
          "name": "APPMESH_VIRTUAL_NODE_NAME",
          "value": "mesh/meshName/virtualNode/virtualNodeName"
        },
        {
          "name": "ENVOY_LOG_LEVEL",
          "value": "info"
        }
      ],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "echo hello"
        ],
        "interval": 5,
        "timeout": 2,
        "retries": 3
      }    
    }
  ],
  "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc"
}
```

## 작업 정의의 볼륨
<a name="volume_sample_task_defs"></a>

다음을 사용하여 작업에서 볼륨을 지정하는 방법을 이해합니다.
+ Amazon EBS 볼륨을 구성하는 방법에 대한 자세한 내용은 [Amazon ECS 배포 시 Amazon EBS 볼륨 구성 지정](configure-ebs-volume.md) 섹션을 참조하세요.
+ Amazon EFS 볼륨을 구성하는 방법에 대한 자세한 내용은 [콘솔을 사용하여 Amazon ECS에 대한 Amazon EFS 파일 시스템 구성](tutorial-efs-volumes.md) 섹션을 참조하세요.
+ FSx for Windows File Server 볼륨을 구성하는 방법에 대한 자세한 내용은 [Amazon ECS에 대한 FSx for Windows File Server 파일 시스템을 구성하는 방법 알아보기](tutorial-wfsx-volumes.md) 섹션을 참조하세요.
+ Docker 볼륨을 구성하는 방법에 대한 자세한 내용은 [Amazon ECS용 Docker 볼륨 예제](docker-volume-examples.md) 섹션을 참조하세요.
+ 바인드 탑재를 구성하는 방법에 대한 자세한 내용은 [Amazon ECS에 대한 바인드 탑재 예제](bind-mount-examples.md) 섹션을 참조하세요.

## Windows 샘플 태스크 정의
<a name="windows_sample_task_defs"></a>

Amazon ECS에서 Windows 컨테이너를 시작하는 데 도움을 줄 샘플 태스크 정의는 아래와 같습니다.

**Example Windows용 Amazon ECS 콘솔 샘플 애플리케이션**  
다음 태스크 정의는 Amazon ECS 처음 실행 마법사에서 생성되는 Amazon ECS 콘솔 샘플 애플리케이션으로서 `microsoft/iis` Windows 컨테이너 이미지를 사용하도록 이식되었습니다.  

```
{
  "family": "windows-simple-iis",
  "containerDefinitions": [
    {
      "name": "windows_sample_app",
      "image": "mcr.microsoft.com/windows/servercore/iis",
      "cpu": 1024,
      "entryPoint":["powershell", "-Command"],
      "command":["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
      "portMappings": [
        {
          "protocol": "tcp",
          "containerPort": 80
        }
      ],
      "memory": 1024,
      "essential": true
    }
  ],
  "networkMode": "awsvpc",
  "memory": "1024",
  "cpu": "1024"
}
```