[JAWS-UG CLI] CloudFormation:#7 テンプレートの作成 (デザイナの利用)

デザイナーによるテンプレート作成の例

ウォークスルー: AWS CloudFormation デザイナー を使用して基本的なウェブサーバーを作成します。: http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/working-with-templates-cfn-designer-walkthrough-createbasicwebserver.html

ステップ3まで実施します。

スクリーンショット 2017-06-12 17.32.57.png

テンプレートの作成結果例

テンプレートの例
{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Metadata": {
        "AWS::CloudFormation::Designer": {
            "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc": {
                "size": {
                    "width": 710,
                    "height": 220
                },
                "position": {
                    "x": 100,
                    "y": 130
                },
                "z": 0,
                "embeds": [
                    "25d45e53-d776-4534-b244-b9a49c15b6ff",
                    "09677cca-68f1-478f-842e-32018f9bf5fa",
                    "4a16106f-3988-4902-ba28-2fcf5bc1d48d"
                ]
            },
            "09677cca-68f1-478f-842e-32018f9bf5fa": {
                "size": {
                    "width": 140,
                    "height": 140
                },
                "position": {
                    "x": 180,
                    "y": 200
                },
                "z": 1,
                "parent": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc",
                "embeds": [
                    "5227546f-a488-4322-b146-17e159d2657f"
                ]
            },
            "5227546f-a488-4322-b146-17e159d2657f": {
                "size": {
                    "width": 60,
                    "height": 60
                },
                "position": {
                    "x": 228,
                    "y": 236
                },
                "z": 2,
                "parent": "09677cca-68f1-478f-842e-32018f9bf5fa",
                "embeds": [],
                "dependson": [
                    "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                ],
                "isrelatedto": [
                    "25d45e53-d776-4534-b244-b9a49c15b6ff"
                ]
            },
            "25d45e53-d776-4534-b244-b9a49c15b6ff": {
                "size": {
                    "width": 60,
                    "height": 60
                },
                "position": {
                    "x": 480,
                    "y": 180
                },
                "z": 1,
                "parent": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc",
                "embeds": []
            },
            "0e5d222f-40cb-4c52-b251-80c744846be5": {
                "size": {
                    "width": 60,
                    "height": 60
                },
                "position": {
                    "x": 880,
                    "y": 220
                },
                "z": 0,
                "embeds": []
            },
            "5637b4f3-df45-40fb-a91d-dae734a3abdd": {
                "source": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                },
                "target": {
                    "id": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc"
                },
                "z": 0
            },
            "75da879a-0efa-427e-8071-077ba3a16212": {
                "source": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                },
                "target": {
                    "id": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc"
                },
                "z": 0
            },
            "4a16106f-3988-4902-ba28-2fcf5bc1d48d": {
                "size": {
                    "width": 140,
                    "height": 140
                },
                "position": {
                    "x": 650,
                    "y": 170
                },
                "z": 1,
                "parent": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc",
                "embeds": [
                    "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                ],
                "dependson": [
                    "09677cca-68f1-478f-842e-32018f9bf5fa"
                ]
            },
            "1e86fca9-84d1-4d05-9e68-efb1df27d4c5": {
                "size": {
                    "width": 60,
                    "height": 60
                },
                "position": {
                    "x": 700,
                    "y": 240
                },
                "z": 2,
                "parent": "4a16106f-3988-4902-ba28-2fcf5bc1d48d",
                "embeds": [],
                "references": [
                    "0e5d222f-40cb-4c52-b251-80c744846be5"
                ],
                "dependson": [
                    "0e5d222f-40cb-4c52-b251-80c744846be5"
                ]
            },
            "a1cc9b57-b454-483b-8e86-4e4e0cd9cacb": {
                "source": {
                    "id": "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                },
                "target": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                },
                "z": 3
            },
            "522ea7e3-d856-43d9-97c0-ab3da44fc19c": {
                "source": {
                    "id": "5227546f-a488-4322-b146-17e159d2657f"
                },
                "target": {
                    "id": "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                },
                "z": 4
            },
            "b617925c-337f-46dc-bf6c-d8d61ff8d687": {
                "source": {
                    "id": "4a16106f-3988-4902-ba28-2fcf5bc1d48d"
                },
                "target": {
                    "id": "09677cca-68f1-478f-842e-32018f9bf5fa"
                },
                "z": 5
            },
            "b8d8deca-616b-4d76-8797-873228e79f9d": {
                "source": {
                    "id": "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                },
                "target": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                },
                "z": 3
            },
            "25d0fe02-7713-433a-88a0-7f85890eb289": {
                "source": {
                    "id": "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                },
                "target": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                },
                "z": 4
            },
            "f818e69a-a5cb-4569-92b0-a5bbab980380": {
                "source": {
                    "id": "4a16106f-3988-4902-ba28-2fcf5bc1d48d"
                },
                "target": {
                    "id": "09677cca-68f1-478f-842e-32018f9bf5fa"
                },
                "z": 3
            }
        }
    },
    "Resources": {
        "VPC": {
            "Type": "AWS::EC2::VPC",
            "Properties": {
                "EnableDnsSupport": "true",
                "EnableDnsHostnames": "true",
                "CidrBlock": "10.0.0.0/16"
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "2e84feb3-cb7f-47d8-a50b-73d6e89de7bc"
                }
            }
        },
        "PublicSubnet": {
            "Type": "AWS::EC2::Subnet",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "CidrBlock": "10.0.0.0/24"
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "09677cca-68f1-478f-842e-32018f9bf5fa"
                }
            }
        },
        "WebServerInstance": {
            "Type": "AWS::EC2::Instance",
            "Properties": {
                "InstanceType": {
                    "Ref": "InstanceType"
                },
                "ImageId": {
                    "Fn::FindInMap": [
                        "AWSRegionArch2AMI",
                        {
                            "Ref": "AWS::Region"
                        },
                        {
                            "Fn::FindInMap": [
                                "AWSInstanceType2Arch",
                                {
                                    "Ref": "InstanceType"
                                },
                                "Arch"
                            ]
                        }
                    ]
                },
                "KeyName": {
                    "Ref": "KeyName"
                },
                "NetworkInterfaces": [
                    {
                        "GroupSet": [
                            {
                                "Ref": "WebServerSecurityGroup"
                            }
                        ],
                        "AssociatePublicIpAddress": "true",
                        "DeviceIndex": "0",
                        "DeleteOnTermination": "true",
                        "SubnetId": {
                            "Ref": "PublicSubnet"
                        }
                    }
                ],
                "UserData": {
                    "Fn::Base64": {
                        "Fn::Join": [
                            "",
                            [
                                "#!/bin/bash -xen",
                                "yum install -y aws-cfn-bootstrapn",
                                "# Install the files and packages from the metadatan",
                                "/opt/aws/bin/cfn-init -v ",
                                "         --stack ",
                                {
                                    "Ref": "AWS::StackName"
                                },
                                "         --resource WebServerInstance ",
                                "         --configsets All ",
                                "         --region ",
                                {
                                    "Ref": "AWS::Region"
                                },
                                "n",
                                "# Signal the status from cfn-initn",
                                "/opt/aws/bin/cfn-signal -e $? ",
                                "         --stack ",
                                {
                                    "Ref": "AWS::StackName"
                                },
                                "         --resource WebServerInstance ",
                                "         --region ",
                                {
                                    "Ref": "AWS::Region"
                                },
                                "n"
                            ]
                        ]
                    }
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "5227546f-a488-4322-b146-17e159d2657f"
                },
                "AWS::CloudFormation::Init": {
                    "configSets": {
                        "All": [
                            "ConfigureSampleApp"
                        ]
                    },
                    "ConfigureSampleApp": {
                        "packages": {
                            "yum": {
                                "httpd": []
                            }
                        },
                        "files": {
                            "/var/www/html/index.html": {
                                "content": {
                                    "Fn::Join": [
                                        "n",
                                        [
                                            "<h1>Congratulations, you have successfully launched the AWS CloudFormation sample.</h1>"
                                        ]
                                    ]
                                },
                                "mode": "000644",
                                "owner": "root",
                                "group": "root"
                            }
                        },
                        "services": {
                            "sysvinit": {
                                "httpd": {
                                    "enabled": "true",
                                    "ensureRunning": "true"
                                }
                            }
                        }
                    }
                }
            },
            "DependsOn": [
                "PublicRoute"
            ]
        },
        "WebServerSecurityGroup": {
            "Type": "AWS::EC2::SecurityGroup",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                },
                "GroupDescription": "Allow access from HTTP and SSH traffic",
                "SecurityGroupIngress": [
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "80",
                        "ToPort": "80",
                        "CidrIp": "0.0.0.0/0"
                    },
                    {
                        "IpProtocol": "tcp",
                        "FromPort": "22",
                        "ToPort": "22",
                        "CidrIp": {
                            "Ref": "SSHLocation"
                        }
                    }
                ]
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "25d45e53-d776-4534-b244-b9a49c15b6ff"
                }
            }
        },
        "InternetGateway": {
            "Type": "AWS::EC2::InternetGateway",
            "Properties": {},
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "0e5d222f-40cb-4c52-b251-80c744846be5"
                }
            }
        },
        "EC2VPCG1BZXP": {
            "Type": "AWS::EC2::VPCGatewayAttachment",
            "Properties": {
                "InternetGatewayId": {
                    "Ref": "InternetGateway"
                },
                "VpcId": {
                    "Ref": "VPC"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "5637b4f3-df45-40fb-a91d-dae734a3abdd"
                }
            }
        },
        "EC2VPCGO08Z": {
            "Type": "AWS::EC2::VPCGatewayAttachment",
            "Properties": {
                "InternetGatewayId": {
                    "Ref": "InternetGateway"
                },
                "VpcId": {
                    "Ref": "VPC"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "75da879a-0efa-427e-8071-077ba3a16212"
                }
            }
        },
        "PublicRouteTable": {
            "Type": "AWS::EC2::RouteTable",
            "Properties": {
                "VpcId": {
                    "Ref": "VPC"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "4a16106f-3988-4902-ba28-2fcf5bc1d48d"
                }
            },
            "DependsOn": [
                "PublicSubnet"
            ]
        },
        "PublicRoute": {
            "Type": "AWS::EC2::Route",
            "Properties": {
                "DestinationCidrBlock": "0.0.0.0/0",
                "RouteTableId": {
                    "Ref": "PublicRouteTable"
                },
                "GatewayId": {
                    "Ref": "InternetGateway"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "1e86fca9-84d1-4d05-9e68-efb1df27d4c5"
                }
            },
            "DependsOn": [
                "InternetGateway"
            ]
        },
        "EC2SRTA3CLE1": {
            "Type": "AWS::EC2::SubnetRouteTableAssociation",
            "Properties": {
                "RouteTableId": {
                    "Ref": "PublicRouteTable"
                },
                "SubnetId": {
                    "Ref": "PublicSubnet"
                }
            },
            "Metadata": {
                "AWS::CloudFormation::Designer": {
                    "id": "f818e69a-a5cb-4569-92b0-a5bbab980380"
                }
            }
        }
    },
    "Parameters": {
        "InstanceType": {
            "Description": "WebServer EC2 instance type",
            "Type": "String",
            "Default": "t2.micro",
            "AllowedValues": [
                "t1.micro",
                "t2.micro",
                "t2.small",
                "t2.medium",
                "m1.small",
                "m1.medium",
                "m1.large",
                "m1.xlarge",
                "m2.xlarge",
                "m2.2xlarge",
                "m2.4xlarge",
                "m3.medium",
                "m3.large",
                "m3.xlarge",
                "m3.2xlarge",
                "c1.medium",
                "c1.xlarge",
                "c3.large",
                "c3.xlarge",
                "c3.2xlarge",
                "c3.4xlarge",
                "c3.8xlarge",
                "c4.large",
                "c4.xlarge",
                "c4.2xlarge",
                "c4.4xlarge",
                "c4.8xlarge",
                "g2.2xlarge",
                "r3.large",
                "r3.xlarge",
                "r3.2xlarge",
                "r3.4xlarge",
                "r3.8xlarge",
                "i2.xlarge",
                "i2.2xlarge",
                "i2.4xlarge",
                "i2.8xlarge",
                "d2.xlarge",
                "d2.2xlarge",
                "d2.4xlarge",
                "d2.8xlarge",
                "hi1.4xlarge",
                "hs1.8xlarge",
                "cr1.8xlarge",
                "cc2.8xlarge",
                "cg1.4xlarge"
            ],
            "ConstraintDescription": "must be a valid EC2 instance type."
        },
        "KeyName": {
            "Description": "Name of an EC2 KeyPair to enable SSH access to the instance.",
            "Type": "AWS::EC2::KeyPair::KeyName",
            "ConstraintDescription": "must be the name of an existing EC2 KeyPair."
        },
        "SSHLocation": {
            "Description": " The IP address range that can be usedto access the web server using SSH.",
            "Type": "String",
            "MinLength": "9",
            "MaxLength": "18",
            "Default": "0.0.0.0/0",
            "AllowedPattern": "(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})",
            "ConstraintDescription": "must be a valid IP CIDR range of the form x.x.x.x/x."
        }
    },
    "Mappings": {
        "AWSInstanceType2Arch": {
            "t1.micro": {
                "Arch": "PV64"
            },
            "t2.micro": {
                "Arch": "HVM64"
            },
            "t2.small": {
                "Arch": "HVM64"
            },
            "t2.medium": {
                "Arch": "HVM64"
            },
            "m1.small": {
                "Arch": "PV64"
            },
            "m1.medium": {
                "Arch": "PV64"
            },
            "m1.large": {
                "Arch": "PV64"
            },
            "m1.xlarge": {
                "Arch": "PV64"
            },
            "m2.xlarge": {
                "Arch": "PV64"
            },
            "m2.2xlarge": {
                "Arch": "PV64"
            },
            "m2.4xlarge": {
                "Arch": "PV64"
            },
            "m3.medium": {
                "Arch": "HVM64"
            },
            "m3.large": {
                "Arch": "HVM64"
            },
            "m3.xlarge": {
                "Arch": "HVM64"
            },
            "m3.2xlarge": {
                "Arch": "HVM64"
            },
            "c1.medium": {
                "Arch": "PV64"
            },
            "c1.xlarge": {
                "Arch": "PV64"
            },
            "c3.large": {
                "Arch": "HVM64"
            },
            "c3.xlarge": {
                "Arch": "HVM64"
            },
            "c3.2xlarge": {
                "Arch": "HVM64"
            },
            "c3.4xlarge": {
                "Arch": "HVM64"
            },
            "c3.8xlarge": {
                "Arch": "HVM64"
            },
            "c4.large": {
                "Arch": "HVM64"
            },
            "c4.xlarge": {
                "Arch": "HVM64"
            },
            "c4.2xlarge": {
                "Arch": "HVM64"
            },
            "c4.4xlarge": {
                "Arch": "HVM64"
            },
            "c4.8xlarge": {
                "Arch": "HVM64"
            },
            "g2.2xlarge": {
                "Arch": "HVMG2"
            },
            "r3.large": {
                "Arch": "HVM64"
            },
            "r3.xlarge": {
                "Arch": "HVM64"
            },
            "r3.2xlarge": {
                "Arch": "HVM64"
            },
            "r3.4xlarge": {
                "Arch": "HVM64"
            },
            "r3.8xlarge": {
                "Arch": "HVM64"
            },
            "i2.xlarge": {
                "Arch": "HVM64"
            },
            "i2.2xlarge": {
                "Arch": "HVM64"
            },
            "i2.4xlarge": {
                "Arch": "HVM64"
            },
            "i2.8xlarge": {
                "Arch": "HVM64"
            },
            "d2.xlarge": {
                "Arch": "HVM64"
            },
            "d2.2xlarge": {
                "Arch": "HVM64"
            },
            "d2.4xlarge": {
                "Arch": "HVM64"
            },
            "d2.8xlarge": {
                "Arch": "HVM64"
            },
            "hi1.4xlarge": {
                "Arch": "HVM64"
            },
            "hs1.8xlarge": {
                "Arch": "HVM64"
            },
            "cr1.8xlarge": {
                "Arch": "HVM64"
            },
            "cc2.8xlarge": {
                "Arch": "HVM64"
            }
        },
        "AWSRegionArch2AMI": {
            "us-east-1": {
                "PV64": "ami-1ccae774",
                "HVM64": "ami-1ecae776",
                "HVMG2": "ami-8c6b40e4"
            },
            "us-west-2": {
                "PV64": "ami-ff527ecf",
                "HVM64": "ami-e7527ed7",
                "HVMG2": "ami-abbe919b"
            },
            "us-west-1": {
                "PV64": "ami-d514f291",
                "HVM64": "ami-d114f295",
                "HVMG2": "ami-f31ffeb7"
            },
            "eu-west-1": {
                "PV64": "ami-bf0897c8",
                "HVM64": "ami-a10897d6",
                "HVMG2": "ami-d5bc24a2"
            },
            "eu-central-1": {
                "PV64": "ami-ac221fb1",
                "HVM64": "ami-a8221fb5",
                "HVMG2": "ami-7cd2ef61"
            },
            "ap-northeast-1": {
                "PV64": "ami-27f90e27",
                "HVM64": "ami-cbf90ecb",
                "HVMG2": "ami-6318e863"
            },
            "ap-southeast-1": {
                "PV64": "ami-acd9e8fe",
                "HVM64": "ami-68d8e93a",
                "HVMG2": "ami-3807376a"
            },
            "ap-southeast-2": {
                "PV64": "ami-ff9cecc5",
                "HVM64": "ami-fd9cecc7",
                "HVMG2": "ami-89790ab3"
            },
            "sa-east-1": {
                "PV64": "ami-bb2890a6",
                "HVM64": "ami-b52890a8",
                "HVMG2": "NOT_SUPPORTED"
            },
            "cn-north-1": {
                "PV64": "ami-fa39abc3",
                "HVM64": "ami-f239abcb",
                "HVMG2": "NOT_SUPPORTED"
            }
        }
    },
    "Outputs": {
        "URL": {
            "Value": {
                "Fn::Join": [
                    "",
                    [
                        "http://",
                        {
                            "Fn::GetAtt": [
                                "WebServerInstance",
                                "PublicIp"
                            ]
                        }
                    ]
                ]
            },
            "Description": "Newly created application URL"
        }
    }
}

