0
2

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 3 years have passed since last update.

【AWS】CloudFormationとは

Posted at

CloudFormationとは

AWSリソースをコード化できるマネージドサービスです。
YAML, JSON, XMLなどで書いたコードをCloudFormationに読み込ませることで、AWSサービスを自動作成することができます。
test.png

CloudFormationを使うにはVSCodeがおすすめ

VSCodeには、CloudFormationという拡張機能があるのでそちらをダウンロードします。
スクリーンショット 2021-05-19 9.25.42.png

YAMLを使う場合は以下の修正が必要です

Settings.json内に以下の追記をしてください。

Settings.json
"yaml.schemas": {
    "https://d33vqc0rt9ld30.cloudfront.net/latest/gzip/CloudFormationResourceSpecification.json": [
            "*.cf.yaml",
            "*.cf.yml",
            "*.cfn/*.yaml",
            "*.cfn/*.yml",
            "cloud*formation/*.yaml",
            "cloud*formation/*.yml"
        ]
},
"yaml.customTags": [
    "!Ref",
    "!Sub scalar",
    "!Sub sequence",
    "!Join sequence",
    "!FindInMap sequence",
    "!GetAtt scalar",
    "!GetAtt sequence",
    "!Base64 mapping",
    "!GetAZs",
    "!Select scalar",
    "!Select sequence",
    "!Split sequence",
    "!ImportValue",
    "!Condition",
    "!Equals sequence",
    "!And",
    "!If",
    "!Not",
    "!Or"
],

それではVPCを作ってみましょう

Yamlを作成

「start」+[Tab]でテンプレートが表示されます。

test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
  myVPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: myVPC-1

CloudFormationを開き設定をする

スクリーンショット 2021-05-19 9.32.22.png

スクリーンショット 2021-05-19 9.34.08.png

作成されているか確認しましょう

スクリーンショット 2021-05-19 9.36.44.png

作成されていました!
OKです

次にサブネットを作成しましょう

Yamlを更新する

test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
  myVPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: myVPC-1
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: 'ap-northeast-1a'
      VpcId: !Ref myVPC1
      CidrBlock: 10.0.0.0/24
      Tags:
        - Key: Name
          Value: Public-1

ここで大切なのは、!Refです。
これは組み込み関数と呼ばれるもので、同一テンプレート内で作成されたものの値を返す役割があります。
上記の例で言うと、VpcIdは、myVPC1と同じ値にしてくださいと命令していることになります。

CloudFormationを更新

スクリーンショット 2021-05-19 9.45.18.png

次にセキュリティグループを作成しましょう

Yamlを更新する

test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
  myVPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: myVPC-1
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: 'ap-northeast-1a'
      VpcId: !Ref myVPC1
      CidrBlock: 10.0.0.0/24
      Tags:
        - Key: Name
          Value: Public-1
  secGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: WEB-SG
      GroupDescription: WEB-SG
      VpcId: !Ref myVPC1
      # インバウンド(ポート番号22のすべてからアクセスを受け付ける)
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: WEB-SG

次にSubnet内にEC2を作ろう

ここからは新しいテンプレートファイルを作ります。
新しいテンプレートを作成したテンプレートに紐付けるクロススタックに関して学んでいきましょう。

なぜ分けるべきなのか?

ブラックベルトで紹介されている通り、様々なリソースを1つのファイルにまとめてしまうと可読性が著しく落ちてしまうためレイヤーごとに分けるのがスマートです。

スクリーンショット 2021-05-19 10.06.23.png

Yamlを作成する

test.yml
AWSTemplateFormatVersion: 2010-09-09
Description: ---
Resources:
  myVPC1:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/21
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: myVPC-1
  subnetName:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: 'ap-northeast-1a'
      VpcId: !Ref myVPC1
      CidrBlock: 10.0.0.0/24
      Tags:
        - Key: Name
          Value: Public-1
  secGroupName:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: WEB-SG
      GroupDescription: WEB-SG
      VpcId: !Ref myVPC1
      # インバウンド(ポート番号22のすべてからアクセスを受け付ける)
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: WEB-SG
# 外部でも値を使えるようにする
Outputs:
  Public1: # 適当な名前をつける
    Value: !Ref subnetName # どの値を参照するか
    Export:
      Name: Public-Subnet1 # 外部で呼び出す時の名前
  SG1:
    Value: !Ref secGroupName
    Export:
      Name: WEB-SG1

スクリーンショット 2021-05-19 10.25.21.png

ec2.yml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  myEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      KeyName: Keypair
      ImageId: ami-0ca38c7440de1749a # インスタンスのID(今回はAmazon Linux 2 AMI (HVM), SSD Volume Type)
      InstanceType: t2.micro
      Monitoring: false
      SecurityGroupIds:
        - !ImportValue WEB-SG1
      SubnetId: !ImportValue Public-Subnet1
      Tags:
        - Key: Name
          Value: Frontend

スクリーンショット 2021-05-19 10.26.25.png

スクリーンショット 2021-05-19 10.28.36.png

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?