0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

柔軟なCFnを書くために使いこなしたいパラメータや関数

Last updated at Posted at 2023-04-28

実務でCFnを触る機会があったのでこの辺りを抑えていけばある程度柔軟なCFnがかけるよって言うところをまとめてみました。

目次

  • よく使う組み込み関数
  • Conditionsとは
  • Exportとimportvalueの使い方

用語

  • Template・・・実行前のCFnファイルそのもの
  • Stack・・・CFn実行によって作成されたリソース群のこと

よく使う組み込み関数

とりあえずこの3つだけ理解しておけば大体の環境差分に対応するCFnが書けるのではないかと思います。

  • Fn::FindInMap

    • Mappingsで指定した値を呼び出すのに使う。あらかじめ固定値はMappingにまとめるようにしておくと見やすくなっていい。

      Mappings:
      	MapName:
      		TopLevelKey:
      			SecondLevelKey: ~
      			SecondLevelKey: ~
      Resources:
      	なんらかのリソース:
      		Properties: 
      			なんらかのプロパティ: !FindInMap
      				- MapName
      				- TopLevelKey
      				- SecondLevelKey
      
    • Chips

      Mappingの固定値を環境ごとに変えたい場合などに便利。実行するCFnは同じだが、環境毎に少し値が変わる場合にこのような対処の仕方はよくやるっぽい。

      Mappings:
      	MapName:
      		TopLevelKey:
      			Dev: ~
      			Prod: ~
      Resources:
      	なんらかのリソース:
      		Properties: 
      			なんらかのプロパティ: !FindInMap
      				- MapName
      				- TopLevelKey
      				- !Ref ${Env} # パラメータ(入力値)で指定した方のSecondLevelKeyの値が設定される
      
  • Fn::If

    • 特定のプロパティの値が可変な場合に使う。書き方は以下。

      なんらかのリソースパラメータ: 
      - !If [条件, trueの場合, falseの場合]
      
      なんらかのリソースパラメータ: !If
      	- 条件
        - trueの場合
        - falseの場合
      
    • Chips1

      falseの場合のところに、AWS::NoValueとすることでtrueでない場合は、このパラメータをそもそも設定していないことにするというもの。

      なんらかのリソースパラメータ: !If
      	- 条件
        - trueの場合
        - AWS::NoValue # falseの場合このパラメータを無効化
      
  • Fn::Equals

    • 特定の値と一致するかの条件式として使う。!Ifと組み合わせて使ったりする。

      なんらかのリソースパラメータ: !If
      	- !**Equals [!Ref Env, prod]**
        - trueの場合
        - falseの場合
      

Conditionsとは

これを使うと条件式だけを外出ししておいて使いまわせるようになるので、条件式がシンプルになり読みやすいTemplateが書けるようになります。

例えば公式では以下のようにして環境変数によって値の変わる条件式を指定している。

Conditions:
  CreateProdResources: !Equals 
    - !Ref EnvType
    - prod

ここで指定したCreateProdResourcesは他の組み込み関数で条件として使用される。

なんらかのリソースパラメータ: !If # Fn::Ifと同じ
	- **CreateProdResources**
  - trueの場合
  - falseの場合

Exportとimportvalueの使い方

これを使うと、スタックを別テンプレートで利用できるようになります。

CFnは外部の作成済みスタックを読み込む必要のあるリソースがいくつかあります。そんな時に読み込まれる側を外部参照できるようにするための**Export**とそれを読み込むための**Fn::ImportValue**が以下になります。

Export

Outputsセクションの中でExportすることで使用可能。

使用例)セキュリティグループをExportして置いて、別でALBスタックを作成する際にImportするなど。

Outputs:
  Logical ID:
    Export:
      Name: '${AWS::StackName}-セキュリティグループ名'

スタックの出力値のエクスポート - AWS CloudFormation

Fn::ImportValue

${ALBSevurityGroupStackName}はパラメータとして取得して、Exportしたセキュリティグループを読み込んでいるパターン。上記Exportに記述したTemplateのスタック名がそのままImportに入ることで参照できる。

Resources:
	ALB:
		 ALBのセキュリティグループ設定パラメータ: 
			- Fn::ImportValue 
			  'Fn::Sub': '${ALBSevurityGroupStackName}-セキュリティグループ名'

Fn::ImportValue - AWS CloudFormation

注意点

ExportFn::ImportValueでは!Refが使えないので、手動でImportする値を合わせる必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?