続きを読む

[JAWS-UG CLI] CloudFormation:#6 スタックの削除

.. 後始末. CloudFormation スタックの削除

この手順の目的

CloudFormationスタック”BasicWebServerInVPC”を削除します。

作業対象

  • CloudFormationサービス

標準時間

8分

前提条件

作業権限

CloudFormationへの権限 ]-

CloudFormationに対してフル権限があること。

作業環境

AWS CLIのバージョン ]-

以下のバージョンで動作確認済

  • AWS CLI 1.11.14
コマンド
aws --version

結果(例):

  aws-cli/1.11.97 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.60

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

開始条件

作業に必要なモノ・情報

作業開始には、以下が全て揃っていることが必要です。

  • CloudFormationスタック名

    • 削除するCloudFormationスタックの名称です。
    • 今回は”BasicWebServerInVPC”とします。

0. 準備

まず変数の確認をします。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  CF_STACK_NAME:       (0.4) BasicWebServerInVPC

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。

0.1. プロファイルの指定

プロファイルの一覧を確認します。

コマンド
cat ~/.aws/credentials 
       | grep '[' 
       | sed 's/[//g' | sed 's/]//g'

結果(例):

  iamFull-prjz-mbpr13
  <CloudFormationのフル権限が許可されているプロファイル>
