{"id":2298,"date":"2018-03-29T08:26:37","date_gmt":"2018-03-29T12:26:37","guid":{"rendered":"http:\/\/blog.domb.net\/?p=2298"},"modified":"2018-03-31T17:58:47","modified_gmt":"2018-03-31T21:58:47","slug":"cloudforms-in-aws-part-2","status":"publish","type":"post","link":"https:\/\/blog.domb.net\/?p=2298","title":{"rendered":"CloudForms in AWS part 2"},"content":{"rendered":"<p>This part of the CloudForms in AWS blog series will walk you through how to make sure that CloudForms reaches its full potential in AWS.<\/p>\n<p><strong>IMPORTANT<\/strong>: If you want SmartState analysis to work you need to register your AWS account with the <strong>cloud access<\/strong> program. Use the link below to enable cloud access:<\/p>\n<p><a href=\"https:\/\/engage.redhat.com\/forms\/cloud-access-registration\">https:\/\/engage.redhat.com\/forms\/cloud-access-registration<\/a><\/p>\n<p>Once you&#8217;ve registered and got confirmation you will see the <strong>RHEL-Atomic_7.4_HVM_GA-20180104-x86_64-1-Access2-GP2<\/strong> AMI under the &#8220;Private images&#8221; tab<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2333\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-12-at-9.26.50-AM.png\" alt=\"\" width=\"1770\" height=\"621\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-12-at-9.26.50-AM.png 1770w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-12-at-9.26.50-AM-300x105.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-12-at-9.26.50-AM-768x269.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-12-at-9.26.50-AM-1024x359.png 1024w\" sizes=\"auto, (max-width: 1770px) 100vw, 1770px\" \/><\/p>\n<p>Before we configure CloudForms we need go to the AWS console and create the<strong> SNS topic<\/strong> for <strong>AWSConfig<\/strong> so that CloudForms can subscribe to messages. SNS stands for simple notification service. It enables CloudForms to subscribe to a topic which contains information about configuration change of AWS resources.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2300\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.31.22-PM.png\" alt=\"\" width=\"902\" height=\"316\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.31.22-PM.png 902w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.31.22-PM-300x105.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.31.22-PM-768x269.png 768w\" sizes=\"auto, (max-width: 902px) 100vw, 902px\" \/><\/p>\n<p>Once created you should see the following:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2301\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.32.39-PM.png\" alt=\"\" width=\"718\" height=\"177\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.32.39-PM.png 718w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.32.39-PM-300x74.png 300w\" sizes=\"auto, (max-width: 718px) 100vw, 718px\" \/><\/p>\n<p>Next, create an AWS S3 bucket to store logs of AWS Config and CloudTrail (api logs).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2347\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-9.25.38-AM.png\" alt=\"\" width=\"695\" height=\"665\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-9.25.38-AM.png 695w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-9.25.38-AM-300x287.png 300w\" sizes=\"auto, (max-width: 695px) 100vw, 695px\" \/><\/p>\n<p>Enable AWS Config and make sure to choose the created S3 bucket as well as the SNS topic we created above.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2351\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.21.59-PM.png\" alt=\"\" width=\"785\" height=\"880\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.21.59-PM.png 785w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.21.59-PM-268x300.png 268w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.21.59-PM-768x861.png 768w\" sizes=\"auto, (max-width: 785px) 100vw, 785px\" \/><\/p>\n<p>To get events via CloudWatch and CloudTrail we will need to configure a new trail in CloudTrail. In CloudTrail create a new Trail with the following information. As you can see we can also reuse the previously created S3 bucket to store the logs.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2352\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM.png\" alt=\"\" width=\"1159\" height=\"869\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM.png 1159w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM-300x225.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM-768x576.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM-1024x768.png 1024w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.36.23-PM-285x214.png 285w\" sizes=\"auto, (max-width: 1159px) 100vw, 1159px\" \/><\/p>\n<p>The last step to get events properly delivered through SNS is to create a new CloudWatch event rule.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2353\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.38.19-PM.png\" alt=\"\" width=\"1505\" height=\"773\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.38.19-PM.png 1505w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.38.19-PM-300x154.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.38.19-PM-768x394.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-20-at-5.38.19-PM-1024x526.png 1024w\" sizes=\"auto, (max-width: 1505px) 100vw, 1505px\" \/><\/p>\n<p>If you&#8217;ve done everything correctly, CloudForms will automatically create a new SQS queue named manageiq-awsconfig-queue which pulls data from the SNS AWSConfig_topic:<\/p>\n<pre class=\"lang:default decode:true \">INFO -- : MIQ(ManageIQ::Providers::Amazon::CloudManager::EventCatcher::Stream#) Amazon SQS Queue manageiq-awsconfig-queue-5f61a1e9-6555-4f06-9c37-f3e6b7539a86 does not exist; creating queue\r\nINFO -- : MIQ(ManageIQ::Providers::Amazon::CloudManager::EventCatcher::Stream#) Subscribing Queue https:\/\/sqs.us-east-1.amazonaws.com\/XXXXXXXXXXX\/manageiq-awsconfig-queue-5f61a1e9-6555-4f06-9c37-f3e6b7539a86 to arn:aws:sns:us-east-1:XXXXXXXXX:AWSConfig_topic\r\nINFO -- : MIQ(ManageIQ::Providers::Amazon::CloudManager::EventCatcher::Stream#) Created Amazon SQS Queue manageiq-awsconfig-queue-5f61a1e9-6555-4f06-9c37-f3e6b7539a86 and subscribed to AWSConfig_topic<\/pre>\n<p>Also, you test the for incoming events by stopping and starting an instance. This should be caught by the event catcher<\/p>\n<pre class=\"lang:default decode:true \">INFO -- : MIQ(ManageIQ::Providers::Amazon::CloudManager::EventCatcher::Stream#) Found SNS Message with message type AWS_API_CALL_StartInstances coming from \r\nINFO -- : MIQ(ManageIQ::Providers::Amazon::CloudManager::EventCatcher::Stream#) Parsed event from SNS Message AWS_API_CALL_StartInstances coming from \r\n<\/pre>\n<p>Next and this is kind of optional if you assigned CloudForms to an Admin Role. If\u00a0CloudForms is in the power user policy you have to perform this actions as Power User does not have access to IAM! The new smart state analysis in CloudForms is supposed to create the correct roles, policies and instance profiles for you. I prefer to create the policy myself for two main reasons. I prefer to create the policy myself for two main reasons.<\/p>\n<ol>\n<li>I know exactly what is happening<\/li>\n<li>When having CloudForms create the policies you might run into a race condition and CloudForms will complain about &#8220;No agent is set up to process requests: Value (smartstate) for parameter iamInstanceProfile.name is invalid. Invalid IAM Instance Profile name&#8221;<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400\">Create a trust policy for the role smartstate. Name the file ec2trustpolicy.json<\/span><\/p>\n<pre class=\"lang:default decode:true \">{\r\n\u00a0\"Version\": \"2012-10-17\",\r\n\u00a0\"Statement\": {\r\n\u00a0\u00a0\u00a0\"Effect\": \"Allow\",\r\n\u00a0\u00a0\u00a0\"Principal\": {\"Service\": \"ec2.amazonaws.com\"},\r\n\u00a0\u00a0\u00a0\"Action\": \"sts:AssumeRole\"\r\n\u00a0}\r\n}<\/pre>\n<p>Go ahead and create the role smartstate<\/p>\n<pre class=\"lang:default decode:true\">[ec2-user@ip-172-31-14-85 ~]$ aws iam create-role --role-name smartstate --assume-role-policy-document file:\/\/ec2trustpolicy.json<\/pre>\n<p>We now create a custom policy which we will assign to the smartstate\u00a0role.<\/p>\n<pre class=\"lang:default decode:true\">[ec2-user@ip-172-31-14-85 ~]$cat ssa_cfme_policy.json\r\n{\r\n\u00a0\u00a0\u00a0\"Version\": \"2012-10-17\",\r\n\u00a0\u00a0\u00a0\"Statement\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Effect\": \"Allow\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Action\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"ec2:*\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"s3:*\",\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"sqs:*\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0],\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"Resource\": [\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\"*\"\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0]\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0]\r\n}\r\n<\/pre>\n<p>Add the policy to the role smartstate<\/p>\n<pre class=\"lang:default decode:true \">[ec2-user@ip-172-31-14-85 ~]$ aws iam put-role-policy --role-name smartstate --policy-name cfmepermissions --policy-document file:\/\/ssa_cfme_policy.json<\/pre>\n<p>The next step is to create the instance profile. This is needed that the smartstate\u00a0instance is allowed to perform actions against s3,sqs\u00a0and ec2<\/p>\n<pre class=\"lang:default decode:true \">[ec2-user@ip-172-31-14-85 ~]$ aws iam create-instance-profile --instance-profile-name smartstate\r\n\r\n[ec2-user@ip-172-31-14-85 ~]$ aws iam add-role-to-instance-profile --instance-profile-name smartstate --role-name smartstate<\/pre>\n<p>Finally, you can now login to CloudForms.<\/p>\n<p>On the top right corner go and click configure:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2304\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.49.33-PM.png\" alt=\"\" width=\"267\" height=\"243\" \/><\/p>\n<p>Turn on the smartproxy\u00a0under roles. We will need that for the smart state analysis<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2305\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.50.21-PM.png\" alt=\"\" width=\"250\" height=\"34\" \/><\/p>\n<p>Next click on the advanced tab on the right. Now, this is <strong>SUPER important!<\/strong> The OOTB configuration is not going to work. Search for\u00a0agent_ami_login_user and change the value from ec2-user to cloud-user. It should look like this:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2306\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.53.38-PM.png\" alt=\"\" width=\"615\" height=\"235\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.53.38-PM.png 615w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.53.38-PM-300x115.png 300w\" sizes=\"auto, (max-width: 615px) 100vw, 615px\" \/><\/p>\n<p>This is the user CloudForms will login with when it will initiate a smartstate analysis.<\/p>\n<p>Finally let&#8217;s add the aws\u00a0provider. You should be familiar with what access and secret keys you need to add. Important, CloudForms will need at least poweruser\u00a0access.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2307\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.57.24-PM.png\" alt=\"\" width=\"1014\" height=\"484\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.57.24-PM.png 1014w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.57.24-PM-300x143.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.57.24-PM-768x367.png 768w\" sizes=\"auto, (max-width: 1014px) 100vw, 1014px\" \/><\/p>\n<p>Next hit validate on save. Don&#8217;t bother filling out the &#8220;SmartState Docker&#8221; tab as it doesn&#8217;t do anything if you fill it out at the same time.<\/p>\n<p>Once saved go edit the provider again. Now go to the SmartState Docker tab. I am wondering who named these fields and the comment below. Would have been better to\u00a0say &#8220;<em>Use registry.access.redhat.com credentials or RHN credentials required to perform &#8230;.<\/em>&#8220;. What you need is your RHN credentials. These are needed so that you can pull the smartstate\u00a0image from the redhat\u00a0docker registry.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2308\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.56.33-PM.png\" alt=\"\" width=\"1301\" height=\"231\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.56.33-PM.png 1301w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.56.33-PM-300x53.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.56.33-PM-768x136.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-9.56.33-PM-1024x182.png 1024w\" sizes=\"auto, (max-width: 1301px) 100vw, 1301px\" \/><\/p>\n<p>Hit save and your done.<\/p>\n<p>You have now configured everything to perform a smartstate\u00a0analysis in AWS.<\/p>\n<p>Go to your AWS provider and click on an instance. Under the instance configurations tab click<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2310\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.04.00-PM.png\" alt=\"\" width=\"336\" height=\"94\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.04.00-PM.png 336w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.04.00-PM-300x84.png 300w\" sizes=\"auto, (max-width: 336px) 100vw, 336px\" \/><\/p>\n<p>You can then go to the top right corner and click on Configuration -&gt; tasks. You should see something like this<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2314\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.09.48-PM.png\" alt=\"\" width=\"1868\" height=\"66\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.09.48-PM.png 1868w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.09.48-PM-300x11.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.09.48-PM-768x27.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.09.48-PM-1024x36.png 1024w\" sizes=\"auto, (max-width: 1868px) 100vw, 1868px\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2317\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.14.14-PM.png\" alt=\"\" width=\"1871\" height=\"59\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.14.14-PM.png 1871w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.14.14-PM-300x9.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.14.14-PM-768x24.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.14.14-PM-1024x32.png 1024w\" sizes=\"auto, (max-width: 1871px) 100vw, 1871px\" \/><\/p>\n<p>When everything is finished you will see<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2311\" src=\"http:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.07.17-PM.png\" alt=\"\" width=\"1447\" height=\"515\" srcset=\"https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.07.17-PM.png 1447w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.07.17-PM-300x107.png 300w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.07.17-PM-768x273.png 768w, https:\/\/blog.domb.net\/wp-content\/uploads\/Screen-Shot-2018-03-11-at-10.07.17-PM-1024x364.png 1024w\" sizes=\"auto, (max-width: 1447px) 100vw, 1447px\" \/><\/p>\n<p>The next post is going to be for the geeks under us. It will explain what is going on under the hood when smart state happens.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This part of the CloudForms in AWS blog series will walk you through how to make sure that CloudForms reaches its full potential in AWS. IMPORTANT: If you want SmartState analysis to work you need to register your AWS account with the cloud access program. Use the link below to enable cloud access: https:\/\/engage.redhat.com\/forms\/cloud-access-registration Once&#8230;<\/p>\n","protected":false},"author":2,"featured_media":2048,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"categories":[37],"tags":[144,108,29,57,143],"class_list":["post-2298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloudforms","tag-analysis","tag-aws","tag-cloudforms","tag-introspection","tag-smartstate"],"_links":{"self":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/2298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2298"}],"version-history":[{"count":18,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/2298\/revisions"}],"predecessor-version":[{"id":2397,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/posts\/2298\/revisions\/2397"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=\/wp\/v2\/media\/2048"}],"wp:attachment":[{"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.domb.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}