Skip to content

Commit

Permalink
Merge pull request #19 from toricls/check-task-status
Browse files Browse the repository at this point in the history
Add task status check
  • Loading branch information
toricls authored Apr 13, 2021
2 parents 9b57462 + 37ac4be commit 879bdbb
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 13 deletions.
20 changes: 13 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -87,26 +87,32 @@ Note that the `Condition` element of the IAM policy is not currently supported t
The result means your IAM user/role is allowed to do `ssm:StartSession` action to the ECS task. This check item won't block you to use ECS Exec, but we recommend you to limit access to the `ssm:StartSession` API, from the security and the principle of least privilege perspectives. See [the ECS official documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-limit-access-start-session) for further details.
Note that the `Condition` element of the IAM policy is not currently supported to evaluate by `check-ecs-exec.sh`.

8. **_🔴 Platform Version | 1.3.0 (Required: >= 1.4.0)_**
8. **_🔴 Task Status | DEACTIVATING or STOPPING or DEPROVISIONING or STOPPED_**
Your ECS task has already stopped, or is shutting down. ECS Exec requires the task is in the `RUNNING` state. Restart your ECS task if it's a standalone task, or wait for another task if it's a part of an ECS service. See also [the Task lifecycle](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle.html) in the ECS documentation for more details.

9. **_🟡 Task Status | PROVISIONING or ACTIVATING or PENDING_**
Your ECS task is in the middle of its starting process. ECS Exec requires the task is in the `RUNNING` state. Wait few more seconds for the task to be ready. See also [the Task lifecycle](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle.html) in the ECS documentation for more details.

10. **_🔴 Platform Version | 1.3.0 (Required: >= 1.4.0)_**
On AWS Fargate, `ECS Exec` requires the Platform version 1.4.0 or newer. If your ECS task is part of an ECS service, then you can update the platform version by specifying the `PlatformVersion` parameter for the `UpdateService` API. If your ECS task is a standalone task, then you need to re-run the ECS task with the `PlatformVersion` parameter specified for the `RunTask` API. See also [the migration guide from the previous PVs](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html#platform-version-migration).

9. **_🔴 ECS Agent Version | x.y.z (Required: >= 1.50.2)_**
11. **_🔴 ECS Agent Version | x.y.z (Required: >= 1.50.2)_**
You need to update the version of the ECS Container Agent for your EC2 instance where your ECS task runs. See [the ECS official documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html) for the details and how to update.

10. **_🔴 Exec Enabled for Task | NO_**
12. **_🔴 Exec Enabled for Task | NO_**
You need to enable the ECS Exec feature for your ECS service or your ECS standalone task. If your ECS task is part of an ECS service, then you can update the ECS by specifying the `EnableExecuteCommand` parameter for the `UpdateService` API. If your ECS task is a standalone task, then you need to re-run the ECS task with the `EnableExecuteCommand` parameter specified for the `RunTask` API.

11. **_🔴 Managed Agent Status | STOPPED (Reason: stopped-reason-here)_**
13. **_🔴 Managed Agent Status | STOPPED (Reason: stopped-reason-here)_**
The managed agent for a container in your Task has stopped for some reasons. If you see this error again and again even after re-running your ECS task, then make sure you have other results from `check-ecs-exec.sh` are all green.

12. **_🟡 Init Process Enabled | Disabled_**
14. **_🟡 Init Process Enabled | Disabled_**
This check item won't block you to use ECS Exec, but we recommend you to add the `initProcessEnabled` flag to your ECS task definition for each container to avoid having orphaned and zombie processes. See the "Considerations for using ECS Exec" in [the ECS official documentation](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-considerations) for more details.

13. **_🔴 EC2 or Task Role | Not Configured"_ or _{serviceName}:{ActionName}: implicitDeny_**
15. **_🔴 EC2 or Task Role | Not Configured"_ or _{serviceName}:{ActionName}: implicitDeny_**
Your ECS task needs a task role or an instance role of the underlying EC2 instance with some permissions for using SSM Session Manager at least. See the [IAM permissions required for ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-enabling-and-using) section and the [Enabling logging and auditing in your tasks and services](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html#ecs-exec-logging) section in the official documentation for the details.
Note that the `Condition` element of the IAM policy is not currently supported to evaluate by `check-ecs-exec.sh`.

14. **_🟡 SSM PrivateLink "com.amazonaws.(region).ssmmessages" not found_**
16. **_🟡 SSM PrivateLink "com.amazonaws.(region).ssmmessages" not found_**
The `check-ecs-exec.sh` found one or more VPC endpoints configured in the VPC for your task, so you **may** want to add an additional SSM PrivateLink for your VPC. Make sure your ECS task has proper outbound internet connectivity, and if it doesn't, then you **need** to configure an additional SSM PrivateLink for your VPC.

## Security
Expand Down
25 changes: 19 additions & 6 deletions check-ecs-exec.sh
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,20 @@ else
fi
printf "${ssmSessionEvalResult}\n"

# 3. Check the launch type, platform version, ecs-agent version
# 3. Check the task is in RUNNING state
printf "${COLOR_DEFAULT} Task Status | "
taskStatus=$(echo "${describedTaskJson}" | jq -r ".tasks[0].lastStatus")
stoppedReason=$(echo "${describedTaskJson}" | jq -r ".tasks[0].stoppedReason")
case "${taskStatus}" in
RUNNING ) printf "${COLOR_GREEN}${taskStatus}";;
PROVISIONING|ACTIVATING|PENDING ) printf "${COLOR_YELLOW}${taskStatus}";;
DEACTIVATING|STOPPING|DEPROVISIONING ) printf "${COLOR_RED}${taskStatus}";;
STOPPED ) printf "${COLOR_RED}${taskStatus} (${stoppedReason})";;
* ) printf "${COLOR_RED}${taskStatus}";;
esac
printf "${COLOR_DEFAULT}\n"