変数の設定
export AWS_DEFAULT_PROFILE='<CloudFormationのフル権限が許可されているプロファイル>'

0.2. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. スタック名の指定

変数の設定
CF_STACK_NAME='BasicWebServerInVPC'

再確認

設定されている変数の内容を再確認します。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  CF_STACK_NAME:       (0.4) BasicWebServerInVPC

1. 事前作業

1.1. 作業対象の状態確認

削除しようとしているCloudFormationスタック”BasicWebServerInVPC”は存在することを確認します。

コマンド
CF_STACK_STATUS=$( 
        aws cloudformation describe-stacks 
          --stack-name ${CF_STACK_NAME} 
          --query "Stacks[?StackName == `${CF_STACK_NAME}`].StackStatus" 
          --output text 
) 
        && echo ${CF_STACK_STATUS}

結果(例):

  CREATE_COMPLETE

2. 本作業

2.1. スタックの削除

変数の確認
cat << ETX

        CF_STACK_NAME: ${CF_STACK_NAME}

ETX
コマンド
aws cloudformation delete-stack 
        --stack-name ${CF_STACK_NAME}

結果:

  (戻り値なし)

2.2. ステータスの確認

コマンド
CF_STACK_STATUS=$( 
        aws cloudformation describe-stacks 
          --stack-name ${CF_STACK_NAME} 
          --query "Stacks[?StackName == `${CF_STACK_NAME}`].StackStatus" 
          --output text 
) 
        && echo ${CF_STACK_STATUS}

