{"id":43942120,"url":"https://github.com/b-b3rn4rd/gocfn","last_synced_at":"2026-02-07T02:06:10.942Z","repository":{"id":57512322,"uuid":"126591202","full_name":"b-b3rn4rd/gocfn","owner":"b-b3rn4rd","description":"GOCFN - cloudformation package and deploy commands in Golang","archived":false,"fork":false,"pushed_at":"2020-06-08T09:47:56.000Z","size":96,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"master","last_synced_at":"2024-09-23T09:04:16.433Z","etag":null,"topics":["aws","cloudformation","deploy","golang","stack","stack-events"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/b-b3rn4rd.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}},"created_at":"2018-03-24T11:04:35.000Z","updated_at":"2020-12-21T11:56:40.000Z","dependencies_parsed_at":"2022-09-26T17:51:36.321Z","dependency_job_id":null,"html_url":"https://github.com/b-b3rn4rd/gocfn","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/b-b3rn4rd/gocfn","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-b3rn4rd%2Fgocfn","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-b3rn4rd%2Fgocfn/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-b3rn4rd%2Fgocfn/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-b3rn4rd%2Fgocfn/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/b-b3rn4rd","download_url":"https://codeload.github.com/b-b3rn4rd/gocfn/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/b-b3rn4rd%2Fgocfn/sbom","scorecard":{"id":221779,"data":{"date":"2025-08-11","repo":{"name":"github.com/b-b3rn4rd/gocfn","commit":"4665912da85705b011f5e3ce57e81903ac70819b"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.7,"checks":[{"name":"Code-Review","score":0,"reason":"Found 2/27 approved changesets -- score normalized to 0","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":-1,"reason":"no workflows found","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":-1,"reason":"No tokens found","details":null,"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"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":"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":"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":"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":"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":"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: Apache License 2.0: 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":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 0.0.7 not signed: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10601877","Warn: release artifact 0.0.6 not signed: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10473833","Warn: release artifact 0.0.5 not signed: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444430","Warn: release artifact 0.0.4 not signed: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444334","Warn: release artifact 0.0.3 not signed: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444253","Warn: release artifact 0.0.7 does not have provenance: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10601877","Warn: release artifact 0.0.6 does not have provenance: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10473833","Warn: release artifact 0.0.5 does not have provenance: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444430","Warn: release artifact 0.0.4 does not have provenance: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444334","Warn: release artifact 0.0.3 does not have provenance: https://api.github.com/repos/b-b3rn4rd/gocfn/releases/10444253"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for 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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 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"}}]},"last_synced_at":"2025-08-17T02:42:25.572Z","repository_id":57512322,"created_at":"2025-08-17T02:42:25.572Z","updated_at":"2025-08-17T02:42:25.572Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29184977,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T00:44:15.062Z","status":"online","status_checked_at":"2026-02-07T02:00:07.217Z","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","cloudformation","deploy","golang","stack","stack-events"],"created_at":"2026-02-07T02:06:10.024Z","updated_at":"2026-02-07T02:06:10.928Z","avatar_url":"https://github.com/b-b3rn4rd.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Go Report Card](https://goreportcard.com/badge/github.com/b-b3rn4rd/gocfn)](https://goreportcard.com/report/github.com/b-b3rn4rd/gocfn)  [![Build Status](https://travis-ci.org/b-b3rn4rd/gocfn.svg?branch=master)](https://travis-ci.org/b-b3rn4rd/gocfn) *GOCFN* - cloudformation package and deploy commands in Golang\n==================\nFollowing library re-implements existing functionality in `aws cloudformation package` and `aws cloudformation deploy` and provides additional features that are not available in the standard `aws cli`\n\nMotivation\n----------\nI was really frustrated with the behaviour of the standard `aws cloudformation deploy` command, particularly with following issues \n\n(*at the time I started writing this library*):\n\n1) No options to specify `--tags`\n2) Command would fail if change set does not contain changes\n3) Command does not output describe stack on successful completion\n\nIn addition, to fixing above mentioned issues I also needed those features:\n1) Preview option - to generate and output a change set without actually executing it\n2) Stream option - stream stack events while stack is being executed\n3) Force deploy option - delete stack if it's failed creation and in `CREATE_FAILED` or `ROLLBACK_COMPLETE` status\n\nInstallation\n--------------\nThere are three ways to install `gocfn`\n\n*Using homebrew*\n\n```bash\nbrew tap b-b3rn4rd/homebrew-tap\nbrew install gocfn\n```\n\n*Using go get*\n\n`go get github.com/b-b3rn4rd/gocfn`\n\n\n*Manually*\n\nDownload and install a binary the releases page.\n\n\nDeploy Usage\n------------------\n*gocfn deploy* - provides identical parameters to `aws cloudformation deploy` and can be transparently substitute it.\n\n\n```bash\nusage: gocfn deploy --template-file=TEMPLATE-FILE --name=NAME [\u003cflags\u003e]\n\nDeploys the specified AWS CloudFormation template by creating and then executing a change set.\n\nFlags:\n      --help                     Show context-sensitive help (also try --help-long and --help-man).\n  -d, --debug                    Enable debug logging.\n      --version                  Show application version.\n      --template-file=TEMPLATE-FILE  \n                                 The path where your AWS CloudFormation template is located.\n      --name=NAME                The name of the AWS CloudFormation stack you're deploying to.\n      --s3-bucket=S3-BUCKET      The name of the S3 bucket where this command uploads your CloudFormation template.\n      --force-upload             Indicates whether to override existing files in the S3 bucket.\n      --s3-prefix=S3-PREFIX      A prefix name that the command adds to the artifacts name when it uploads them to the S3 bucket.\n      --kms-key-id=KMS-KEY-ID    The ID of an AWS KMS key that the command uses to encrypt artifacts that are at rest in the S3 bucket.\n      --parameter-overrides=PARAMETER-OVERRIDES  \n                                 A list of parameter structures that specify input parameters for your stack template.\n      --capabilities=CAPABILITIES ...  \n                                 A list of capabilities that you must specify before AWS Cloudformation can create certain stacks.\n      --no-execute-changeset     Indicates whether to execute the change set. Specify this flag if you want to view your stack changes before executing\n      --role-arn=ROLE-ARN        The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role\n      --notification-arns=NOTIFICATION-ARNS ...  \n                                 The Amazon Resource Name (ARN) of an AWS Identity and Access Management (IAM) role.\n      --fail-on-empty-changeset  Specify if the CLI should return a non-zero exit code if there are no changes to be made to the stack\n      --tags=TAGS                A list of tags to associate with the stack that is created or updated.\n      --force-deploy             Force CloudFormation stack deployment if it's in CREATE_FAILED state.\n      --stream                   Stream stack events during creation or update process.\n```\n\nExamples\n------------\n\n\u003cdetails\u003e\n\u003csummary\u003eGenerate a change set without actually executing it\u003c/summary\u003e\n\n\nChange set can be generated without execution by passing `--no-execute-changeset` parameter, the output will be written\nto the `stdout`\n\n```bash\n$ gocfn deploy --name hello --parameter-overrides \"BucketName=helloza\" --template-file stack.yml --no-execute-changeset\n{\n    \"Capabilities\": null,\n    \"ChangeSetId\": \"arn:aws:cloudformation:us-west-2:111111111111:changeSet/gocfn-cloudformation-package-deploy-1521960705/f229d566-fc74-456d-8ad4-5cb7458c8411\",\n    \"ChangeSetName\": \"gocfn-cloudformation-package-deploy-1521960705\",\n    \"Changes\": [\n        {\n            \"ResourceChange\": {\n                \"Action\": \"Modify\",\n                \"Details\": [\n                    {\n                        \"CausingEntity\": \"S3Bucket\",\n                        \"ChangeSource\": \"ResourceReference\",\n                        \"Evaluation\": \"Static\",\n                        \"Target\": {\n                            \"Attribute\": \"Properties\",\n                            \"Name\": \"Bucket\",\n                            \"RequiresRecreation\": \"Always\"\n                        }\n                    },\n                    {\n                        \"CausingEntity\": \"S3Bucket\",\n                        \"ChangeSource\": \"ResourceReference\",\n                        \"Evaluation\": \"Static\",\n                        \"Target\": {\n                            \"Attribute\": \"Properties\",\n                            \"Name\": \"PolicyDocument\",\n                            \"RequiresRecreation\": \"Never\"\n                        }\n                    }\n                ],\n                \"LogicalResourceId\": \"BucketPolicy\",\n                \"PhysicalResourceId\": \"hello-BucketPolicy-15UXUJSQ48KAH\",\n                \"Replacement\": \"True\",\n                \"ResourceType\": \"AWS::S3::BucketPolicy\",\n                \"Scope\": [\n                    \"Properties\"\n                ]\n            },\n            \"Type\": \"Resource\"\n        },\n        {\n            \"ResourceChange\": {\n                \"Action\": \"Modify\",\n                \"Details\": [\n                    {\n                        \"CausingEntity\": null,\n                        \"ChangeSource\": \"DirectModification\",\n                        \"Evaluation\": \"Dynamic\",\n                        \"Target\": {\n                            \"Attribute\": \"Properties\",\n                            \"Name\": \"BucketName\",\n                            \"RequiresRecreation\": \"Always\"\n                        }\n                    },\n                    {\n                        \"CausingEntity\": \"BucketName\",\n                        \"ChangeSource\": \"ParameterReference\",\n                        \"Evaluation\": \"Static\",\n                        \"Target\": {\n                            \"Attribute\": \"Properties\",\n                            \"Name\": \"BucketName\",\n                            \"RequiresRecreation\": \"Always\"\n                        }\n                    }\n                ],\n                \"LogicalResourceId\": \"S3Bucket\",\n                \"PhysicalResourceId\": \"gellozaa\",\n                \"Replacement\": \"True\",\n                \"ResourceType\": \"AWS::S3::Bucket\",\n                \"Scope\": [\n                    \"Properties\"\n                ]\n            },\n            \"Type\": \"Resource\"\n        }\n    ],\n    \"CreationTime\": \"2018-03-25T06:51:47.628Z\",\n    \"Description\": \"Created by gocfn at 2018-03-25 06:51:45.301595904 +0000 UTC\",\n    \"ExecutionStatus\": \"AVAILABLE\",\n    \"NextToken\": null,\n    \"NotificationARNs\": null,\n    \"Parameters\": [\n        {\n            \"ParameterKey\": \"BucketName\",\n            \"ParameterValue\": \"helloza\",\n            \"ResolvedValue\": null,\n            \"UsePreviousValue\": null\n        }\n    ],\n    \"RollbackConfiguration\": {\n        \"MonitoringTimeInMinutes\": null,\n        \"RollbackTriggers\": null\n    },\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Status\": \"CREATE_COMPLETE\",\n    \"StatusReason\": null,\n    \"Tags\": null\n}\n\n```\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003e(Re)deploy a stack that does not contain changes\u003c/summary\u003e\n\nIn situations when stack does not contain new changes, `gocfn` won't fail and output stack's information, unless\n`--fail-on-empty-changeset` is specified.\n\n```bash\ngocfn deploy --name hello --parameter-overrides \"BucketName=helloza\" --template-file stack.yml\n{\n    \"Capabilities\": null,\n    \"ChangeSetId\": \"arn:aws:cloudformation:us-west-2:111111111111:changeSet/gocfn-cloudformation-package-deploy-1521960952/0db34469-ba57-4286-b5c7-ff049763c5fb\",\n    \"CreationTime\": \"2018-03-01T08:57:19.888Z\",\n    \"DeletionTime\": null,\n    \"Description\": null,\n    \"DisableRollback\": false,\n    \"EnableTerminationProtection\": false,\n    \"LastUpdatedTime\": \"2018-03-25T06:56:25.743Z\",\n    \"NotificationARNs\": null,\n    \"Outputs\": [\n        {\n            \"Description\": \"Name of S3 bucket to hold website content\",\n            \"ExportName\": null,\n            \"OutputKey\": \"S3BucketSecureURL\",\n            \"OutputValue\": \"https://helloza.s3.amazonaws.com\"\n        },\n        {\n            \"Description\": \"URL for website hosted on S3\",\n            \"ExportName\": null,\n            \"OutputKey\": \"WebsiteURL\",\n            \"OutputValue\": \"http://helloza.s3-website-us-west-2.amazonaws.com\"\n        }\n    ],\n    \"Parameters\": [\n        {\n            \"ParameterKey\": \"BucketName\",\n            \"ParameterValue\": \"helloza\",\n            \"ResolvedValue\": null,\n            \"UsePreviousValue\": null\n        }\n    ],\n    \"ParentId\": null,\n    \"RoleARN\": null,\n    \"RollbackConfiguration\": {\n        \"MonitoringTimeInMinutes\": null,\n        \"RollbackTriggers\": null\n    },\n    \"RootId\": null,\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"StackStatus\": \"UPDATE_COMPLETE\",\n    \"StackStatusReason\": null,\n    \"Tags\": null,\n    \"TimeoutInMinutes\": null\n}\n```\n\nError on empty change set can be forced by specifying `--fail-on-empty-changeset`\n\n```bash\ngocfn deploy --name hello --parameter-overrides \"BucketName=helloza\" --template-file stack.yml --fail-on-empty-changeset\n{\"error\":\"The submitted information didn't contain changes. Submit different information to create a change set.\",\"level\":\"error\",\"msg\":\"ChangeSet creation error\",\"time\":\"2018-03-25T18:00:16+11:00\"}\n```\n\u003c/details\u003e\n\n\n\n\u003cdetails\u003e\n\u003csummary\u003eDeploy stack from s3 bucket\u003c/summary\u003e\n\n```bash\ngocfn deploy --name hello --parameter-overrides \"BucketName=helloza\" --template-file stack.yml --s3-bucket cf-templates-17636j9pul1d8-us-west-2\n{\n    \"Capabilities\": null,\n    \"ChangeSetId\": \"arn:aws:cloudformation:us-west-2:111111111111:changeSet/gocfn-cloudformation-package-deploy-1521960952/0db34469-ba57-4286-b5c7-ff049763c5fb\",\n    \"CreationTime\": \"2018-03-01T08:57:19.888Z\",\n    \"DeletionTime\": null,\n    \"Description\": null,\n    \"DisableRollback\": false,\n    \"EnableTerminationProtection\": false,\n    \"LastUpdatedTime\": \"2018-03-25T06:56:25.743Z\",\n    \"NotificationARNs\": null,\n    \"Outputs\": [\n        {\n            \"Description\": \"Name of S3 bucket to hold website content\",\n            \"ExportName\": null,\n            \"OutputKey\": \"S3BucketSecureURL\",\n            \"OutputValue\": \"https://helloza.s3.amazonaws.com\"\n        },\n        {\n            \"Description\": \"URL for website hosted on S3\",\n            \"ExportName\": null,\n            \"OutputKey\": \"WebsiteURL\",\n            \"OutputValue\": \"http://helloza.s3-website-us-west-2.amazonaws.com\"\n        }\n    ],\n    \"Parameters\": [\n        {\n            \"ParameterKey\": \"BucketName\",\n            \"ParameterValue\": \"helloza\",\n            \"ResolvedValue\": null,\n            \"UsePreviousValue\": null\n        }\n    ],\n    \"ParentId\": null,\n    \"RoleARN\": null,\n    \"RollbackConfiguration\": {\n        \"MonitoringTimeInMinutes\": null,\n        \"RollbackTriggers\": null\n    },\n    \"RootId\": null,\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"StackStatus\": \"UPDATE_COMPLETE\",\n    \"StackStatusReason\": null,\n    \"Tags\": null,\n    \"TimeoutInMinutes\": null\n}\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDeploy stack with stream enabled\u003c/summary\u003e\n\nWhen `--stream` is enabled, stack events are sent to `stderr`, therefore describe stack output still can be captured by from `stdout`\n\n```bash\ngocfn deploy --name hello --parameter-overrides \"BucketName=helloza1\" --template-file stack.yml --stream 1\u003e output.json\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"ef096ff0-2ffb-11e8-94a1-50a68a2012f2\",\n    \"LogicalResourceId\": \"hello\",\n    \"PhysicalResourceId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"UPDATE_IN_PROGRESS\",\n    \"ResourceStatusReason\": \"User Initiated\",\n    \"ResourceType\": \"AWS::CloudFormation::Stack\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:12:52.843Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"S3Bucket-UPDATE_IN_PROGRESS-2018-03-25T07:12:57.644Z\",\n    \"LogicalResourceId\": \"S3Bucket\",\n    \"PhysicalResourceId\": \"helloza\",\n    \"ResourceProperties\": \"{\\\"BucketName\\\":\\\"helloza1\\\",\\\"WebsiteConfiguration\\\":{\\\"IndexDocument\\\":\\\"index.html\\\",\\\"ErrorDocument\\\":\\\"error.html\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_IN_PROGRESS\",\n    \"ResourceStatusReason\": \"Requested update requires the creation of a new physical resource; hence creating one.\",\n    \"ResourceType\": \"AWS::S3::Bucket\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:12:57.644Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"S3Bucket-UPDATE_IN_PROGRESS-2018-03-25T07:12:59.141Z\",\n    \"LogicalResourceId\": \"S3Bucket\",\n    \"PhysicalResourceId\": \"helloza1\",\n    \"ResourceProperties\": \"{\\\"BucketName\\\":\\\"helloza1\\\",\\\"WebsiteConfiguration\\\":{\\\"IndexDocument\\\":\\\"index.html\\\",\\\"ErrorDocument\\\":\\\"error.html\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_IN_PROGRESS\",\n    \"ResourceStatusReason\": \"Resource creation Initiated\",\n    \"ResourceType\": \"AWS::S3::Bucket\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:12:59.141Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"BucketPolicy-UPDATE_IN_PROGRESS-2018-03-25T07:13:24.377Z\",\n    \"LogicalResourceId\": \"BucketPolicy\",\n    \"PhysicalResourceId\": \"hello-BucketPolicy-12DJ4X7RUU313\",\n    \"ResourceProperties\": \"{\\\"Bucket\\\":\\\"helloza1\\\",\\\"PolicyDocument\\\":{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Action\\\":\\\"s3:GetObject\\\",\\\"Resource\\\":\\\"arn:aws:s3:::helloza1/*\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":\\\"*\\\",\\\"Sid\\\":\\\"PublicReadForGetBucketObjects\\\"}],\\\"Id\\\":\\\"MyPolicy\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_IN_PROGRESS\",\n    \"ResourceStatusReason\": \"Requested update requires the creation of a new physical resource; hence creating one.\",\n    \"ResourceType\": \"AWS::S3::BucketPolicy\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:24.377Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"S3Bucket-UPDATE_COMPLETE-2018-03-25T07:13:19.759Z\",\n    \"LogicalResourceId\": \"S3Bucket\",\n    \"PhysicalResourceId\": \"helloza1\",\n    \"ResourceProperties\": \"{\\\"BucketName\\\":\\\"helloza1\\\",\\\"WebsiteConfiguration\\\":{\\\"IndexDocument\\\":\\\"index.html\\\",\\\"ErrorDocument\\\":\\\"error.html\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_COMPLETE\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::Bucket\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:19.759Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"0430a100-2ffc-11e8-9f2c-503aca41a061\",\n    \"LogicalResourceId\": \"hello\",\n    \"PhysicalResourceId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"UPDATE_COMPLETE_CLEANUP_IN_PROGRESS\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::CloudFormation::Stack\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:28.315Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"BucketPolicy-UPDATE_COMPLETE-2018-03-25T07:13:25.970Z\",\n    \"LogicalResourceId\": \"BucketPolicy\",\n    \"PhysicalResourceId\": \"hello-BucketPolicy-TR1WBFLASSSN\",\n    \"ResourceProperties\": \"{\\\"Bucket\\\":\\\"helloza1\\\",\\\"PolicyDocument\\\":{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Action\\\":\\\"s3:GetObject\\\",\\\"Resource\\\":\\\"arn:aws:s3:::helloza1/*\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":\\\"*\\\",\\\"Sid\\\":\\\"PublicReadForGetBucketObjects\\\"}],\\\"Id\\\":\\\"MyPolicy\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_COMPLETE\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::BucketPolicy\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:25.97Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"BucketPolicy-UPDATE_IN_PROGRESS-2018-03-25T07:13:25.655Z\",\n    \"LogicalResourceId\": \"BucketPolicy\",\n    \"PhysicalResourceId\": \"hello-BucketPolicy-TR1WBFLASSSN\",\n    \"ResourceProperties\": \"{\\\"Bucket\\\":\\\"helloza1\\\",\\\"PolicyDocument\\\":{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Action\\\":\\\"s3:GetObject\\\",\\\"Resource\\\":\\\"arn:aws:s3:::helloza1/*\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":\\\"*\\\",\\\"Sid\\\":\\\"PublicReadForGetBucketObjects\\\"}],\\\"Id\\\":\\\"MyPolicy\\\"}}\",\n    \"ResourceStatus\": \"UPDATE_IN_PROGRESS\",\n    \"ResourceStatusReason\": \"Resource creation Initiated\",\n    \"ResourceType\": \"AWS::S3::BucketPolicy\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:25.655Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"06a76d60-2ffc-11e8-86b5-50a68a20122a\",\n    \"LogicalResourceId\": \"hello\",\n    \"PhysicalResourceId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"UPDATE_COMPLETE\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::CloudFormation::Stack\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:32.455Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"S3Bucket-a38903d9-cb1c-47d4-a3fa-a6cfc114fc44\",\n    \"LogicalResourceId\": \"S3Bucket\",\n    \"PhysicalResourceId\": \"helloza\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"DELETE_COMPLETE\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::Bucket\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:32.122Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"S3Bucket-e142036b-4b00-40d2-85c2-7329f35661ab\",\n    \"LogicalResourceId\": \"S3Bucket\",\n    \"PhysicalResourceId\": \"helloza\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"DELETE_IN_PROGRESS\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::Bucket\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:31.333Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"BucketPolicy-e26c9aab-09b3-404c-a800-4a83b8b5576e\",\n    \"LogicalResourceId\": \"BucketPolicy\",\n    \"PhysicalResourceId\": \"hello-BucketPolicy-12DJ4X7RUU313\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"DELETE_COMPLETE\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::BucketPolicy\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:30.337Z\"\n}\n{\n    \"ClientRequestToken\": null,\n    \"EventId\": \"BucketPolicy-fea4ce56-3e74-445a-bd4f-dcec5051372f\",\n    \"LogicalResourceId\": \"BucketPolicy\",\n    \"PhysicalResourceId\": \"hello-BucketPolicy-12DJ4X7RUU313\",\n    \"ResourceProperties\": null,\n    \"ResourceStatus\": \"DELETE_IN_PROGRESS\",\n    \"ResourceStatusReason\": null,\n    \"ResourceType\": \"AWS::S3::BucketPolicy\",\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"Timestamp\": \"2018-03-25T07:13:29.792Z\"\n}\n```\nstack information\n\n```bash\ncat output.json\n{\n    \"Capabilities\": null,\n    \"ChangeSetId\": \"arn:aws:cloudformation:us-west-2:111111111111:changeSet/gocfn-cloudformation-package-deploy-1521961936/2341ee88-e4ab-4e06-8acf-1251001ffdd8\",\n    \"CreationTime\": \"2018-03-01T08:57:19.888Z\",\n    \"DeletionTime\": null,\n    \"Description\": null,\n    \"DisableRollback\": false,\n    \"EnableTerminationProtection\": false,\n    \"LastUpdatedTime\": \"2018-03-25T07:12:52.843Z\",\n    \"NotificationARNs\": null,\n    \"Outputs\": [\n        {\n            \"Description\": \"Name of S3 bucket to hold website content\",\n            \"ExportName\": null,\n            \"OutputKey\": \"S3BucketSecureURL\",\n            \"OutputValue\": \"https://helloza1.s3.amazonaws.com\"\n        },\n        {\n            \"Description\": \"URL for website hosted on S3\",\n            \"ExportName\": null,\n            \"OutputKey\": \"WebsiteURL\",\n            \"OutputValue\": \"http://helloza1.s3-website-us-west-2.amazonaws.com\"\n        }\n    ],\n    \"Parameters\": [\n        {\n            \"ParameterKey\": \"BucketName\",\n            \"ParameterValue\": \"helloza1\",\n            \"ResolvedValue\": null,\n            \"UsePreviousValue\": null\n        }\n    ],\n    \"ParentId\": null,\n    \"RoleARN\": null,\n    \"RollbackConfiguration\": {\n        \"MonitoringTimeInMinutes\": null,\n        \"RollbackTriggers\": null\n    },\n    \"RootId\": null,\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"StackStatus\": \"UPDATE_COMPLETE\",\n    \"StackStatusReason\": null,\n    \"Tags\": null,\n    \"TimeoutInMinutes\": null\n}\n```\n\u003c/section\u003e\n\n\u003csection\u003e\n\u003csummary\u003eDeploy stack with debugging enabled\u003c/summary\u003e\n\ngocfn provides extensive debugging information when `--debug` option is given.\n\n```bash\n$ gocfn deploy --name hello --parameter-overrides \"BucketName=helloza123\" --template-file stack.yml --debug\n\n{\"level\":\"debug\",\"msg\":\"Checking if stack exists\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:08+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Stack exist with status UPDATE_COMPLETE\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:10+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Running CreateChangeSet\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:10+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Waiting for changeset to finish\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:10+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Running ExecuteChangeSet\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:42+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Waiting for stack to be created/updated\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:20:43+11:00\"}\n{\"level\":\"debug\",\"msg\":\"Stack is ready and no streaming is required\",\"stackName\":\"hello\",\"time\":\"2018-03-25T18:21:45+11:00\"}\n{\n    \"Capabilities\": null,\n    \"ChangeSetId\": \"arn:aws:cloudformation:us-west-2:111111111111:changeSet/gocfn-cloudformation-package-deploy-1521962408/4c820a55-85dc-47a8-86a9-7eb116c131ee\",\n    \"CreationTime\": \"2018-03-01T08:57:19.888Z\",\n    \"DeletionTime\": null,\n    \"Description\": null,\n    \"DisableRollback\": false,\n    \"EnableTerminationProtection\": false,\n    \"LastUpdatedTime\": \"2018-03-25T07:20:42.994Z\",\n    \"NotificationARNs\": null,\n    \"Outputs\": [\n        {\n            \"Description\": \"Name of S3 bucket to hold website content\",\n            \"ExportName\": null,\n            \"OutputKey\": \"S3BucketSecureURL\",\n            \"OutputValue\": \"https://helloza123.s3.amazonaws.com\"\n        },\n        {\n            \"Description\": \"URL for website hosted on S3\",\n            \"ExportName\": null,\n            \"OutputKey\": \"WebsiteURL\",\n            \"OutputValue\": \"http://helloza123.s3-website-us-west-2.amazonaws.com\"\n        }\n    ],\n    \"Parameters\": [\n        {\n            \"ParameterKey\": \"BucketName\",\n            \"ParameterValue\": \"helloza123\",\n            \"ResolvedValue\": null,\n            \"UsePreviousValue\": null\n        }\n    ],\n    \"ParentId\": null,\n    \"RoleARN\": null,\n    \"RollbackConfiguration\": {\n        \"MonitoringTimeInMinutes\": null,\n        \"RollbackTriggers\": null\n    },\n    \"RootId\": null,\n    \"StackId\": \"arn:aws:cloudformation:us-west-2:111111111111:stack/hello/8978e0f0-1d2e-11e8-a95e-503aca41a0c5\",\n    \"StackName\": \"hello\",\n    \"StackStatus\": \"UPDATE_COMPLETE\",\n    \"StackStatusReason\": null,\n    \"Tags\": null,\n    \"TimeoutInMinutes\": null\n}\n```\n\u003c/details\u003e\n\nPackage Usage\n------------------\n*gocfn package* - provides similar parameters to `aws cloudformation package` with temporary minor differences.\n\nDifferences:\n* `--use-json` option is not available yet, because currently there is no way to transform YAML user tags\n* command can only upload artifacts for `CodeUri` property for the `AWS::Serverless::Function` resource, just because it's the only resource I currently use\n\n```bash\ngocfn package --help\nusage: gocfn package --template-file=TEMPLATE-FILE --s3-bucket=S3-BUCKET [\u003cflags\u003e]\n\nPackages the local artifacts (local paths) that your AWS CloudFormation template references.\n\nFlags:\n      --help                   Show context-sensitive help (also try --help-long and --help-man).\n  -d, --debug                  Enable debug logging.\n      --version                Show application version.\n      --template-file=TEMPLATE-FILE  \n                               The path where your AWS CloudFormation template is located.\n      --output-template-file=OUTPUT-TEMPLATE-FILE  \n                               The path to the file where the command writes the output AWS CloudFormation template.\n      --s3-bucket=S3-BUCKET    The name of the S3 bucket where this command uploads your CloudFormation template.\n      --force-upload           Indicates whether to override existing files in the S3 bucket.\n      --s3-prefix=S3-PREFIX    A prefix name that the command adds to the artifacts name when it uploads them to the S3 bucket.\n      --kms-key-id=KMS-KEY-ID  The ID of an AWS KMS key that the command uses to encrypt artifacts that are at rest in the S3 bucket.\n```\n\nExamples\n------------\n\n\u003cdetails\u003e\n\u003csummary\u003ePackage local artifacts and send create output stack file\u003c/summary\u003e\n\n```bash\ngocfn  package --template-file stack.yml --output-template-file stack.out.yml --s3-bucket=example-bucket-name\n```\n\u003c/details\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-b3rn4rd%2Fgocfn","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fb-b3rn4rd%2Fgocfn","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fb-b3rn4rd%2Fgocfn/lists"}