{"id":31199106,"url":"https://github.com/sil-org/ecs-deploy","last_synced_at":"2025-09-20T08:03:24.392Z","repository":{"id":35642681,"uuid":"39917097","full_name":"sil-org/ecs-deploy","owner":"sil-org","description":"Simple shell script for initiating blue-green deployments on Amazon EC2 Container Service (ECS)","archived":false,"fork":false,"pushed_at":"2025-08-29T00:55:53.000Z","size":285,"stargazers_count":1976,"open_issues_count":0,"forks_count":475,"subscribers_count":37,"default_branch":"master","last_synced_at":"2025-09-10T11:35:18.263Z","etag":null,"topics":["aws-ecs","continuous-deployment","ecs","ecs-deploy"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sil-org.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2015-07-29T21:24:03.000Z","updated_at":"2025-09-09T08:28:55.000Z","dependencies_parsed_at":"2023-12-18T23:58:50.561Z","dependency_job_id":"19ae23ff-c1c5-44c7-905a-9d88dea93a35","html_url":"https://github.com/sil-org/ecs-deploy","commit_stats":{"total_commits":186,"total_committers":63,"mean_commits":"2.9523809523809526","dds":0.7795698924731183,"last_synced_commit":"7279ffb747d18034f276f3d171812d0f5910c0b9"},"previous_names":["sil-org/ecs-deploy"],"tags_count":50,"template":false,"template_full_name":null,"purl":"pkg:github/sil-org/ecs-deploy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sil-org%2Fecs-deploy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sil-org%2Fecs-deploy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sil-org%2Fecs-deploy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sil-org%2Fecs-deploy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sil-org","download_url":"https://codeload.github.com/sil-org/ecs-deploy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sil-org%2Fecs-deploy/sbom","scorecard":{"id":823732,"data":{"date":"2025-08-11","repo":{"name":"github.com/silinternational/ecs-deploy","commit":"0c9cfddf2648ce5e396a65822c245bfd2adeb119"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4.8,"checks":[{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:55: update your workflow using https://app.stepsecurity.io/secureworkflow/silinternational/ecs-deploy/ci.yml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:1: pin your Docker image by updating alpine:3.13 to alpine:3.13@sha256:469b6e04ee185740477efa44ed5bdd64a07bbdd6c7e5f5d169e540889597b911","Warn: pipCommand not pinned by hash: Dockerfile:4-5","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   1 containerImage dependencies pinned","Info:   0 out of   1 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/ci.yml:17"],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Branch-Protection","score":1,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'master'","Warn: 'force pushes' enabled on branch 'master'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'master'","Warn: 'stale review dismissal' is disabled on branch 'master'","Warn: required approving review count is 1 on branch 'master'","Warn: codeowners review is not required on branch 'master'","Warn: 'last push approval' is disabled on branch 'master'","Warn: no status checks found to merge onto branch 'master'","Info: PRs are required in order to make changes on branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T16:12:16.989Z","repository_id":35642681,"created_at":"2025-08-23T16:12:16.989Z","updated_at":"2025-08-23T16:12:16.989Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":276064355,"owners_count":25578999,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-20T02:00:10.207Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["aws-ecs","continuous-deployment","ecs","ecs-deploy"],"created_at":"2025-09-20T08:02:16.456Z","updated_at":"2025-09-20T08:03:24.348Z","avatar_url":"https://github.com/sil-org.png","language":"Shell","readme":"# ecs-deploy\n\n![Status for silinternational/ecs-deploy](https://github.com/silinternational/ecs-deploy/actions/workflows/ci.yml/badge.svg?branch=master)\n\nThis script uses the Task Definition and Service entities in Amazon's ECS to instigate an automatic blue/green deployment.\n\n## NOTE: Maintenance Only\n\n`ecs-deploy` is now in maintenance mode. In other words, we are considering it\n\"feature complete\" and will generally only consider PRs if they are bugfixes or\nare to add support for new AWS CLI features.\n\n## Usage\n\n    One of the following is required:\n        -n | --service-name     Name of service to deploy\n        -d | --task-definition  Name of task definition to deploy\n\n    Required arguments:\n        -k | --aws-access-key         AWS Access Key ID. May also be set as environment variable AWS_ACCESS_KEY_ID\n        -s | --aws-secret-key         AWS Secret Access Key. May also be set as environment variable AWS_SECRET_ACCESS_KEY\n        -r | --region                 AWS Region Name. May also be set as environment variable AWS_DEFAULT_REGION\n        -p | --profile                AWS Profile to use - If you set this aws-access-key, aws-secret-key and region are not needed\n           | --aws-instance-profile   Use the IAM role associated with the current AWS instance. Can only be used from within a running AWS instance. If you set this, aws-access-key and aws-secret-key are not needed\n        -c | --cluster                Name of ECS cluster\n        -n | --service-name           Name of service to deploy\n        -i | --image                  Name of Docker image to run, ex: repo/image:latest\n                                      Format: [domain][:port][/repo][/][image][:tag]\n                                      Examples: mariadb, mariadb:latest, private.registry.com:8000/repo/image:tag\n\n    Optional arguments:\n        -a | --aws-assume-role        ARN for AWS Role to assume for ecs-deploy operations.\n        -D | --desired-count          The number of instantiations of the task to place and keep running in your service.\n        -m | --min                    minumumHealthyPercent: The lower limit on the number of running tasks during a deployment. (default: 100)\n        -M | --max                    maximumPercent: The upper limit on the number of running tasks during a deployment. (default: 200)\n        -t | --timeout                Default is 90s. Script monitors ECS Service for new task definition to be running.\n        -e | --tag-env-var            Get image tag name from environment variable. If provided this will override value specified in image name argument.\n        -to | --tag-only              New tag to apply to all images defined in the task (multi-container task). If provided this will override value specified in image name argument.\n        --max-definitions             Number of Task Definition Revisions to persist before deregistering oldest revisions.\n                                      Note: This number must be 1 or higher (i.e. keep only the current revision ACTIVE).\n                                            Max definitions causes all task revisions not matching criteria to be deregistered, even if they're created manually.\n                                            Script will only perform deregistration if deployment succeeds.\n        --task-definition-file        File used as task definition to deploy\n        --enable-rollback             Rollback task definition if new version is not running before TIMEOUT\n        --use-latest-task-def         Will use the most recently created task definition as it's base, rather than the last used.\n        --force-new-deployment        Force a new deployment of the service. Default is false.\n        --skip-deployments-check      Skip deployments check for services that take too long to drain old tasks\n        --run-task                    Run created task now. If you set this, service-name are not needed.\n        --wait-for-success            Wait for task execution to complete and to receive the exitCode 0.\n        --launch-type                 The launch type on which to run your task. (https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)\n        --platform-version            The Fargate platform version on which to run your task. (https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)\n        --network-configuration       The network configuration for the task. This parameter is required for task definitions that use\n                                          the awsvpc network mode to receive their own elastic network interface, and it is not supported\n                                          for other network modes. (https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)\n        --copy-task-definition-tags   Copy the existing task definition tags to the new task definition revision\n        -v | --verbose                Verbose output\n             --version                Display the version\n\n    Requirements:\n        aws:  AWS Command Line Interface\n        jq:   Command-line JSON processor\n\n    Examples:\n      Simple deployment of a service (Using env vars for AWS settings):\n\n        ecs-deploy -c my-cluster-name -n my-service-name -i my.private.repo.com/frontend_container:latest\n\n      All options:\n\n        ecs-deploy -k ABC123 -s SECRETKEY -r us-east-1 -c my-cluster-name -n my-service-name -i my.private.repo.com/frontend_container -m 50 -M 100 -t 240 -D 2 -e CI_TIMESTAMP -v\n\n      Updating a task definition with a new image:\n\n        ecs-deploy -d my-task-definition -i my.private.repo.com/frontend_container:17\n\n      Using profiles (for STS delegated credentials, for instance):\n\n        ecs-deploy -p my-profile -c my-cluster-name -n my-service-name -i my.private.repo.com/frontend_container -t 240 -e CI_TIMESTAMP -v\n\n      Update just the tag on whatever image is found in ECS Task (supports multi-container tasks):\n\n        ecs-deploy -c staging -n core-service -to 0.1.899 -i ignore\n\n    Notes:\n      - If a tag is not found in image and an ENV var is not used via -e, it will default the tag to \"latest\"\n\n## Installation\n\n- Install and configure [aws-cli](http://docs.aws.amazon.com/cli/latest/userguide/tutorial-ec2-ubuntu.html#install-cli)\n- Install [jq](https://github.com/stedolan/jq/wiki/Installation)\n- Install ecs-deploy:\n\n```\ncurl https://raw.githubusercontent.com/silinternational/ecs-deploy/master/ecs-deploy | sudo tee /usr/bin/ecs-deploy\nsudo chmod +x /usr/bin/ecs-deploy\n\n```\n\n## How it works\n\n_Note: Some nouns in the next paragraphs are capitalized to indicate that they are words which have specific meanings in AWS_\n\nRemember that in the EC2 Container Service, the relationship between the group of containers which together provide a\nuseful application (e.g. a database, web frontend, and perhaps some for maintenance/cron) is specified in a Task Definition.\nThe Task Definition then acts a sort of template for actually running the containers in that group. That resulting group of\ncontainers is known as a Task. Due to the way docker implements networking, generally you can only run one Task per Task\nDefinition per Container Instance (the virtual machines providing the cluster infrastructure).\n\nTask Definitions are automatically version controlled---the actual name of a Task Definition is composed of two parts, the\nFamily name, and a version number, like so: `phpMyAdmin:3`\n\nSince a Task is supposed to be a fully self-contained \"worker unit\" of a broader application, Amazon uses another configuration\nentity, Services, to manage the number of Tasks running at any given time. As Tasks are just instantiations of Task Definitions,\na Service is just a binding between a specified revision of a Task Definition, and the number of Tasks which should be run from\nit.\n\nConveniently, Amazon allows this binding to be updated, either to change the number of Tasks running or to change the Task\nDefinition they are built from. In the former case, the Service will respond by building or killing Tasks to bring the count to\nspecifications. In the latter case, however, it will do a blue/green deployment, that is, before killing any of the old Tasks,\nit will first ensure that a new Task is brought up and ready to use, so that there is no loss of service.\n\n_Naturally, enough computing resources must be available in the ECS cluster for any of this to work._\n\nConsequently, all that is needed to deploy a new version of an application is to update the Service which is running its\nTasks to point at a new version of the Task Definition. `ecs-deploy` uses the python `aws` utility to do this. It,\n\n- Pulls the JSON representation of the in-use Task Definition; or the most recently created if using `--use-latest-task-def`\n- Edits it\n- Defines a new version, with the changes\n- Updates the Service to use the new version\n- Waits, querying Amazon's API to make sure that the Service has been able to create a new Task\n\nThe second step merits more explanation: since a Task Definition [may] define multiple containers, the question arises, \"what\nmust be changed to create a new revision?\" Empirically, the surprising answer is nothing; Amazon allows you to create a new\nbut identical version of a Task Definition, and the Service will still do a blue/green deployment of identical tasks.\n\nNevertheless, since the system uses docker, the assumption is that improvements to the application are built into\nits container images, which are then pushed into a repository (public or private), to then be pulled down for use by ECS. This\nscript therefore uses the specified `image` parameter as a modification key to change the tag used by a container's image. It\nlooks for images with the same repository name as the specified parameter, and updates its tag to the one in the specified\nparameter.\n\n_A direct consequence of this is that if you define more than one container in your Task Definition to use the same image, all\nof them will be updated to the specified tag, even if you set them to use different tags initially. But this is considered to\nbe an unlikely use case._\n\nThis behavior allows two possible process to specify which images, and therefore which configurations, to deploy. First, you\nmay set the tag to always be `latest` (or some other static value), like so:\n\n    ecs-deploy -c my-cluster-name -n my-service-name -i my.private.repo.com/frontend_container:latest\n\nThis will result in identical new versions of the Task Definition being created, but the Service will still do a blue/green\ndeployment, and will so will pull down the latest version (if you previously pushed it into the registry).\n\nAlternatively, you may specify some other means of obtaining the tag, since the script `eval`s the image string. You could use\ngit tags as a map to docker tags:\n\n    ecs-deploy -c my-cluster-name -n my-service-name -i 'my.private.repo.com/frontend_container:`git describe`'\n\nOr perhaps just obtain read the docker tag from another file in your development:\n\n    ecs-deploy -c my-cluster-name -n my-service-name -i 'my.private.repo.com/frontend_container:$(\u003c VERSION)'\n\nIn any case, just make sure your process builds, tags, and pushes the docker image you use to the repository before running\nthis script.\n\n## Use Environment Variable for tag name value\n\nIn some cases you may want to use an environment variable for the tag name of your image.\nFor example, we want to use a unique docker image/tag for each task definition. This\ngives us the ability to revert/rollback changes by just selecting a previous task\ndefinition and updating the service.\n\nUsing the `-e` argument you can provide the name of an environment variable that\nholds the value you wish to use for the tag.\n\nFor example:\n\n    ecs-deploy -c my-cluster-name -n my-service-name -i my.private.repo.com/frontend_container -e CI_TIMESTAMP\n\n## AWS IAM Policy Configuration\n\nHere's an example of a suitable custom policy for [AWS IAM](https://aws.amazon.com/documentation/iam/):\n\n```json\n{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Action\": [\n                \"ecs:DescribeServices\",\n                \"ecs:UpdateService\",\n                \"ecs:RegisterTaskDefinition\",\n                \"ecs:DescribeTasks\",\n                \"ecs:ListTasks\"\n            ],\n            \"Effect\": \"Allow\",\n            \"Resource\": [\n                \"arn:aws:ecs:us-east-1:111111111111:service/cluster-name/service-name\",\n                \"arn:aws:ecs:us-east-1:111111111111:task-definition/service-name:*\",\n                \"arn:aws:ecs:us-east-1:111111111111:task/cluster-name/*\",\n                \"arn:aws:ecs:us-east-1:111111111111:container-instance/cluster-name/*\"\n            ]\n        },\n        {\n            \"Action\": [\n                \"ecs:DescribeTaskDefinition\",\n                \"ecs:DeregisterTaskDefinition\",\n                \"ecs:ListTaskDefinitions\",\n                \"ecr:GetAuthorizationToken\"\n            ],\n            \"Effect\": \"Allow\",\n            \"Resource\": \"*\"\n        },\n        {\n            \"Action\": \"iam:PassRole\",\n            \"Effect\": \"Allow\",\n            \"Resource\": \"arn:aws:iam::111111111111:role/role-name\"\n        }\n    ]\n}\n```\n\nReplace the `111111111111` value with your AWS account number. The `iam:PassRole` action can be omitted if your task definition does not specify an ECS task role. If you do not use ECR, the `ecr:GetAuthorizationToken` action can be omitted.\n\nYour ECR policy should limit access to the user or role used for ecs-deploy. Here is an example policy:\n\n```json\n{\n  \"Version\": \"2008-10-17\",\n  \"Statement\": [\n    {\n      \"Effect\": \"Allow\",\n      \"Principal\": {\n        \"AWS\": \"arn:aws:iam::111111111111:user/user-name\"\n      },\n      \"Action\": [\n        \"ecr:BatchCheckLayerAvailability\",\n        \"ecr:BatchGetImage\",\n        \"ecr:CompleteLayerUpload\",\n        \"ecr:GetDownloadUrlForLayer\",\n        \"ecr:InitiateLayerUpload\",\n        \"ecr:PutImage\",\n        \"ecr:UploadLayerPart\"\n      ]\n    }\n  ]\n}\n```\n\n## Troubleshooting\n\n- You must provide AWS credentials in one of the supported formats. If you do\n  not, you'll see some error output from the AWS CLI, something like:\n\n       You must specify a region. You can also configure your region by running \"aws configure\".\n\n## Testing\n\nAutomated tests are performed using [bats](https://github.com/sstephenson/bats).\nThe goal of testing is to ensure that updates/changes do not break core functionality.\nUnfortunately not all of `ecs-deploy` is testable since portions interact with\nAWS APIs to perform actions. So for now any parsing/processing of data locally\nis tested.\n\nAny new functionality and pull requests should come with tests as well (if possible).\n\n## Github Actions Support\n\nGithub Actions support is available. Add a code block similar to that below to your actions yaml file. Parameters are passed to the ecs-deploy tool under 'with' section. For each parameter, the parameter name followed by \\_cmd must be called with the appropriate parameter option like '--aws-access-key' in addition to supplying the parameter aws_access_key with the appropriate value.\n\n```\ndeploy_to_ecs:\n  name: 'Deploy updated container image via blue/green deployment to ECS service.'\n  runs-on: ubuntu-18.04\n  steps:\n  - uses: silinternational/ecs-deploy@master\n    env:\n      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}\n      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      AWS_DEFAULT_REGION: 'us-east-1'\n    with:\n      aws_access_key_cmd: '--aws-access-key'\n      aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}\n      aws_secret_key_cmd: '--aws-secret-key'\n      aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}\n      cluster_cmd: '--cluster'\n      cluster: 'cluster-name'\n      image_cmd: '--image'\n      image: '{amazon_id}.dkr.ecr.us-east-1.amazonaws.com/cluster-name/image_name:latest'\n      region_cmd: '--region'\n      region: 'us-east-1'\n      service_name_cmd: '--service-name'\n      service_name: 'aws-service-name'\n      timeout_cmd: '--timeout'\n      timeout: '360'\n```\n","funding_links":[],"categories":["Shell"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsil-org%2Fecs-deploy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsil-org%2Fecs-deploy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsil-org%2Fecs-deploy/lists"}