みなさんYAMLってますか?画面にジョーギ当てたりしていますか?
私も最近YAMLを扱う機会が多くなってきて、修正するのが億劫になってきていたりしています。
今回は、YAMLをいろいろ操作できるっぽいという話を聞いたので、carveltoolsのyttを使ってみようと思います。
yttうんぬんは、ぐぐると日本語でもわかりやすく説明してくれている記事があるので、
ここではスルー。とにかく触ってみる。
とにかく Playground で遊んでみよう
とにかく ytt を触って、どんな感じにYAMLを操作できるのかを試すには、以下、公式サイトのPlaygroundを触るのがとにかく手っ取り早いみたい。
Playground楽しいヨ ということさえ伝えられれば、この記事としてはもういいかなーと思っていたりする。
ここで触ってみよう。
やりたいこと
私がやりたいことは、最近AWSのCloudformationのYAMLファイルを触ることが多くなったので、パラメータなどをyttを使って外出しにして、いい感じに管理できないかな? というのを試してみたいと思う。
が、はたして ytt で実現できるか?
PlaygroundにCloudformationのYAMLを張り込んでみた
(使い方は色々あるのだろうけど) Plain yaml を参考に、
パラメータ用のファイルと、テンプレートになるファイルを作って、
値をはめ込んで見るようにした。
なるほどなるほど。パラメータファイルだけ外出しにして、テンプレートにはめ込んで出力させることは、サクッとできそう!
サンプル
#@data/values
---
Parameters:
EnvironmentName:
Default: "mebachiMaguro"
VpcCIDR: "10.0.0.0/16"
#@ load("@ytt:data", "data")
#@ def environmentNameDefault():
#@ return data.values.Parameters.EnvironmentName.Default
#@ end
#@ def vpcCIDR():
#@ return data.values.VpcCIDR
#@ end
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC 2AZ public/private Subnet with IGW / AZ2 is Dummy AZ
Parameters:
EnvironmentName:
Description: Enter your Environment name
Type: String
Default: #@ environmentNameDefault()
VpcCIDR:
Description: Please enter the IP range (CIDR notation) for this VPC
Type: String
Default: #@ vpcCIDR()
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VpcCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub ${EnvironmentName}-vpc
#@ load("@ytt:data", "data")
#@ def environmentNameDefault():
#@ return data.values.Parameters.EnvironmentName.Default
#@ end
#@ def vpcCIDR():
#@ return data.values.VpcCIDR
#@ end
AWSTemplateFormatVersion: "2010-09-09"
Description: Deploy EC2 Instance with SessionManager Settings
Parameters:
EnvironmentName:
Description: Enter your Environment name
Type: String
Default: #@ environmentNameDefault()
Resources:
EC2Role:
Type: AWS::IAM::Role
Properties:
RoleName: !Sub ${EnvironmentName}-AllowSessionManager-Role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
手元で動かしてみよう
ytt のインストール(Mac)
https://carvel.dev/ytt/docs/v0.40.0/install/#via-script-macos-or-linux
ここの内容を実施すればいいだけっぽい。
$ mkdir local-bin/
$ curl -L https://carvel.dev/install.sh | K14SIO_INSTALL_BIN_DIR=local-bin bash
$ export PATH=$PWD/local-bin/:$PATH
$ ytt version
ファイルを準備
先程のYAMLはPlayground上で貼り付けていただけなので、
ファイルとして出力できないと、つらいので、コマンドラインから試してみる。
先程のYAMLをファイルとして配置して...
% ls -la
total 24
drwxr-xr-x 5 make0x0 staff 160 12 22 23:10 ./
drwxr-xr-x+ 57 make0x0 staff 1824 12 22 23:10 ../
-rw-r--r-- 1 make0x0 staff 893 12 22 23:10 iam.yaml
-rw-r--r-- 1 make0x0 staff 102 12 22 23:09 parameters.yml
-rw-r--r-- 1 make0x0 staff 785 12 22 23:09 vpc.yml
yttの出力コマンドを実行
% ytt -f ./ytt-sample --output-files ytt-output
creating: ytt-output/iam.yaml
creating: ytt-output/vpc.yml
出力結果を確認
make0x0 (arm64):~/ytt-output
% ls
iam.yaml* vpc.yml*
make0x0 (arm64):~/ytt-output
% cat iam.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Deploy EC2 Instance with SessionManager Settings
Parameters:
EnvironmentName:
Description: Enter your Environment name
Type: String
Default: mebachiMaguro
Resources:
EC2Role:
Type: AWS::IAM::Role
Properties:
RoleName: ${EnvironmentName}-AllowSessionManager-Role
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
Service:
- ec2.amazonaws.com
Action:
- sts:AssumeRole
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
make0x0 (arm64):~/ytt-output
% cat vpc.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: VPC 2AZ public/private Subnet with IGW / AZ2 is Dummy AZ
Parameters:
EnvironmentName:
Description: Enter your Environment name
Type: String
Default: mebachiMaguro
VpcCIDR:
Description: Please enter the IP range (CIDR notation) for this VPC
Type: String
Default: 10.0.0.0/16
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: VpcCIDR
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: ${EnvironmentName}-vpc
おお! ちゃんとファイルとして出力してくれたぞ!
まとめ
ということで、まともにドキュメント読まずしてもかんたんにテンプレート化して、出力を得られることがわかりました! かんたんだよ!
Playground のメニューを見るだけでも、リストを展開したりとか、If文とかできそうですね。
ちゃんとドキュメント読んで、YAMLに強い人類になりたいと思います!