2
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?

【備忘録】組み込み関数

Posted at

組み込み関数リファレンス - AWS CloudFormation

関数の選定基準は、利用頻度や使い勝手を考慮しており、あくまで個人の見解に基づいています。使用する際の環境や要件によっては異なる場合があるため、あらかじめご了承ください。

よく使う(☆特によく使う)

あまり使わない


Fn::Ref / Fn::Sub / Fn::GetAtt

↓前回記事にて、別途まとめています。

Fn::FindInMap

Mappings に指定しておくと、参照できる

Mappings:
  AzMap:
    ap-northeast-1:
      1st: ap-northeast-1a
      2nd: ap-northeast-1c
      3rd: ap-northeast-1d
Resources:  
  EC2Bastion:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: !FindInMap [AzMap, !Ref AWS::Region, 1st]

擬似パラメータ参照 - AWS CloudFormation

AWS::NoValue とかもある

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub "${AWS::AccountId}-${AWS::Region}-mybucket"

などを使いS3のバケット名の重複を防ぎます

Fn::Base64

組み込み関数 Fn::Base64 は、入力文字列の Base64 表現を返します。この関数は通常、UserData プロパティを介して Amazon EC2 インスタンスにエンコードされたデータを渡すために使用されます。

UserData:
	Fn::Base64: !Sub
		#!/bin/bash
		apt-get update -y
		apt-get upgrade -y
		apt-get install nginx -y
		touch test_file
		chown ${Username}:${Username} test_file

Fn::ImportValue

インポートの出力をし、他ファイル(vpcのIDをEC2に引っ張る)で使えるようにする。

Resources:
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: !Ref VpcCiderBlock
      EnableDnsHostnames: true
      EnableDnsSupport: true
      InstanceTenancy: default
      Tags: 
        - Key: Name
          Value: !Sub
            - ${SystemName}-${EnvType}-vpc
            - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
        - Key: SystemName
          Value: !Ref SystemName
        - Key: EnvType
          Value: !Ref EnvType
  
  
 Outputs:
  VPC:
    Value: !Ref VPC
    Export:
      Name: !Sub
        - ${SystemName}-${EnvType}-vpc
        - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
  • OutputsセクションでValue:にて!Ref VPC使用している部分は、

実際には同じファイル内のResourcesセクションにあるVPCリソースを参照

  • Export:
    Name:
    は指定のもの(上記ならVPC)のNameTagを記載する。

上記にて、準備が完了

別ファイルでImportValueを活用し使用する。
( VpcId: を丸々書くのを省略できる)

Resources:
  SecurityGroupBastion:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: !Sub
        - ${SystemName}-${EnvType}-sg-bastion
        - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
      GroupName: !Sub
        - ${SystemName}-${EnvType}-sg-bastion
        - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
      VpcId: 
        Fn::ImportValue: !Sub
          - ${SystemName}-${EnvType}-vpc
          - {SystemName: !Ref SystemName, EnvType: !Ref EnvType}

! が連なるとエラーが出るため、!Subを使用するのでFn::ImportValueと書く

Outputs: で指定している、Name:を記載しインポートを行う

Fn::Join

Subとやっていることがほぼ同じ

!Join
	- ''
	- - 'arn:aws:s3:::'
		-!Ref SystemName
		
		
# これをSubで書くと

!Sub arn:aws:s3:::${SystemName}

Amazon Resource Name とは? - Qiita

AWS内のリソースを一意に識別するために使用される名前です。AWSのさまざまなリソース(例:EC2インスタンス、S3バケット、IAMユーザーなど)には、それぞれ固有のARNが付与されます。ARNは、リソースを一意に識別し、アクセス制御やリソースの参照に使用されます

条件関数

Fn::If

自分が起動しようとしているものと同じであれば、x86だというコード

Conditions:
	isX86Architecture: !Equals [!Ref LanchAmiId, !Ref RawX86AmiId]
	
Resources:
	UserData: !If
		- isX86Architecture
		- Fn::Base64: Sub!
				#!/bin/bash
				echo x86
		- Fn::Base64: Sub!
				#!/bin/bash
				echo arm64	

上がtrue

下がfalse

Fn::Not

Devと同じじゃないときtrue

Conditions:
	isNotDev: !Not [!Equals [!Ref EnvType, dev]]

Fn::And

Devで、かつ東京だったらtrue

Conditions:
	isDevAndTokyo: !And [!Equals [!Ref EnvType, dev], !Equals [!Ref AWS::REgion, ap-northeast-1]]

Fn::Or

devかstgの場合true(本番環境以外の時)

Conditions:
	isDevOrStg:
		!Or [!Equals [!Ref EnvType, dev], !Equals [!Ref EnvType, stg]]

あまり使わない

Fn::ForEach

ループ処理ができる

Transform: 'AWS::LanguagrExtensions'
		
Parameters:
	HogeItemNames:
		Type: List<String>
		Default: AAA, BBB, CCC
		
Resources:
	'Fn::ForEach::HogeItemName':
		- HogeItems
		- !Ref HogeItemNames
		- 'Topic${HogeItems}':
				Type: 'AWS::SNS::Topic'
				Properties:
					TopicName: !Ref HogeItems

Fn::GetAZs

指定したリージョンのアベイラビリティーゾーンをアルファベット順にリストした配列を返します。

AvailabilityZone: !Select
	- 0
	- Fn::GetAZs: !Ref 'AWS::Region'

これだと0番目のアベイラビリティーゾーンのことを指す

しかし、アベイラビリティーゾーンの追加削除で順が変わったりするため使い勝手が悪い。

FindInMapを使ったほうがいい

Fn::Length

数をかぞえる

Fn::Length:
	!Split ["|", "a|b|c"]

# 3が返る

Fn::Split …文字列を指定された区切り文字で分割します

Fn::ToJsonString

指定されたオブジェクトをJSON文字列に変換

Fn::ToJsonString:
	- key1: value1
		key2: !Ref ParameterName
		
# "[{\"key1\":\"value1\"},{\"key2\":\"resolvedValue\"}]"

Fn::Transform

AWS側から用意されていないテンプレートを使いたいときに自分で設定し使えるようにする。

⇒あまり使い道がないと思われる

Fn::Cider

詳細については、下記Classmethodの記事
(https://dev.classmethod.jp/articles/cidr_cloudformation/)
の「!Cidrのパラメータと配列データの関係
をご参照ください。

※個人的にはこの記事がとてもわかりやすいと感じました。

⇒Ciderを指定できないのであまり使わないと思われる

2
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
2
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?