結果(例):

  DELETE_IN_PROGRESS

2.3. イベントの確認

ステータスがROLLBUCKになった場合は、イベントを確認して原因を特定します。

コマンド
aws cloudformation describe-stack-events 
        --stack-name ${CF_STACK_NAME}

結果(例):

  (省略)

3. 事後作業

3.1. 完了条件の確認

削除したCloudFormationスタック”BasicWebServerInVPC”が存在しないことを確認します。

コマンド
aws cloudformation describe-stacks 
        --stack-name ${CF_STACK_NAME}

結果(例):

  An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id BasicWebServerInVPC does not exist

完了

続きを読む

[JAWS-UG CLI] CloudFormation:#5 スタックの作成

この手順の目的

CloudFormationスタック”BasicWebServerInVPC”を作成します。

作業対象

  • CloudFormationサービス

標準時間

8分

前提条件

作業権限

CloudFormationへの権限

CloudFormationに対してフル権限があること。

作業環境

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.14
コマンド
aws --version

結果(例):

  aws-cli/1.11.97 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.60

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

開始条件

作業に必要なモノ・情報

作業開始には、以下が全て揃っていることが必要です。

  • 設定ファイル用ディレクトリ

    • 今回は”${HOME}/tmp/conf-cloudformation”を設定ファイルディレクトリとします。
