AWSIaC

AWS CloudFormationでEC2にUserdataでパッケージをインストールする

AWS

以前にCloudFormationでEC2インスタンスを作成する方法について紹介いたしました。

AWSのCloudFormationでIaCを実践(4) – ec2 
https://syachiku.net/awscloudformationiac4-ec2/

これだけでは素のAmazonLinux2のインスタンスが作成されるだけで、その後の必要パッケージやアプリケーションの設定は手動で行う必要があります。

そこで今回はCloudFormationでEC2で使えるUserdataというものを使ってセットアップの自動化を進めていきたいと思います。

※今回の実施によって、利用料金が発生する可能性がありますので、あくまで自己責任でお願いします。

1. 前提条件

  • AWSアカウントが取得できていること
  • 適切な権限(=Admin相当)をもったIAMユーザーを作成していること
  • ルーティングなどの最低限のネットワークの知識があること
  • 作成するec2にセッションマネージャやSSHなどでアクセスできること
    • VPCやSecurityGroupなどの設定ができている
  • YAMLの書きかたを知っていること(CloudFormationはjsonもしくはyamlで書けますが、今回はyamlで書いていきます。)

2. Userdataとは?

EC2起動時に実行されるシェルスクリプトです。

起動時にホスト名、時刻同期、文字コード、タイムゾーンの設定をスクリプト化することでEC2の構築作業を省力化できます

3. 今回作成するAWS環境

  • EC2インスタンス起動後に最新パッケージにアップデート→gitとansibleをインストールしてみます。

4. CloudFormation Template

作成したCloudFormation Templateです。

UserData 以降でコマンドを実行するようにしています。

AWSTemplateFormatVersion: "2010-09-09"
Description:
  vpn sever instance

Parameters:
  ImageID:
    Type: String
    Default: "ami-083ac7c7ecf9bb9b0"
  KeyPairName:
    Type: AWS::EC2::KeyPair::KeyName
    Default: "aws-infra-keypair"
  InstanceType:
    Type: String
    Default: t2.micro
  SecurityGroupIds:
    Type: List<AWS::EC2::SecurityGroup::Id>
    Default: "sg-0eedab04a24d09894"
  InstanceSubnet:
    Type: AWS::EC2::Subnet::Id
    Default: "subnet-028403cbfad128a17"
  IamInstanceProfile:
    Type: String
    Default: "aws-infra-ec2-base-role-Ec2InstanceBaseProfile-1E2YHY9KMT12Y"
  Date:
    Type: String
    Description: YYYYMMDDhhmm
    Default: "2021xxxxxxxx"
Resources:
  Ec2Instance:
    Type: AWS::EC2::Instance
    Properties:
      IamInstanceProfile: !Ref IamInstanceProfile
      ImageId: !Ref ImageID
      KeyName: !Ref KeyPairName
      InstanceType: !Ref InstanceType
      NetworkInterfaces:
        - AssociatePublicIpAddress: True
          DeviceIndex: "0"
          SubnetId: !Ref InstanceSubnet
          GroupSet: !Ref SecurityGroupIds
      BlockDeviceMappings:
        - DeviceName: /dev/xvda
          Ebs:
            VolumeType: gp3
            VolumeSize: 80
      Tags:
        - { Key: Name, Value: !Sub "aws-infra-ec2-${Date}" }
        - { Key: Owner, Value: !Sub "aws-infra" }

      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash -xe
            yum update -y
            yum install -y git
            amazon-linux-extras enable ansible2
            yum install -y ansible
            echo "Testing Userdata" > /home/ec2-user/test.txt

5. スタックの作成

それでは先ほど作成したコードを使って、リソースを作成していきます。

マネージメントコンソールにログオンしてCloudFormationを開きます。

「スタックの作成」→「新しいリソースを使用」を選択します。「テンプレートファイルをアップロード」からコードのファイルを選択してアップします。

スタックの名称やパラメータを入力(デフォルトから変更したい場合には変更してください)してスタックの作成まで進めます。

6. 作成されたリソースの確認

しばらくするとステータスが「CREATE_COMPLETE」となりスタック作成が完了します。

それでは作成されたリソースを確認してみます。

6.1. EC2インスタンス

7. 動作確認

最後に作成したインスタンスに接続して想定した通りにインストールができているか確認してみます。

7.1. gitとansibleパッケージのインストール

インスタンスに接続して確認します。

[root@ip-10-1-10-250 ~]# rpm -qa | grep git-
git-core-2.32.0-1.amzn2.0.1.x86_64
git-core-doc-2.32.0-1.amzn2.0.1.noarch
git-2.32.0-1.amzn2.0.1.x86_64
[root@ip-10-1-10-250 ~]# rpm -qa | grep ansible
ansible-2.9.23-1.amzn2.noarch

想定した通りにインストールができています。

また、最後に実行したファイル(/home/ec2-user/test.txt )についても作成されています。

[root@ip-10-1-10-250 ~]# cat /home/ec2-user/test.txt
Testing Userdata

/var/log/cloud-init-output.logやcloud-init-output.logでは実際にインストールされた際のログが確認できます。

8. まとめ

想定した通りにUserDataを利用したパッケージのインストールの自動化ができました。

これだけでもかなりの効率化を図ることができます。

ただし、Userdataだけを利用していると、セットアップ量が多くなってくるとかなりCloudTemplateのサイズが肥大化してしまいますので、CloudFormationのHelper Scriptであるcfn-initやAnsibleやChefなどを利用したセットアップ方法についても検討ししていきたいと思います。

AWSを効率的に学習する方法

私がAWSを学習するために使った学習材料は「Udemy」だけです。

まずは座学を行ってAWSプラクティショナー もしくは ソリューションアーキテクト試験を取得することを目標にしました。

具体的にはUdemyで以下の2つの商材を購入して学習しました。AWS公式が提供している模擬試験も受けていません。

Udemyは世界最大級のオンライン学習プラットフォームで、世界中の学びたい人と教えたい人をオンラインでつなぐサービスです。 Udemyは米国Udemy,Inc.が運営するプラットフォームで日本ではベネッセが事業パートナーとして協業をしています。 C2C(consumer to consumer)により生まれる豊富で多彩な講座により個人の学習ニーズに応じた学びをみつけることができます。

これだけでOK! AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座(SAA-C02試験対応版)
【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集(6回分390問)

今回は以上となります。

コメント

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