【AWS】CloudFormationでEC2を立ち上げてSSH接続まで

いよいよ、Infrastructure as Code的なことしていきます

Infrastructure as Codeって何?って人は、ここに書いてあることをとりあえずやってみて、自分なりにテンプレートをカスタマイズしてみた方が、習得は早いと思っております

全てを理解してからやろうとすると情報量が多いので正直しんどいので、気負わずにやっちゃいましょー!

やることの概要を書いておきます

・EC2にSSHする時に使う鍵を作る
・構築するクラウドリソースをymlファイルに定義する
・ymlファイルを基にCloudFormationでクラウドリソースを構築する
・SSHできるか確認する
・構築したクラウドリソースを削除する

では、始めます

最初に、EC2にSSHする時に使う鍵を作ります

$ aws ec2 create-key-pair --key-name TestCFPair --query 'KeyMaterial' --output text > TestCF.pem

では、構築するクラウドリソースをymlファイルに定義します

Parameters:
  KeyName:
    Description: input EC2 Keyname
    Type: 'AWS::EC2::KeyPair::KeyName'
Resources:
  testVPC:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.0.0.0/16
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: testVPC
  testIGW:
    Type: 'AWS::EC2::InternetGateway'
    Properties:
      Tags:
        - Key: Name
          Value: testIGW
  PublicRoute:
    Type: 'AWS::EC2::RouteTable'
    Properties:
      VpcId: !Ref testVPC
      Tags:
        - Key: Name
          Value: PublicRoute
  Route:
    Type: 'AWS::EC2::Route'
    Properties:
      RouteTableId: !Ref PublicRoute
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref testIGW
  AttachIGW:
    Type: 'AWS::EC2::VPCGatewayAttachment'
    Properties:
      InternetGatewayId: !Ref testIGW
      VpcId: !Ref myVPC
  testSubnet:
    Type: 'AWS::EC2::Subnet'
    Properties:
      AvailabilityZone: ap-northeast-1a
      CidrBlock: 10.0.0.0/24
      VpcId: !Ref testVPC
      Tags:
        - Key: Name
          Value: testSubnet
  testSubnetRouteTableAssociation:
    Type: 'AWS::EC2::SubnetRouteTableAssociation'
    Properties:
      SubnetId: !Ref testSubnet
      RouteTableId: !Ref PublicRoute
  testSG:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      VpcId: !Ref testVPC
      GroupDescription: testIGW
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: '22'
          ToPort: '22'
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: testSG
  testEC2:
    Type: 'AWS::EC2::Instance'
    Properties:
      AvailabilityZone: ap-northeast-1a
      ImageId: ami-0318ecd6d05daa212
      InstanceType: t2.micro
      KeyName: !Ref KeyName
      SubnetId: !Ref testSubnet
      SecurityGroupIds:
        - !Ref testSG
      Tags:
        - Key: Name
          Value: testEC2
  testEIP:
    Type: 'AWS::EC2::EIP'
    Properties:
      InstanceId: !Ref testEC2

それではaws cliで、ymlファイルを基にCloudFormationでクラウドリソースを構築します

$ aws cloudformation create-stack --stack-name teststack --template-body file://<ymlファイルのパス> --parameters ParameterKey=KeyName,ParameterValue=TestCFPair

問題なければ下記の応答が返ってきます

{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:986340587505:stack/teststack/04243050-8c34-11ea-8747-06cfba976b48"
}

しばらく待って、EC2インスタンスが作成されたか確認しましょう

$ aws ec2 describe-instances

僕の場合はこんな感じ↓で作成されていることがわかります

        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0318ecd6d05daa212",
                    "InstanceId": "i-0003fe1198f6ba9e4",
                    "InstanceType": "t2.micro",
                    "KeyName": "TestCFPair",
                    "LaunchTime": "2020-05-02T05:24:01+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
          ・・・

そうしたら、InstanceIdをメモってもらって、IPアドレスを調べます

$ aws ec2 describe-instances --instance-id <インスタンスID>

そうすると、↓の感じで返ってくるので、PublicIpAddressをメモりましょう

{
    "Reservations": [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-0318ecd6d05daa212",
                    "InstanceId": "i-0003fe1198f6ba9e4",
                    "InstanceType": "t2.micro",
                    "KeyName": "TestCFPair",
                    "LaunchTime": "2020-05-02T05:24:01+00:00",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "Placement": {
                        "AvailabilityZone": "ap-northeast-1a",
                        "GroupName": "",
                        "Tenancy": "default"
                    },
                    "PrivateDnsName": "ip-10-0-0-175.ap-northeast-1.compute.internal",
                    "PrivateIpAddress": "10.0.0.175",
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "PublicIpAddress": "18.178.61.76",
                    "State": {
                    "ProductCodes": [],
                    "PublicDnsName": "",
                    "PublicIpAddress": "18.178.61.76",
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    },
           ・・・

それでは、いよいよSSH接続です

その前に最初に作ったSSH鍵の権限を400にしておいてくださいね

$ chmod 400 .ssh/TestCF.pem

では、SSH接続します!

$ ssh -i .ssh/TestCF.pem ec2-user@<PublicIPアドレス>

はい、ドンッ!!

$ ssh -i TestCF.pem ec2-user@<PublicIPアドレス>

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
4 package(s) needed for security, out of 7 available
Run "sudo yum update" to apply all updates.

来ました。

最高です。

もう満足なので、構築したリソースは削除しましょう

削除も簡単です

$ aws cloudformation delete-stack --stack-name teststack

以上です

いやー、気分がいいですねー

Have a nice golden week! Stay home!

Please share this page:

コメントを残す