{"id":1102,"date":"2021-07-24T17:04:22","date_gmt":"2021-07-25T00:04:22","guid":{"rendered":"https:\/\/bullyrooks.com\/?p=1102"},"modified":"2021-07-25T06:53:58","modified_gmt":"2021-07-25T13:53:58","slug":"terraform-centralized-state-management","status":"publish","type":"post","link":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/terraform-centralized-state-management\/","title":{"rendered":"Terraform Centralized State Management"},"content":{"rendered":"\n<p>As we saw in the last course Terraform will manage the state of your application, but by default it stores this locally.  This is not ideal for us and will cause problems when we try to work with others or create a continuous deployment pipeline.  Now we&#8217;ll create a way to store the state in AWS.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create the State Peristance<\/h2>\n\n\n\n<p>We&#8217;ll be following the official terraform documentation <a href=\"https:\/\/www.terraform.io\/docs\/language\/settings\/backends\/s3.html\">from here<\/a>.<\/p>\n\n\n\n<p>First make a S3 bucket manually.  Although we could use Terraform to create and manage this, it will cause us problems.  Ideally, you would use a separate &#8216;infrastructure&#8217; project to handle this (and other things like databases that you don&#8217;t want to accidentally rollback).  That will be a separate effort and doing it manually for now will be sufficient.<\/p>\n\n\n\n<p>Go to the AWS console and find the S3 service page.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"164\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23-1024x175.png?resize=960%2C164&#038;ssl=1\" alt=\"\" class=\"wp-image-1103\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=1024%2C175&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=300%2C51&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?resize=768%2C131&amp;ssl=1 768w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-23.png?w=1490&amp;ssl=1 1490w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Click <code>Create bucket<\/code> and set the minimum configuration.  You only need to set a name, accept all of the other defaults.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"848\" height=\"498\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-25.png?resize=848%2C498&#038;ssl=1\" alt=\"\" class=\"wp-image-1105\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-25.png?w=848&amp;ssl=1 848w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-25.png?resize=300%2C176&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-25.png?resize=768%2C451&amp;ssl=1 768w\" sizes=\"auto, (max-width: 848px) 100vw, 848px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Now go ahead and make a DynamoDB table.  First navigate to DynamoDB in the console.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"228\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-26.png?resize=960%2C228&#038;ssl=1\" alt=\"\" class=\"wp-image-1106\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-26.png?w=1000&amp;ssl=1 1000w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-26.png?resize=300%2C71&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-26.png?resize=768%2C183&amp;ssl=1 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Click <code>Create table<\/code>.  Add a name, but the primary key <em>must<\/em> be <strong><code>LockID<\/code><\/strong> exactly with a String type.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"631\" height=\"292\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-27.png?resize=631%2C292&#038;ssl=1\" alt=\"\" class=\"wp-image-1107\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-27.png?w=631&amp;ssl=1 631w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-27.png?resize=300%2C139&amp;ssl=1 300w\" sizes=\"auto, (max-width: 631px) 100vw, 631px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Uncheck <code>Use default settings<\/code> and change <code>Read\/write capacity mode<\/code> to <code>On-demand<\/code><\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"221\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-28.png?resize=960%2C221&#038;ssl=1\" alt=\"\" class=\"wp-image-1108\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-28.png?w=983&amp;ssl=1 983w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-28.png?resize=300%2C69&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-28.png?resize=768%2C177&amp;ssl=1 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Since we&#8217;re only using this for state management, we don&#8217;t expect to be using this table often enough to justify leaving a server up.  I <em>think<\/em> there&#8217;s a free tier eligible DynamoDB, but I&#8217;m not sure how to configure it and I&#8217;m very scared about unexpected costs, so this works for me (but if you can figure out how to do it for free with the provisioned configuration I&#8217;d be glad to update the docs)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Update the Terraform Configuration<\/h2>\n\n\n\n<p>Make a new branch<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git checkout -b cloud-state<\/code><\/pre>\n\n\n\n<p>Now we need to tell Terraform to use the cloud state management.  <\/p>\n\n\n\n<p>First, create some new variables in <code>variables.tf<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>variable \"s3_bucket\" {\r\n  default = \"helloworld-lambda-state\"\r\n}\r\nvariable \"s3_key\" {\r\n  default = \"global\/s3\/terraform.tfstate\"\r\n}\r\nvariable \"dynamo_lock\" {\r\n  default = \"helloworld-lambda-state-lock\"\r\n}\r\n<\/code><\/pre>\n\n\n\n<p>Add these lines to <code>main.tf<\/code> (after the <code>provider<\/code> clause)<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">data \"aws_caller_identity\" \"current\" {}\r\n\r\nterraform {\r\n  backend \"s3\" {\r\n    # Replace this with your bucket name!\r\n    bucket = \"helloworld-lambda-state\"\r\n    encrypt = true\r\n    key = \"global\/s3\/terraform.tfstate\"\r\n    region = \"us-east-1\"\r\n    shared_credentials_file = \"\/Users\/brian\/.aws\/bullyrook\/credentials\"\r\n    # Replace this with your DynamoDB table name!\r\n    dynamodb_table = \"helloworld-lambda-state-lock\"\r\n\r\n  }\r\n}\r<\/pre>\n\n\n\n<p>This is going to tell terraform to look for (and create if necessary) the state managment in the bucket and table we just created.  Additionally, we need to grant access to the bucket and link it to the role that we created previously.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Create the State<\/h2>\n\n\n\n<p>We&#8217;ll need to terraform init first<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ terraform init<\/code><\/pre>\n\n\n\n<p>and then apply<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ terraform apply\n...\naws_lambda_permission.helloWorld-permission: Creation complete after 1s &#91;id=terraform-20210724235555315200000002]\r\nReleasing state lock. This may take a few moments...\r\n\r\nApply complete! Resources: 7 added, 0 changed, 0 destroyed.\r\n\r\n<\/code><\/pre>\n\n\n\n<p>and we should see it create our infrastructure and the state file in the bucket and a lock entry in the database<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"37\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-29-1024x39.png?resize=960%2C37&#038;ssl=1\" alt=\"\" class=\"wp-image-1110\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-29.png?resize=1024%2C39&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-29.png?resize=300%2C11&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-29.png?resize=768%2C29&amp;ssl=1 768w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-29.png?w=1185&amp;ssl=1 1185w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"960\" height=\"380\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-30-1024x405.png?resize=960%2C380&#038;ssl=1\" alt=\"\" class=\"wp-image-1111\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-30.png?resize=1024%2C405&amp;ssl=1 1024w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-30.png?resize=300%2C119&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-30.png?resize=768%2C304&amp;ssl=1 768w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-30.png?w=1242&amp;ssl=1 1242w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"868\" height=\"424\" src=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-31.png?resize=868%2C424&#038;ssl=1\" alt=\"\" class=\"wp-image-1112\" srcset=\"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-31.png?w=868&amp;ssl=1 868w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-31.png?resize=300%2C147&amp;ssl=1 300w, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-31.png?resize=768%2C375&amp;ssl=1 768w\" sizes=\"auto, (max-width: 868px) 100vw, 868px\" data-recalc-dims=\"1\" \/><\/figure>\n\n\n\n<p>Let&#8217;s destroy everything first before we start the next step which will be creating a github action to build and deploy this lambda whenever we merge to <code>main<\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ terraform destroy<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Commit and Merge<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>$ git status\n$ git add .\n$ git commit -m \"state in aws configuration\"\n$ git push --set-upstream origin cloud-state\n$ git checkout main\n$ git merge cloud-state\n$ git push<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<div class=\"entry-summary\">\nAs we saw in the last course Terraform will manage the state&hellip;\n<\/div>\n<div class=\"link-more\"><a href=\"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/terraform-centralized-state-management\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &ldquo;Terraform Centralized State Management&rdquo;<\/span>&hellip;<\/a><\/div>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[142,146,77,148,44,147,144,143,50,42,43,145],"course":[141],"class_list":["post-1102","post","type-post","status-publish","format-standard","hentry","category-software-development","tag-aws","tag-aws-gateway","tag-cicd","tag-functions","tag-github","tag-github-actions","tag-java","tag-lambda","tag-maven","tag-spring","tag-spring-boot","tag-terraform","course-spring-boot-lambda-on-aws","entry"],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":1115,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/automated-terraform-deploy-using-github-actions\/","url_meta":{"origin":1102,"position":0},"title":"Automated Terraform Deploy Using Github Actions","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"Now we just need to build and deploy our application automatically so that whenever we push changes to the main branch, they'll automatically become available through our endpoint. Create Our Artifact Storage We're going to use a 'poor man's artifactory' to store our compiled .jar files. With our current build\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-34.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":1094,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/terraform-setup-and-first-install\/","url_meta":{"origin":1102,"position":1},"title":"Terraform Setup and First Install","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"Terraform is a system that allows you to define your infrastructure in a series of configuration files. These configuration files are linked to a provider library which will execute the infrastructure create, update and teardown commands on the platform you want to deploy to. This is called \"Infrastructure as Code\"\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-19.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1081,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/24\/spring-boot-lambda-api-implementation\/","url_meta":{"origin":1102,"position":2},"title":"Spring Boot Lambda API Implementation","author":"Bullyrook","date":"July 24, 2021","format":false,"excerpt":"We've got a 'working' lambda now, but we can't actually use it anywhere. The easiest thing to do at this point is add an API Gateway trigger to our function as a new lambda. This will require a little bit of work to make an API Gateway adapter to our\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-10.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1133,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/25\/confirming-the-continuous-deployment-pipeline\/","url_meta":{"origin":1102,"position":3},"title":"Confirming the Continuous Deployment Pipeline","author":"Bullyrook","date":"July 25, 2021","format":false,"excerpt":"Lets verify that changes to our application will be automatically available when they're pushed up. Update the Application Let's start a new branch $ git checkout -b \"greeting-change\" Now update our service to return a different greeting: @Component public class HelloWorldService { public HelloWorld helloWorld(String name) { return HelloWorld.builder() .response(\"G'Day,\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-48.png?resize=1050%2C600&ssl=1 3x"},"classes":[]},{"id":1065,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/23\/spring-boot-lambda-prerequisites\/","url_meta":{"origin":1102,"position":4},"title":"Spring Boot Lambda Prerequisites","author":"Bullyrook","date":"July 23, 2021","format":false,"excerpt":"In this course we're going to build a very simple spring boot lambda, deploy it manually to AWS to make sure that it works and then automate the deployment using Terraform and github actions. This will allow us to automatically build and deploy changes from a commit to the main\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":1069,"url":"https:\/\/bullyrooks.com\/index.php\/2021\/07\/23\/spring-boot-lambda-implementation\/","url_meta":{"origin":1102,"position":5},"title":"Spring Boot Lambda Implementation","author":"Bullyrook","date":"July 23, 2021","format":false,"excerpt":"Now we're going to add some code. I'm going to follow my ports and adapters method of building a DTO and value object that I've used previously. Yes, its a bit of overkill for this project (especially a hello world example), but if you're using this course as a springboard\u2026","rel":"","context":"In &quot;Software Development&quot;","block_context":{"text":"Software Development","link":"https:\/\/bullyrooks.com\/index.php\/category\/software-development\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/bullyrooks.com\/wp-content\/uploads\/2021\/07\/image-4.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1102","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/comments?post=1102"}],"version-history":[{"count":3,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1102\/revisions"}],"predecessor-version":[{"id":1114,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/posts\/1102\/revisions\/1114"}],"wp:attachment":[{"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/media?parent=1102"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/categories?post=1102"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/tags?post=1102"},{"taxonomy":"course","embeddable":true,"href":"https:\/\/bullyrooks.com\/index.php\/wp-json\/wp\/v2\/course?post=1102"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}