# 4. Check the launch type, platform version, ecs-agent version
launchType=$(echo "${describedTaskJson}" | jq -r ".tasks[0].launchType")
describedContainerInstanceJson=""
printf "${COLOR_DEFAULT} Launch Type | "
Expand Down Expand Up @@ -333,7 +346,7 @@ else
printf "${COLOR_YELLOW}UNKNOWN\n"
fi

# 4. Check whether the `execute-command` option is enabled for the task
# 5. Check whether the `execute-command` option is enabled for the task
printf "${COLOR_DEFAULT} Exec Enabled for Task | "
if [[ "x${executeCommandEnabled}" = "xtrue" ]]; then
printf "${COLOR_GREEN}OK"
Expand All @@ -342,7 +355,7 @@ else
fi
printf "${COLOR_DEFAULT}\n"

# 5. Check the managed agents' status
# 6. Check the managed agents' status
printf "${COLOR_DEFAULT} Managed Agent Status | "
if [[ "x${executeCommandEnabled}" = "xfalse" ]]; then
printf "${COLOR_YELLOW}SKIPPED\n"
Expand All @@ -365,7 +378,7 @@ else
done
fi

# 6. Check the "initProcessEnabled" flag added in the task definition (yellow)
# 7. Check the "initProcessEnabled" flag added in the task definition (yellow)
taskDefArn=$(echo "${describedTaskJson}" | jq -r ".tasks[0].taskDefinitionArn")
taskDefJson=$(${AWS_CLI_BIN} ecs describe-task-definition \
--task-definition "${taskDefArn}" \
Expand All @@ -385,7 +398,7 @@ for enabled in $initEnabledList; do
idx=$((idx+1))
done

# 7. Check the task role permissions
# 8. Check the task role permissions
taskRoleArn=$(echo "${taskDefJson}" | jq -r ".taskDefinition.taskRoleArn")

hasRole=true
Expand Down Expand Up @@ -515,7 +528,7 @@ else
fi
fi

# 8. Check existing VPC Endpoints (PrivateLinks) in the task VPC.
# 9. Check existing VPC Endpoints (PrivateLinks) in the task VPC.
# If there is any VPC Endpoints configured for the task VPC, we assume you would need an additional SSM PrivateLink to be configured. (yellow)
# TODO: In the ideal world, the script should simply check if the task can reach to the internet or not :)
taskNetworkingAttachment=$(echo "${describedTaskJson}" | jq -r ".tasks[0].attachments[0]")
Expand Down

0 comments on commit 879bdbb

Please sign in to comment.