ls ${HOME}/tmp/conf-cloudformation
  • 存在しない場合は作成します。
mkdir -p ${HOME}/tmp/conf-cloudformation
  • CloudFormationスタック名

    • 作成するCloudFormationスタックの名称です。
    • 今回は”BasicWebServerInVPC”とします。
  • テンレートファイル

    • 検査の対象となるCloudFormationテンプレートファイルです。
    • 今回は”BasicWebServerInVPC.template”とします。
  • テンプレートのパラメータ

    • テンプレートに必要なパラメータです。
    • パラメータに含まれているリソースは存在するものとします。
変数の設定
EC2_KEYPAIR_NAME='<キーペア名>'

0. 準備

まず変数の確認をします。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}
        FILE_INPUT:          (0.5) ${FILE_INPUT}
        CF_STACK_PARAMETERS: (0.6) ${CF_STACK_PARAMETERS}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
  CF_STACK_NAME:       (0.4) BasicWebServerInVPC
  FILE_INPUT:          (0.5) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template
  CF_STACK_PARAMETERS: (0.6) ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。

0.1. プロファイルの指定

プロファイルの一覧を確認します。

コマンド
cat ~/.aws/credentials \
       | grep '\[' \
       | sed 's/\[//g' | sed 's/\]//g'

結果(例):

  iamFull-prjz-mbpr13
  <CloudFormationのフル権限が許可されているプロファイル>
