Skip to content

Commit 42543d4

Browse files
authored
Merge pull request #1608 from future-architect/feature
Terraform コードハイライト改良
2 parents d96e646 + 216b53e commit 42543d4

13 files changed

Lines changed: 64 additions & 71 deletions

scripts/register_hljs_terraform.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const hljs = require('highlight.js');
55
const registerTerraform = require('highlightjs-terraform/terraform');
66
registerTerraform(hljs);
77

8+
// hexo filterで用いるヘルパー関数
89
const terraformFilter = (data) => {
910
if (data.layout !== 'post' && data.layout !== 'page') {
1011
return;
@@ -18,6 +19,9 @@ const terraformFilter = (data) => {
1819
// 'hljs-' プレフィックスを全て除去
1920
const codeWithoutPrefix = highlighted.value.replace(/hljs-/g, '');
2021

22+
// 空行を <span class="line"></span><br> に置換し、marked 側で <p> を差し込まれるのを防ぐ
23+
const escapedHTML = codeWithoutPrefix.split('\n\n').join('\n<span class="line"></span>\n');
24+
2125
const captionText = meta.trim();
2226
let finalHtml = '';
2327

@@ -29,7 +33,7 @@ const terraformFilter = (data) => {
2933
finalHtml += `<figcaption><span>${captionText}</span></figcaption>`;
3034
}
3135

32-
finalHtml += `<table><tbody><tr><td class="code"><pre>${codeWithoutPrefix}</pre></td></tr></tbody></table></figure>`;
36+
finalHtml += `<table><tbody><tr><td class="code"><pre>${escapedHTML}</pre></td></tr></tbody></table></figure>`;
3337

3438
// 元のインデントを維持して返す
3539
return indent + finalHtml;

source/_posts/2024/20240312a_Terraform連載2024_hclwriteを用いたtfコード生成入門.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ Terraformファイルをコード生成するため、hclwriteというGoパッ
2424

2525
ある複数のリソースをセットで定義する設計開発ルールがあったとします。AWSの例ですが、以下のようにDynamoDBとその監視をCloudwatch Metricsを用いてセットで行いたいとします。
2626

27-
```sh
27+
```tf
2828
# DynamoDB
2929
resource "aws_dynamodb_table" "myproduct_read" {
3030
name = "${terraform.workspace}-myproduct-read"
@@ -159,7 +159,7 @@ Blockとはなにかですが、 `resource`、`module`、`locals` のようなTe
159159

160160
次のようなファイルがあるとします。
161161

162-
```sh dynamodb_table.tf
162+
```tf dynamodb_table.tf
163163
resource "aws_dynamodb_table" "myproduct_read" {
164164
name = "${terraform.workspace}-myproduct-read"
165165
billing_mode = "PAY_PER_REQUEST"

source/_posts/2024/20240313a_terraformにおける変数の制御について.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Terraformには型による制約の他に、下記3種類の変数の制御方
5050

5151
このブロックの`condition`の内容で真偽を判定し、偽の場合`error_message`で指定のエラーメッセージを出力できます。
5252

53-
```sh
53+
```tf
5454
resource "aws_instance" "example" {
5555
ami = "ami-020283e959651b381"
5656
instance_type = "t2.micro"
@@ -102,7 +102,7 @@ variable "ebs_encryption" {
102102
103103
`lifecycle`ブロック内に`precondition`ブロックを作成し、`condition`の条件で真偽を判定し、偽の場合に`error_message`に記載されているメッセージを出力できます。
104104
105-
```sh
105+
```tf
106106
data "aws_ec2_instance_type" "example" {
107107
instance_type = "c5.xlarge"
108108
}
@@ -150,7 +150,7 @@ resource "aws_instance" "example" {
150150
151151
例としてオートスケーリンググループを作成する際、AZが2つ以上あるかどうかをチェックしたい場合を考えます。書き方は`precondition`と同様で、`postcondition`ブロックの`condition`でAZの数が1よりも大きくない場合に指定のエラーメッセージを出力するようにします。
152152
153-
```sh
153+
```tf
154154
resource "aws_launch_configuration" "example" {
155155
image_id = "ami-020283e959651b381"
156156
instance_type = "t2.micro"
@@ -252,7 +252,7 @@ Plan: 2 to add, 0 to change, 0 to destroy.
252252
253253
インスタンスタイプの選定で`precondition`を使いましたが、`precondition``postcondition`と単純に置き換えてみたらどうなるでしょうか?
254254
255-
```sh
255+
```tf
256256
data "aws_ec2_instance_type" "example" {
257257
instance_type = "c5.xlarge"
258258
}

source/_posts/2024/20240315a_サービスの多国展開を支えるTerraform構成.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ IaCを利用してインフラを構成することで、構築忘れや設定
4646

4747
以下のように環境、リージョン[^1]をそれぞれディレクトリ分けして管理します。
4848

49-
```
49+
```sh
5050
envs
5151
├── modules
5252
│ └── ...
@@ -89,7 +89,7 @@ data "google_project" "my_project" {
8989

9090
以下のように環境をそれぞれディレクトリ分けして管理します。
9191

92-
```
92+
```sh
9393
envs
9494
├── modules
9595
│ └── ...
@@ -149,7 +149,7 @@ Terraform Workspaceは機能として存在するものの、開発環境を区
149149
ちょっとした亜種ですが、Workspace名をそのまま変数として持ってきてリソースに適用することも可能です。
150150
**※この場合は、Workspace名に`asia-northeast1``australia-southeast1`を使う必要があります。**
151151

152-
```sh storage_bucket.tf
152+
```tf storage_bucket.tf
153153
resource "google_storage_bucket" "bucket" {
154154
...
155155
location = terraform.workspace
@@ -160,7 +160,7 @@ resource "google_storage_bucket" "bucket" {
160160

161161
以下のようなディレクトリ構成で管理します。
162162

163-
```
163+
```sh
164164
envs
165165
├── modules
166166
│ └── ...
@@ -196,7 +196,7 @@ usage () {
196196
cat <<"EOM"
197197
Options:
198198
-h: Show this help
199-
-c: city: Specify region's city name
199+
-c: city: Specify region's city name
200200
-e: environment: Specify enviroment
201201
EOM
202202
exit 1

source/_posts/2024/20240318a_cfn-guardを使ってTerraformをポリシーチェックしようとした話.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ Terraformのポリシーチェックとしては、過去にFuture技術ブロ
6666

6767
下記のようにS3バケットを作成するHCLファイルがあったとしましょう。
6868

69-
```sh
69+
```tf
7070
# provider等は省略します
7171
resource "aws_s3_bucket" "my_bucket" {
7272
bucket = "my-bucket"
@@ -167,8 +167,8 @@ rule aws_s3_bucket_rule when %aws_s3_bucket_resources !empty {
167167
%aws_s3_bucket_resources.values.bucket == /^test-.*/
168168

169169
# "env" タグが必ず含まれること
170-
let required_tags = %aws_s3_bucket_resources.values.tags_all[
171-
Key == 'env' ]
170+
let required_tags = %aws_s3_bucket_resources.values.tags_all[
171+
Key == 'env' ]
172172
%required_tags[*] {
173173
Value IN ['dev', 'stg', 'prod', 'demo']
174174
<<Tag must have a permitted value>>

source/_posts/2024/20240321a_Terraform連載2024_テストとモックを使ってみる.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -75,14 +75,14 @@ S3 バケットを作成し、そのS3 バケット名が期待する名前な
7575
コードは、以下です。
7676
`backend.tf` を省略していますが、よしなにお願いします。
7777

78-
```sh local.tf
78+
```tf local.tf
7979
locals {
8080
project_name = "sample"
8181
region = "ap-northeast-1"
8282
}
8383
```
8484

85-
```sh s3_bucket.tf
85+
```tf s3_bucket.tf
8686
resource "aws_s3_bucket" "test001" {
8787
bucket = "${terraform.workspace}-${local.project_name}-test001"
8888
tags = {
@@ -92,7 +92,7 @@ resource "aws_s3_bucket" "test001" {
9292
}
9393
```
9494

95-
```sh versions.tf
95+
```tf versions.tf
9696
terraform {
9797
required_version = "~> 1.7.5"
9898
required_providers {
@@ -112,7 +112,7 @@ provider "aws" {
112112
conditionに記述したS3 バケット名と実際のS3 バケット名を比較して問題ないかをチェックしています。
113113
仮に期待していない値の場合は、`error_message`の値が出力されます。
114114

115-
```sh s3_bucket.tftest.hcl
115+
```hcl s3_bucket.tftest.hcl
116116
run "test" {
117117
assert {
118118
condition = aws_s3_bucket.test.bucket == "${terraform.workspace}-${local.project_name}-test"
@@ -181,7 +181,7 @@ terraform test -test-directory=hoge
181181

182182
今回は、`apply`を実行したのですが、`plan`を実行したいときは、以下のように`command` 指定します。
183183

184-
```sh s3_bucket.tftest.hcl
184+
```tf s3_bucket.tftest.hcl
185185
run "test" {
186186
command = plan
187187
assert {
@@ -225,7 +225,7 @@ sample.tftest.hcl... in progress
225225
`terraform test` をベースに作成しているため差分のみを記載します。
226226
以下にモック用のプロバイダを指定します。
227227

228-
```sh mocked_providers.tftest.hcl
228+
```tf mocked_providers.tftest.hcl
229229
mock_provider "aws" {
230230
alias = "fake"
231231
}
@@ -239,7 +239,7 @@ run "use_mocked_provider" {
239239

240240
`versions.tf`のprovider 定義を削除します。
241241

242-
```sh versions.tf
242+
```tf versions.tf
243243
terraform {
244244
required_version = "~> 1.7.5"
245245
required_providers {
@@ -272,7 +272,7 @@ Success! 2 passed, 0 failed.
272272

273273
もしモックと`terraform test`のように実際のリソースに対してテストを行いたい場合は、以下のプロバイダ指定で行うことができます。
274274

275-
```sh mocked_providers.tftest.hcl
275+
```tf mocked_providers.tftest.hcl
276276
provider "aws" {}
277277
278278
mock_provider "aws" {

source/_posts/2024/20240325a_Azure環境Terraform実行におけるリソースプロバイダーについて.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ Azure環境でTerraformを利用する際、裏で動いているリソースプ
3030
見やすいように改行等追加しています。
3131

3232
```shell
33-
Original Error: Cannot register providers:
33+
Original Error: Cannot register providers:
3434
Microsoft.ServiceBus,
3535
Microsoft.DBforPostgreSQL,
3636
(中略)...
@@ -86,7 +86,7 @@ AzureにおけるTerraformプロバイダーとしては下記が用意されて
8686

8787
あるいは環境変数`ARM_SKIP_PROVIDER_REGISTRATION`を設定することも可能とのことです。
8888

89-
```sh terraform
89+
```tf terraform
9090
provider "azurerm" {
9191
skip_provider_registration = true
9292
features {}

source/_posts/2024/20240327a_手動運用しているCloudflareをTerraformでInfrastructure_as_Codeする.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ tag:
99
category:
1010
- Infrastructure
1111
thumbnail: /images/20240327a/thumbnail.png
12-
author: 大岩潤矢
12+
author: 大岩潤矢
1313
lede: "Cloudflareで管理しているドメインのDNS設定や、Cloudflare Pages等のサービスの設定を、Terraform管理に移行した際の手順等を、備忘録がてら記載します。"
1414
---
1515
## はじめに
@@ -176,9 +176,9 @@ Terraformのバージョン情報やプロパイダの設定、tfstateの配置
176176
- Pages: `global/pages/プロジェクト名.tfstate`
177177
- Workers: `global/workers/プロジェクト名.tfstate`
178178

179-
```sh setup.tf
179+
```tf setup.tf
180180
terraform {
181-
// terraformのバージョン設定
181+
# terraformのバージョン設定
182182
required_version = "~> 1.7.5"
183183
184184
// cloudflareプロバイダを利用
@@ -189,7 +189,7 @@ terraform {
189189
}
190190
}
191191
192-
// tfstateの保存先の設定。R2 Storageを使用する
192+
# tfstateの保存先の設定。R2 Storageを使用する
193193
backend "s3" {
194194
endpoints = {
195195
s3 = "https://<アカウントID>.r2.cloudflarestorage.com"
@@ -223,7 +223,7 @@ https://future-architect.github.io/articles/20230502a/
223223
まずは現在の設定をTerraformの記述に落とし込んでくれる `generate` コマンドを試します。
224224

225225
```bash
226-
cf-terraforming generate --resource-type "cloudflare_record" --zone "ゾーンID"
226+
cf-terraforming generate --resource-type "cloudflare_record" --zone "ゾーンID"
227227
```
228228

229229
- `--resource-type` オプションで取得したいリソースを指定します。今回はDNS設定を取得してみるので、 `cloudflare_record` を指定します。
@@ -233,13 +233,13 @@ cf-terraforming generate --resource-type "cloudflare_record" --zone "ゾーンID
233233
実行してみたところ、以下のエラーが出ました。
234234

235235
```sh
236-
FATA[0000] --account and --zone are mutually exclusive, support for both is deprecated
236+
FATA[0000] --account and --zone are mutually exclusive, support for both is deprecated
237237
```
238238

239239
どうやら先程セットした環境変数 `CLOUDFLARE_ACCOUNT_ID` がセットされていると正常に動いてくれなさそうなので、一旦 `unset CLOUDFLARE_ACCOUNT_ID` コマンドで環境変数を外しておきます。
240240

241241
```sh
242-
% cf-terraforming generate --resource-type "cloudflare_record" --zone "ゾーンID"
242+
% cf-terraforming generate --resource-type "cloudflare_record" --zone "ゾーンID"
243243
resource "cloudflare_record" "terraform_managed_resource_xxxxxxxxxxx" {
244244
name = "920oj.net"
245245
proxied = true
@@ -269,14 +269,14 @@ resource "cloudflare_record" "terraform_managed_resource_yyyyyyyyyyy" {
269269

270270
また、zone_idやルートドメイン名は何度か記述することになるので、local変数に定義しておくとミスが減ります。
271271

272-
```sh local.tf
272+
```tf local.tf
273273
locals {
274274
zone_id = "ゾーンID"
275275
root_domain = "920oj.net"
276276
}
277277
```
278278

279-
```sh record.tf
279+
```tf record.tf
280280
resource "cloudflare_record" "cname_root" {
281281
name = local.root_domain
282282
proxied = true
@@ -297,23 +297,23 @@ importするためのコマンドはcf-terraformingを利用して出力でき
297297

298298
まずはcf-terraformingを利用してコマンドを出力してみましょう。
299299

300-
```
300+
```sh
301301
% cf-terraforming import --resource-type "cloudflare_record" --zone "ゾーンID"
302302
terraform import cloudflare_record.terraform_managed_resource_xxxxxxxxxx ゾーンID/xxxxxxxxxx
303303
terraform import cloudflare_record.terraform_managed_resource_yyyyyyyyyy ゾーンID/yyyyyyyyyy
304304
```
305305

306306
出力されたコマンドをもとに、リソース名を変更した上で、シェルスクリプトファイルとして保存します。
307307

308-
```bash import.sh
308+
```sh import.sh
309309
terraform import cloudflare_record.terraform_managed_resource_cname_root ゾーンID/xxxxxxxxxx
310310
terraform import cloudflare_record.terraform_managed_resource_mx_root ゾーンID/yyyyyyyyyy
311311
```
312312

313313
これを実行してみましょう。 Import successful! と表示されれば、インポート完了です。
314314

315315
```sh
316-
% ./import.sh
316+
% ./import.sh
317317
cloudflare_record.cname_root: Importing from ID "ゾーンID/xxxxxxxxxx"...
318318
cloudflare_record.cname_root: Import prepared!
319319
Prepared cloudflare_record for import
@@ -362,7 +362,7 @@ Cloudflare Pagesは、 `cloudflare_pages_domain` リソースと `cloudflarepage
362362

363363
`cloudflare_pages_project` のインポートでは、 `to` にはimportする対象のリソース名を、 `id` には `<アカウントID>/<プロジェクト名>` を記載します。
364364

365-
```sh import.tf
365+
```tf import.tf
366366
# cloudflare_pages_domain のインポート
367367
import {
368368
to = cloudflare_pages_domain.domain-920oj-net # 対象のリソース名
@@ -427,15 +427,15 @@ Plan: 2 to import, 0 to add, 0 to change, 0 to destroy.
427427
428428
内容が正しいか確認するのと、コメントを消したり、local変数に置き換えたりして体裁を整えましょう。また、ファイルもリソースごとに分けておきましょう。
429429
430-
```sh pages_domain.tf
430+
```tf pages_domain.tf
431431
resource "cloudflare_pages_domain" "domain-920oj-net" {
432432
account_id = local.account_id
433433
domain = "920oj.net"
434434
project_name = "920oj-net"
435435
}
436436
```
437437
438-
```sh generate.tf
438+
```tf generate.tf
439439
resource "cloudflare_pages_project" "project-920oj-net" {
440440
account_id = local.account_id
441441
name = local.project_name

0 commit comments

Comments
 (0)