以前に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を学習するために実施した方法は以下の通りです。
①最初に書籍(ハンズオンができる)を購入、座学でAWSの基礎を学習
②AWS資格試験を取得ための学習
※私の場合は①と②を合わせて2か月でソリューションアーキテクトを取得できました。
①AWS基礎学習
最初に購入した書籍は「Amazon Web Services 基礎からのネットワーク&サーバー構築」です。
Amazon Web Services 基礎からのネットワーク&サーバー構築
この本では、AWSの基本サービスを利用したハンズオンを通じて、AWSの基礎を学習することができます。
また、タイトル通りAWSのネットワークやインフラに関しても網羅しているため、もともとインフラ系の技術者ではない人たちにとっても分かりやすい内容だと思います。
とりあえずAWS上にサーバーを設定して開発を行うための準備までするには最良の一冊です。
Amazon Web Services 基礎からのネットワーク&サーバー構築
②AWS資格取得
AWSの基礎をある程度学習することができたら、次はAWS資格を取得しましょう。まずはAWSソリューションアーキテクトを目指しましょう。
資格勉強のための問題集をひたすら解きながら、AWSの知識を積み重ねて習得していきましょう!
苦行ではありますが、この問題集を3周ほどすればAWS用語や構成に関しても習得できているはずです。
今回は以上となります。
コメント