変数の設定
export AWS_DEFAULT_PROFILE='<CloudFormationのフル権限が許可されているプロファイル>'

0.2. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. 設定ファイルディレクトリの指定

変数の設定
DIR_CONF="${HOME}/tmp/conf-cloudformation"

0.4. スタック名の指定

変数の設定
CF_STACK_NAME='BasicWebServerInVPC'

0.5. テンプレートファイル名の指定

変数の設定
FILE_INPUT="${DIR_CONF}/${CF_STACK_NAME}.template" \
        && echo ${FILE_INPUT}

0.6. パラメータの指定

変数の設定
CF_STACK_PARAMETERS="ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}" \
        && echo ${CF_STACK_PARAMETERS}

再確認

設定された変数の内容を再確認します。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        CF_STACK_NAME:       (0.4) ${CF_STACK_NAME}
        FILE_INPUT:          (0.5) ${FILE_INPUT}
        CF_STACK_PARAMETERS: (0.6) ${CF_STACK_PARAMETERS}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
  CF_STACK_NAME:       (0.4) BasicWebServerInVPC
  FILE_INPUT:          (0.5) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template
  CF_STACK_PARAMETERS: (0.6) ParameterKey=KeyName,ParameterValue=${EC2_KEYPAIR_NAME}

1. 事前作業

