AWS Cloudformation やってみた①

AWS CloudFormationとは?

AWS Cloudformation のIaCサービスでは、ソースコード一つでインフラストラクチャーを自動構成できる。

CloudFormationはプログラミング言語やテキストファイルを使用してAWSリソースを自動で構築するサービスです。所望のAWS環境をテンプレート化しておくことで、同じ環境を作成する時間を削減することができます。CloudFormation特徴としては以下があげられます。

・AWSリソースを自動で作成できる
・テンプレートを作成すると、同じ構成を何度も構築できる。
利用料金は無料(利用するのに必要なリソース分の料金がかかる)

jsonかyaml形式のソースコードでAWSインフラ構成を自動構成することができてとても便利です。

ハンズオンや仕事でAWSインフラ構成をする際に手順書を元に画面操作をするとインフラストラクチャーを再現できないことがある。

MacOSにcfn-lintをインストールする。

AWS CloudFormation Linter (cfn-lint) は、AWS CloudFormation テンプレートの詳細な検証を行うために使用できるオープンソースのツールです。 cfn-lint には、AWS CloudFormation リソース仕様に基づくルールが含まれています。

cfn-lint
Homebrew’s package index
XML
brew install cfn-lint

実行する時

XML
cfn-lint exsample.yaml 

ソースコードの形式や構文を勉強しないといけないデメリットがあるがEC2すぐ試したい時におすすめだろう。

下にEC2を立てるサンプルのソースコードを表示します。

YAML
AWSTemplateFormatVersion: '2010-09-09'
# 東京リージョンでCloudformaion作業すること
Resources:
#------------------------------------------------------
#  VPC
#------------------------------------------------------
  AWSServerSample:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 11.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: "AWSServerSample"
#------------------------------------------------------
#  サブネット
#------------------------------------------------------
  PublicSubnetA:
      Type: AWS::EC2::Subnet
      Properties:
        AvailabilityZone: !Sub ${AWS::Region}a
        CidrBlock: 11.0.0.0/24
        MapPublicIpOnLaunch: 'true'
        VpcId: !Ref AWSServerSample
        Tags:
        - Key: Name
          Value: "MultiAZSample0A"
#------------------------------------------------------
#  インターネットゲートウェイ
#------------------------------------------------------
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: AWSServerSample
  AttachGateway:
      Type: AWS::EC2::VPCGatewayAttachment
      Properties:
        InternetGatewayId: !Ref InternetGateway
        VpcId: !Ref AWSServerSample
#------------------------------------------------------
#  ルートテーブルをパブリックサブネットにアタッチ
#------------------------------------------------------
  RouteTableForPublicSubnetA:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref AWSServerSample
  RouteForPublicSubnetA:
    Type: AWS::EC2::Route
    Properties:
      RouteTableId: !Ref RouteTableForPublicSubnetA
      DestinationCidrBlock:  0.0.0.0/0
      GatewayId: !Ref InternetGateway
  AssocciateRouteTableForPublicSubnetA:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnetA
      RouteTableId: !Ref RouteTableForPublicSubnetA
#------------------------------------------------------
#  セキュリティーグループ(EC2Instance)
#------------------------------------------------------
  EC2SecurityGroup:
      Type: AWS::EC2::SecurityGroup
      Properties:
        GroupDescription: Security Group for EC2
        VpcId: !Ref AWSServerSample
        SecurityGroupIngress:
          - IpProtocol: tcp
            FromPort: 80
            ToPort: 80
            CidrIp: 0.0.0.0/0

          - IpProtocol: tcp
            FromPort: 22
            ToPort: 22
            CidrIp: 0.0.0.0/0

          - IpProtocol: tcp
            FromPort: 443
            ToPort: 443
            CidrIp: 0.0.0.0/0
        Tags:
          - Key: Name
            Value: EC2SecurityGroup

#------------------------------------------------------
#  EC2Instance
#------------------------------------------------------
  EC2Instance01:
    Type: AWS::EC2::Instance
    Properties:
      # Ubuntu 22.04を使用
      ImageId: ami-088da9557aae42f39
      InstanceType: t3.micro
      SecurityGroupIds: 
        - !Ref EC2SecurityGroup
      SubnetId: !Ref PublicSubnetA
      BlockDeviceMappings:  
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            DeleteOnTermination: true 
            VolumeSize: 10
      Tags:
        - Key: Name
          Value: EC2Instance01
      UserData:
        Fn::Base64: |
          #!/bin/bash

UbuntuにWordPressセットアップ

Ubuntu でWordPress をセットアップする
WordPressは、個人のブログから大規模なサイトまで作ることができるオープンソースのコンテンツ管理システム(以下 C...

S3で静的サイト公開設定するCloudformation

Amazon S3では、静的サイト「HTML、CSS、JavaScript、img(画像ファイル)」するにあたってS3バケット作成とバケットポリシーが必要である。

S3バケット作成とバケットポリシーを自動作成できるCloudformationを作成した。

YAML
AWSTemplateFormatVersion: 2010-09-09
Description: The CloudFormation template that creates a public open S3 bucket.

# ------------------------------------------------------------#
# Input Parameters
# ------------------------------------------------------------#
Parameters:
  BucketName:
    Type: String
    Description: S3 Bucket name.
    Default: koseizakio-public-bucket
    MaxLength: 50
    MinLength: 3

Resources:
# ------------------------------------------------------------#
# S3
# ------------------------------------------------------------#
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Ref BucketName
      PublicAccessBlockConfiguration:
        BlockPublicAcls: false
        BlockPublicPolicy: false
        IgnorePublicAcls: false
        RestrictPublicBuckets: false
      Tags:
        - Key: Cost
          Value: !Ref BucketName
  S3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Action:
              - "s3:GetObject"
            Effect: Allow
            Resource: !Sub "arn:aws:s3:::${S3Bucket}/*"
            Principal: "*"
    DependsOn:
      - S3Bucket

# ------------------------------------------------------------#
# Output Parameters
# ------------------------------------------------------------#
Outputs:
#S3
  S3BucketName:
    Value: !Ref S3Bucket
  TopPageURL:
    Value: !Sub https://s3.${AWS::Region}.amazonaws.com/${S3Bucket}/index.html

HTMLのサンプルをS3バケットにアップロードすれば静的サイト作成完了となる。

HTML

<!doctype html>
<html lang="en">
  <head>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- Bootstrap CSS -->
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">

    <title>Hello, world!</title>
  </head>
  <body>
    <h1>Hello, world!</h1>

    <!-- Optional JavaScript; choose one of the two! -->

    <!-- Option 1: Bootstrap Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>

  </body>
</html>

以下のように表示される。

つぎの記事

タイトルとURLをコピーしました