[{"data":1,"prerenderedAt":209},["ShallowReactive",2],{"content-guides-building-serverless-applications-with-terraform-03-s3-buckets":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":20,"contributorPaths":21,"menuType":26,"contentName":27,"slug":28,"readingTime":29,"menu":30,"nextDocItem":75,"previousDocItem":52},"\u003Cp>Chapters 3-6 of this guide illustrate how to configure the AWS Terraform Provider, create resources, and wire application components together. For simplicity, in these chapters the guide assumes you&#39;re using a single Terraform configuration file named \u003Ccode>main.tf\u003C\u002Fcode>. Towards the end of this guide you will learn how to organize your project into an easy-to-maintain, modular multi-environment solution that would work for a large enterprise. \u003C\u002Fp>\n\u003Ch2>Adding the AWS Terraform Provider\u003C\u002Fh2>\n\u003Cp>AWS Terraform Provider allows you to manage the lifecycle of many resource types supported by AWS. The following snippet adds the AWS Terraform Provider to your Terraform project. \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-hcl\">terraform {\n  required_providers {\n    aws = {\n      source  = &quot;hashicorp\u002Faws&quot;\n      version = &quot;~&gt; 5.0&quot;\n    }\n  }\n}\n\nprovider &quot;aws&quot; {\n  region = &quot;us-east-1&quot; # Replace with your desired region\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Authentication\u003C\u002Fh3>\n\u003Cp>The AWS Terraform provider requires valid AWS credentials in order to create and manage resources in your AWS account. There are several ways to achieve this. Configuration of the provider can come from multiple locations and certain locations take precedence over others, see \u003Ca href=\"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs#authentication-and-configuration\">Terraform Docs\u003C\u002Fa> for additional details. \u003C\u002Fp>\n\u003Cp>When authenticating to AWS, we recommend you use an \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fid_roles.html\">IAM role\u003C\u002Fa> to grant short-term, temporary security credentials. Such credentials are time-bound, last from a few minutes to several hours, and do not require you to rotate them or explicitly revoke when they’re no longer needed or expire. Temporary security credentials are generated dynamically and provided to the user when they assume the IAM role.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-hcl\">provider &quot;aws&quot; {\n  region = &quot;us-east-1&quot;\n  assume_role {\n    role_arn = &quot;.......&quot;\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Environment Variables\u003C\u002Fh4>\n\u003Cblockquote>\n\u003Cp>Warning: Storing and using long-term credentials could expose you to a security risk, even if you rotate your AWS credentials regularly. As a best practice, use temporary security credentials (such as IAM roles) instead of creating long-term credentials like access keys. See AWS IAM documentation for \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fsecurity-creds.html#sec-alternatives-to-long-term-access-keys\">alternatives to long-term access keys\u003C\u002Fa>.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>If you do use access keys with AWS Terraform provider, you should never hard-code them in your IaC files. Export them as environment variables instead. This keeps secrets out of your codebase.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">export AWS_ACCESS_KEY_ID=&quot;your-access-key&quot;\nexport AWS_SECRET_ACCESS_KEY=&quot;your-secret-access-key&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>AWS Terraform provider will automatically recognize these environment variables in runtime.\u003C\u002Fp>\n\u003Cp>See \u003Ca href=\"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs#authentication-and-configuration\">AWS Terraform Provider Authentication documentation\u003C\u002Fa> for additional details.\u003C\u002Fp>\n\u003Ch2>Creating S3 Buckets\u003C\u002Fh2>\n\u003Cp>The syntax you use for creating resources with Terraform is \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-hcl\">resource &lt;resource_type&gt; &lt;resource_name&gt; { \n  ... resource properties ...\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Below snippet creates an S3 bucket. This bucket is used for storing the source images. Ensure the bucket name is globally unique to avoid any naming conflicts. In addition to the bucket, the snippet also creates two additional resources to ensure that the bucket is private, and cannot be accessed without proper permissions. \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-hcl\">resource &quot;aws_s3_bucket&quot; &quot;src_bucket&quot; {\n  bucket = &quot;src-bucket-some-random-string&quot;\n}\n\nresource &quot;aws_s3_bucket_ownership_controls&quot; &quot;src_bucket_ownership_controls&quot; {\n  bucket = aws_s3_bucket.src_bucket.id\n  rule {\n    object_ownership = &quot;BucketOwnerPreferred&quot;\n  }\n}\n\nresource &quot;aws_s3_bucket_acl&quot; &quot;src_bucket_acl&quot; {\n  depends_on = [aws_s3_bucket_ownership_controls.src_bucket_ownership_controls]\n  bucket = aws_s3_bucket.src_bucket.id\n  acl    = &quot;private&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Duplicate the above Terraform configuration snippet to create another S3 bucket named \u003Ccode>dst_bucket\u003C\u002Fcode>. This bucket will be used to store the generated greeting cards. \u003C\u002Fp>\n\u003Cp>The following commands will initialize a new Terraform project, load all the required dependencies, such as AWS Terraform Provider declared earlier, and deploy resources to your AWS account. \u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Initiates the project, loads required modules\nterraform init  \n\n# Creates the change set, and gives you an overview of what you are deploying\nterraform plan  \n\n# Deploys the actual resources on to your AWS Account\nterraform apply \n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Once successfully deployed, you will see an output similar to below:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">aws_s3_bucket.dst_bucket: Creating...\naws_s3_bucket.src_bucket: Creating...\naws_s3_bucket.dst_bucket: Creation complete after 16s \naws_s3_bucket.src_bucket: Creation complete after 18s \n.....\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Uploading photos to the source S3 bucket\u003C\u002Fh2>\n\u003Cp>Once the \u003Ccode>src_bucket\u003C\u002Fcode> is created, use the \u003Ca href=\"https:\u002F\u002Fs3.console.aws.amazon.com\u002F\">Amazon S3 Console\u003C\u002Fa> to upload an image. You can also do it with \u003Ccode>aws s3 cp\u003C\u002Fcode> command using the \u003Ca href=\"https:\u002F\u002Fawscli.amazonaws.com\u002Fv2\u002Fdocumentation\u002Fapi\u002Flatest\u002Freference\u002Fs3\u002Fcp.html\">AWS CLI\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>The remainder of this guide assumes you&#39;ve uploaded an image to the source S3 bucket named \u003Ccode>johnsmith.jpg\u003C\u002Fcode>, where \u003Ccode>johnsmith\u003C\u002Fcode> is the employee ID. \u003C\u002Fp>\n\u003Ch2>Recap\u003C\u002Fh2>\n\u003Cp>In this chapter you&#39;ve learned how to:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Add the Terraform provider to your \u003Ccode>main.tf\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Configure different methods of providing AWS credentials to Terraform, with emphasis on keeping the secrets secure.\u003C\u002Fli>\n\u003Cli>Create S3 Buckets configured for private access only.\u003C\u002Fli>\n\u003Cli>Initialize the Terraform and deploy your Terraform configuration to your AWS account.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>Next step\u003C\u002Fh2>\n\u003Cp>In the next chapter you will add a Lambda function that generates greeting cards. You will grant it required IAM permissions in order to retrieve images from the source bucket and upload generated greeting cards to the destination bucket.\u003C\u002Fp>\n",{"title":6,"order":7,"authors":8,"resources":12},"3. S3 buckets",3,[9,10,11],"Anton Aleksandrov","Debasis Rath","Matt Ridehalgh",[13,17],{"link":14,"text":15,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs","AWS Terraform Provider","Documentation",{"link":18,"text":19,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fs3_bucket","aws_s3_bucket","Chapters 3-6 of this guide illustrate how to configure the AWS Terraform Provider, create resources, and wire application components together. For simplicity, in these chapters the guide assumes you're using a single Terraform configuration file named `main.tf`. Towards the end of this guide you will learn how to organize your project into an easy-to-maintain, modular multi-environment solution that would work for a large enterprise. \n\n## Adding the AWS Terraform Provider\n\nAWS Terraform Provider allows you to manage the lifecycle of many resource types supported by AWS. The following snippet adds the AWS Terraform Provider to your Terraform project. \n\n```hcl\nterraform {\n  required_providers {\n    aws = {\n      source  = \"hashicorp\u002Faws\"\n      version = \"~> 5.0\"\n    }\n  }\n}\n\nprovider \"aws\" {\n  region = \"us-east-1\" # Replace with your desired region\n}\n```\n\n### Authentication\n\nThe AWS Terraform provider requires valid AWS credentials in order to create and manage resources in your AWS account. There are several ways to achieve this. Configuration of the provider can come from multiple locations and certain locations take precedence over others, see [Terraform Docs](https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs#authentication-and-configuration) for additional details. \n\nWhen authenticating to AWS, we recommend you use an [IAM role](https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fid_roles.html) to grant short-term, temporary security credentials. Such credentials are time-bound, last from a few minutes to several hours, and do not require you to rotate them or explicitly revoke when they’re no longer needed or expire. Temporary security credentials are generated dynamically and provided to the user when they assume the IAM role.\n\n```hcl\nprovider \"aws\" {\n  region = \"us-east-1\"\n  assume_role {\n    role_arn = \".......\"\n  }\n}\n```\n\n#### Environment Variables\n\n> Warning: Storing and using long-term credentials could expose you to a security risk, even if you rotate your AWS credentials regularly. As a best practice, use temporary security credentials (such as IAM roles) instead of creating long-term credentials like access keys. See AWS IAM documentation for [alternatives to long-term access keys](https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fsecurity-creds.html#sec-alternatives-to-long-term-access-keys).\n\nIf you do use access keys with AWS Terraform provider, you should never hard-code them in your IaC files. Export them as environment variables instead. This keeps secrets out of your codebase.\n\n```bash\nexport AWS_ACCESS_KEY_ID=\"your-access-key\"\nexport AWS_SECRET_ACCESS_KEY=\"your-secret-access-key\"\n```\n\nAWS Terraform provider will automatically recognize these environment variables in runtime.\n\nSee [AWS Terraform Provider Authentication documentation](https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs#authentication-and-configuration) for additional details.\n\n## Creating S3 Buckets\n\nThe syntax you use for creating resources with Terraform is \n\n```hcl\nresource \u003Cresource_type> \u003Cresource_name> { \n  ... resource properties ...\n}\n```\n\nBelow snippet creates an S3 bucket. This bucket is used for storing the source images. Ensure the bucket name is globally unique to avoid any naming conflicts. In addition to the bucket, the snippet also creates two additional resources to ensure that the bucket is private, and cannot be accessed without proper permissions. \n\n```hcl\nresource \"aws_s3_bucket\" \"src_bucket\" {\n  bucket = \"src-bucket-some-random-string\"\n}\n\nresource \"aws_s3_bucket_ownership_controls\" \"src_bucket_ownership_controls\" {\n  bucket = aws_s3_bucket.src_bucket.id\n  rule {\n    object_ownership = \"BucketOwnerPreferred\"\n  }\n}\n\nresource \"aws_s3_bucket_acl\" \"src_bucket_acl\" {\n  depends_on = [aws_s3_bucket_ownership_controls.src_bucket_ownership_controls]\n  bucket = aws_s3_bucket.src_bucket.id\n  acl    = \"private\"\n}\n```\n\nDuplicate the above Terraform configuration snippet to create another S3 bucket named `dst_bucket`. This bucket will be used to store the generated greeting cards. \n\nThe following commands will initialize a new Terraform project, load all the required dependencies, such as AWS Terraform Provider declared earlier, and deploy resources to your AWS account. \n\n```bash\n# Initiates the project, loads required modules\nterraform init  \n\n# Creates the change set, and gives you an overview of what you are deploying\nterraform plan  \n\n# Deploys the actual resources on to your AWS Account\nterraform apply \n```\n\nOnce successfully deployed, you will see an output similar to below:\n\n```bash\naws_s3_bucket.dst_bucket: Creating...\naws_s3_bucket.src_bucket: Creating...\naws_s3_bucket.dst_bucket: Creation complete after 16s \naws_s3_bucket.src_bucket: Creation complete after 18s \n.....\n```\n\n## Uploading photos to the source S3 bucket\n\nOnce the `src_bucket` is created, use the [Amazon S3 Console](https:\u002F\u002Fs3.console.aws.amazon.com\u002F) to upload an image. You can also do it with `aws s3 cp` command using the [AWS CLI](https:\u002F\u002Fawscli.amazonaws.com\u002Fv2\u002Fdocumentation\u002Fapi\u002Flatest\u002Freference\u002Fs3\u002Fcp.html).\n\nThe remainder of this guide assumes you've uploaded an image to the source S3 bucket named `johnsmith.jpg`, where `johnsmith` is the employee ID. \n\n## Recap\n\nIn this chapter you've learned how to:\n\n1. Add the Terraform provider to your `main.tf`\n2. Configure different methods of providing AWS credentials to Terraform, with emphasis on keeping the secrets secure.\n3. Create S3 Buckets configured for private access only.\n4. Initialize the Terraform and deploy your Terraform configuration to your AWS account. \n\n## Next step\n\nIn the next chapter you will add a Lambda function that generates greeting cards. You will grant it required IAM permissions in order to retrieve images from the source bucket and upload generated greeting cards to the destination bucket.\n",[22,23,24,25],"content\u002Fcontributors\u002Fanton-aleksandrov.json","content\u002Fcontributors\u002Fdebasis-rath.json","content\u002Fcontributors\u002Fmatt-ridehalgh.json","content\u002Fcontributors\u002Fluis-cerezo.json","LIST","Building Serverless Applications with Terraform","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F03-s3-buckets","4 min",[31],{"title":32,"content":33},"Guide",[34,52,68,75,94,107,122,144,160,175,193],{"title":35,"order":36,"authors":37,"resources":38,"time":29,"path":49,"id":50,"link":51},"1. Introduction",1,[9,10],[39,43,46],{"link":40,"text":41,"type":42},"https:\u002F\u002Faws.amazon.com\u002Fserverless\u002Fsam\u002F","AWS Serverless Application Model (SAM)","link",{"link":44,"text":45,"type":42},"https:\u002F\u002Faws.amazon.com\u002Fcdk\u002F","AWS Cloud Development Kit (CDK)",{"link":47,"text":48,"type":42},"https:\u002F\u002Fwww.terraform.io\u002F","Hashicorp Terraform","01-introduction","01-introduction.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F01-introduction",{"title":53,"order":54,"authors":55,"resources":56,"time":64,"path":65,"id":66,"link":67},"2. Solution Overview",2,[9,10],[57,58,61],{"link":47,"text":48,"type":42},{"link":59,"text":60,"type":42},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fcli\u002Flatest\u002Fuserguide\u002Fgetting-started-install.htm","AWS CLI",{"link":62,"text":63,"type":42},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fiam\u002F","AWS IAM","3 min","02-solution-overview","02-solution-overview.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F02-solution-overview",{"title":6,"order":7,"authors":69,"resources":70,"time":29,"path":73,"id":74,"link":28},[9,10,11],[71,72],{"link":14,"text":15,"type":16},{"link":18,"text":19,"type":16},"03-s3-buckets","03-s3-buckets.md",{"title":76,"order":77,"authors":78,"resources":79,"time":29,"path":91,"id":92,"link":93},"4. Lambda functions",4,[9,10],[80,81,84,87],{"link":14,"text":15,"type":16},{"link":82,"text":83,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Flambda_function","aws_lambda_function",{"link":85,"text":86,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fterraform-support.html","AWS SAM Terraform support",{"link":88,"text":89,"type":90},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fbuilding-serverless-applications-with-terraform\u002Fblob\u002Fmain\u002Flambdas\u002Fgreetings_lambda\u002Findex.mjs","index.mjs","Sample","04-lambda-functions","04-lambda-functions.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F04-lambda-functions",{"title":95,"order":96,"authors":97,"resources":98,"time":29,"path":104,"id":105,"link":106},"5. API Gateway",5,[9,10],[99,100,103],{"link":14,"text":15,"type":16},{"link":101,"text":102,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fapi_gateway_rest_api","aws_api_gateway_rest_api",{"link":85,"text":86,"type":16},"05-api-gateway","05-api-gateway.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F05-api-gateway",{"title":108,"order":109,"authors":110,"resources":111,"time":29,"path":119,"id":120,"link":121},"6. Asynchronous processing",6,[9,10],[112,113,116],{"link":14,"text":15,"type":16},{"link":114,"text":115,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fsqs_queue","aws_sqs_queue",{"link":117,"text":118,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Flambda_event_source_mapping","aws_lambda_event_source_mapping","06-async-processing","06-async-processing.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F06-async-processing",{"title":123,"order":124,"authors":125,"resources":126,"time":140,"path":141,"id":142,"link":143},"7. Observability",7,[9,10],[127,128,131,134,137],{"link":14,"text":15,"type":16},{"link":129,"text":130,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Flambda-monitoring.html","Lambda function observability, monitoring, and troubleshooting",{"linke":132,"text":133,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fapigateway\u002Flatest\u002Fdeveloperguide\u002Frest-api-monitor.html","Monitoring API Gateway REST API",{"link":135,"text":136,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fapi_gateway_account","aws_api_gateway_account",{"link":138,"text":139,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fapi_gateway_stage","aws_api_gateway_stage","5 min","07-observability","07-observability.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F07-observability",{"title":145,"order":146,"authors":147,"resources":148,"time":156,"path":157,"id":158,"link":159},"8. Modularizing your IaC projects",8,[9,10],[149,150,153],{"link":14,"text":15,"type":16},{"link":151,"text":152,"type":16},"https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform\u002Flanguage\u002Fmodules","Terraform Modules",{"link":154,"text":155,"type":90},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fbuilding-serverless-applications-with-terraform","Sample project source code","8 min","08-modularizing-your-iac-projects","08-modularizing-your-iac-projects.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F08-modularizing-your-iac-projects",{"title":161,"order":162,"authors":163,"resources":164,"time":171,"path":172,"id":173,"link":174},"9. Summary and next steps",9,[9,10],[165,166,168,170],{"link":14,"text":15,"type":16},{"link":167,"text":48,"type":16},"https:\u002F\u002Fdeveloper.hashicorp.com\u002Fterraform",{"link":40,"text":169,"type":16},"AWS SAM",{"link":154,"text":155,"type":90},"2 min","09-summary","09-summary.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F09-summary",{"title":176,"order":177,"authors":178,"resources":180,"time":140,"path":190,"id":191,"link":192},"10. Appendix A - Amazon EventBridge",10,[9,10,179],"Luis Cerezo",[181,184,187],{"link":182,"text":183,"type":16},"https:\u002F\u002Fregistry.terraform.io\u002Fproviders\u002Fhashicorp\u002Faws\u002Flatest\u002Fdocs\u002Fresources\u002Fcloudwatch_event_bus","aws_cloudwatch_event_bus Terraform resource",{"link":185,"text":186,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fhealth\u002Flatest\u002Fug\u002Fcloudwatch-events-health.html","Monitoring AWS Health events with Amazon EventBridge",{"link":188,"text":189,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fhealth\u002Flatest\u002Fug\u002Faws-health-planned-lifecycle-events.html#planned-lifecycle-event-notifications","Planned lifecycle events for AWS Health - What should I expect when I receive a planned lifecycle event notification?","10-appendix-A-EventBridge","10-appendix-A-EventBridge.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F10-appendix-A-EventBridge",{"title":194,"order":195,"authors":196,"resources":197,"time":29,"path":206,"id":207,"link":208},"10. Appendix B - AWS Step Functions",11,[9,10,179],[198,201,203],{"link":199,"text":200,"type":16},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Fbest-practices-for-writing-step-functions-terraform-projects\u002F","Best Practices for Writing Step Functions Terraform Projects",{"link":182,"text":202,"type":16},"cloudwatch_event_bus terraform resource",{"link":204,"text":205,"type":16},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fstep-functions\u002Flatest\u002Fdg\u002Fconcepts-amazon-states-language.html","Amazon States Language","10-appendix-B-SFN","10-appendix-B-SFN.md","\u002Fcontent\u002Fguides\u002Fbuilding-serverless-applications-with-terraform\u002F10-appendix-B-SFN",1792665264326]