1.1. 作業対象の状態確認

設定ファイル用ディレクトリが存在することを確認します。

コマンド
ls -d ${DIR_CONF}

結果(例):

  <ディレクトリのフルパス名>

テンプレートファイルが設定ファイル用ディレクトリに存在することを確認します。

コマンド
ls -1 ${FILE_INPUT}

結果:

  ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template

作成しようとしているCloudFormationスタック”BasicWebServerInVPC”はまだ存在しないことを確認します。

コマンド
aws cloudformation describe-stacks \
        --stack-name ${CF_STACK_NAME}

結果(例):

  An error occurred (ValidationError) when calling the DescribeStacks operation: Stack with id BasicWebServerInVPC does not exist

2. 本作業

2.1. スタックの作成

変数の確認
cat << ETX

        CF_STACK_NAME:       ${CF_STACK_NAME}
        CF_STACK_PARAMETERS: ${CF_STACK_PARAMETERS}
        FILE_INPUT:          ${FILE_INPUT}

ETX
コマンド
aws cloudformation create-stack \
        --stack-name "${CF_STACK_NAME}" \
        --template-body file://${FILE_INPUT} \
        --parameters ${CF_STACK_PARAMETERS}

結果(例):

  {
    "StackId": "arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXXX:stack/BasicWebServerInVPC/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
  }

2.2. ステータスの確認

コマンド
CF_STACK_STATUS=$( \
        aws cloudformation describe-stacks \
          --stack-name ${CF_STACK_NAME} \
          --query "Stacks[?StackName == \`${CF_STACK_NAME}\`].StackStatus" \
          --output text \
) \
        && echo ${CF_STACK_STATUS}

結果(例):

  CREATE_IN_PROGRESS

2.3. イベントの確認

ステータスがROLLBUCKになった場合は、イベントを確認して原因を特定します

コマンド
aws cloudformation describe-stack-events \
        --stack-name ${CF_STACK_NAME}

結果(例):

  (省略)

3. 事後作業

3.1. 完了条件の確認

作成したCloudFormationスタック”BasicWebServerInVPC”が存在することを確認します。

コマンド
CF_STACK_STATUS=$( \
        aws cloudformation describe-stacks \
          --stack-name ${CF_STACK_NAME} \
          --query "Stacks[?StackName == \`${CF_STACK_NAME}\`].StackStatus" \
          --output text \
) \
        && echo ${CF_STACK_STATUS}

結果(例):

  CREATE_COMPLETE

完了

続きを読む

[JAWS-UG CLI] CloudFormation:#4 テンプレートの検査

この手順の目的

CloudFormationのテンプレートを検査(バリデート)します。

作業対象

  • CloudFormationテンプレート

標準時間

8分

前提条件

作業権限

CloudFormationへの権限

CloudFormationに対してフル権限があること。

作業環境

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.102
コマンド
aws --version

結果(例):

  aws-cli/1.11.102 Python/2.7.12 Linux/4.4.11-23.53.amzn1.x86_64 botocore/1.5.60

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

開始条件

作業に必要なモノ・情報

作業開始には、以下が全て揃っていることが必要です。

  • 設定ファイル用ディレクトリ

    • 今回は”${HOME}/tmp/conf-cloudformation”を設定ファイルディレクトリとします。
ls ${HOME}/tmp/conf-cloudformation
  • 存在しない場合は作成します。
mkdir -p ${HOME}/tmp/conf-cloudformation
  • テンレートファイル

    • 検査の対象となるCloudFormationテンプレートファイルです。
    • 今回は”BasicWebServerInVPC.template”とします。

0. 準備

まず変数の確認をします。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        FILE_INPUT:          (0.4) ${FILE_INPUT}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
  FILE_INPUT:          (0.4) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template

変数が入っていない、適切でない場合は、それぞれの手順番号について作業を行います。

0.1. プロファイルの指定

プロファイルの一覧を確認します。

コマンド
cat ~/.aws/credentials 
       | grep '[' 
       | sed 's/[//g' | sed 's/]//g'

結果(例):

  iamFull-prjz-mbpr13
  <CloudFormationのフル権限が許可されているプロファイル>
変数の設定
export AWS_DEFAULT_PROFILE='<CloudFormationのフル権限が許可されているプロファイル>'

0.2. リージョンの決定

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. 設定ファイルディレクトリの指定

変数の設定
DIR_CONF="${HOME}/tmp/conf-cloudformation"

0.4. テンプレートファイル名の指定

変数の設定
FILE_INPUT="${DIR_CONF}/BasicWebServerInVPC.template"   && echo ${FILE_INPUT}

再確認

設定されている変数の内容を再確認します。

変数の確認
cat << ETX

        AWS_DEFAULT_PROFILE: (0.1) ${AWS_DEFAULT_PROFILE}
        AWS_DEFAULT_REGION:  (0.2) ${AWS_DEFAULT_REGION}
        DIR_CONF:            (0.3) ${DIR_CONF}
        FILE_INPUT:          (0.4) ${FILE_INPUT}

ETX

結果(例):

  AWS_DEFAULT_PROFILE: (0.1) <CloudFormationのフル権限が許可されているプロファイル>
  AWS_DEFAULT_REGION:  (0.2) ap-northeast-1
  DIR_CONF:            (0.3) ${HOME}/tmp/conf-cloudformation
  FILE_INPUT:          (0.4) ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template

1. 事前作業

1.1. 作業対象の状態確認

設定ファイル用ディレクトリが存在することを確認します。

コマンド
ls -d ${DIR_CONF}

結果(例):

  <ディレクトリのフルパス名>

検査しようとしているcloudformationテンプレートファイル
“BasicWebServerInVPC.template”が存在することを確認します。

コマンド
ls -1 ${FILE_INPUT}

結果:

  ${HOME}/tmp/conf-cloudformation/BasicWebServerInVPC.template

2. 本作業

2.1. テンプレートのバリデーション

コマンド
aws cloudformation validate-template 
        --template-body file://${FILE_INPUT}

結果:

  (テンプレートの出力設定に応じた出力)

2.2. 結果の取得

変数の設定
RESULT_VALIDATION=$?

3. 事後作業

cloudformationテンプレート”BasicWebServerInVPC”が有効であることを確認します。

コマンド
echo ${RESULT_VALIDATION}

完了

続きを読む