
Udemy で AWS を学んでみた(4)
■受講したコース(現在は新規購入停止中)
■メモ
□Codeシリーズ
・CodeCommit
・フルマネージドなソースコード管理サービス
・簡単に Git リポジトリをホストすることができる
・サードパーティ製のツールも利用可能
・プルリクエスト機能も利用可能
・CodeBuild
・フルマネージドなビルドサービス
・ソースコードのコンパイルを行ったり、テストを実行する環境を簡単に構築することができる
・CodeBuild 上で行う作業については、buildspec.yml に定義する
・CodeDeploy
・デプロイ自動化サービス
・appspec.yml にデプロイ時の動作を定義する
・デプロイ方式
・1台ずつ、半分ずつ、全て一気に、個別カスタマイズ
・デプロイ先にエージェントをインストールする必要がある
・CodePipeline
・継続的デリバリーをサポートするサービス
・Codecommit/CodeBuild/CodeDeployの流れをパイプラインとして定義することで、ソースコードがコミットされたらデプロイまで自動化
□環境構築自動化サービス
・Elastic Beanstalk
・定番インフラ構成の自動構築および App デプロイの自動化サービス
・Web サーバ構成(ELB + Auto Scaling + EC2)
・Batch ワーカ構成(SQS + Auto Scaling + EC2)
⇒アプリ開発に注力できる反面、自由度は低い
・OpsWorks
・Chef を利用した構成管理サービス
・EC2 上のエージェントが OpsWorks 上の Chef レシピを参照して自動構築
・自前で Chef Server/Client を構築・保守しなくて良い
⇒Chef を既に利用している場合に最適だが、OS より下のレイヤーではできないことも多い
・CloudFormation・CloudFormation
・AWS のリソース管理・構築を自動化するサービス
・テンプレートを JSON やYAML 形式で記述
・テンプレートを元に AWS リソースの自動構築
⇒OS より下のレイヤーでは自由度が高くなんでもできる(OS より上はサポート外)
□CloudFormation ベストプラクティス
1. 組み込み関数を使って環境に依存しないテンプレートを目指す
2. リソース追加・変更は必ず CloudFormation で行う
3. テンプレートをバージョン管理する
4. システムの規模やライフサイクルによってテンプレートを分割する
□その他
■実戦メモ
□CodeCommit の利用
・事前準備
$ aws configure
・CodeCommit リポジトリの作成
・初期設定
// 事前に credential に登録した IAM ユーザ情報を利用して CodeCommit に接続する
$ git config --global credential.helper '!aws --region ap-northeast-1 codecommit credential-helper $@'
$ git config --global credential.UseHttpPath true
// ユーザのメールアドレスと名前を設定する
git config --global user.email "<メールアドレス>"
git config --global user.name "<ユーザー名>"
・リポジトリ設定
// 作業ディレクトリに移動
$ cd <ソースコード管理ディレクトリ>
// リポジトリ登録
$ git init
$ git remote add origin <CodeCommit で作成したリポジトリのクローンURL(HTTPS)>
$ git add -A
$ git commit -m "first commit"
$ git push origin master
□CodeBuild の利用
・S3 バケットの作成
・ビルド後のプログラムを格納するため
・「バージョニング」を有効化
・buildspec.yml の作成
========== buildspec.yml ==========
version: 0.1
phases:
build:
commands:
- aws deploy push --region ap-northeast-1 --application-name <次手順で作成する CodeBuild プロジェクト名> --s3-location s3://<作成した S3 バケット名>/sample.zip --source src
artifacts:
files:
- '**/*'
base-directory: src
name: sample.zip
・CodeBuild プロジェクトの作成
・buildspec.yml の --application-name で指定した名前のプロジェクトを作成
・Source に CodeCommit で作成したリポジトリ名を指定
・Artifacts に S3 で作成したバケット名を指定
・Namespace type に Build ID を指定
・Service role を新規作成
・ポリシーを追加でアタッチ
・AWSCodeDeployDeployerAccess
・AmazonS3FullAccess(本当は権限をもっと絞る必要がある)
・CodeBuild を実行
□CodeDeploy の利用
・EC2 インスタンス用の IAM ロールを作成
・AmazonS3FullAccess ポリシーをアタッチ(本当はよくない)
・作成した IAM ロールを デプロイ先の EC2 インスタンスに割り当て
・EC2 インスタンスに CodeDeploy エージェントを導入
// CodeDeployエージェントのインストール
$ wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install
$ chmod +x install
$ sudo ./install auto
・CodeDeploy 用の IAM ロールを作成
・AWSCodeDeployRole ポリシーをアタッチ
・CodeDeploy アプリケーションを作成
・カスタムアプリケーションを選択
・コンピューティングプラットフォーム:EC2/オンプレミス
・デプロイグループの作成
・サービスロールに事前に作成した IAMロールを選択
・環境設定にデプロイ先を設定
例)Amazon EC2 インスタンスで Name タグが「web」
・デプロイの作成
□CodePipeline の利用
・CodePipeline の作成
・CodePipeline 用の IAM ロールの作成
・ソース元の指定(CodeCommit)
・ビルド方式の指定(CodeBuild)
・デプロイ方式の指定(CodeDeploy)
*Pipeline 作成時と CodeCommit への Push 時に動作する
・変更を Pushし、CodePipeline が実行されることを確認
□(CloudFormation)Webサーバ2台+DBサーバ(RDS)+ロードバランサ
AWSTemplateFormatVersion: '2010-09-09'
Description: demo CloudFormation Template
Parameters:
# EC2インスタンスの選択
InstanceType:
Type: String
Default: t2.micro
AllowedValues:
- t2.micro
- t2.small
- t2.medium
Description: Select EC2 instance Type.
# キーペアの選択
KeyPair:
Type: AWS::EC2::KeyPair::KeyName
Description: Select KeyPair Name.
Resources:
## VPC
# VPCの作成
demoVpc:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: '192.168.0.0/16'
Tags:
- Key: 'Name'
Value: 'demo-vpc'
## Subnet
# パブリックサブネットの作成(1)
demoPublicSubnet1a:
Type: 'AWS::EC2::Subnet'
Properties:
CidrBlock: '192.168.1.0/24'
AvailabilityZone: 'ap-northeast-1a'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'demo-public-subnet-1a'
VpcId: !Ref demoVpc
# パブリックサブネットの作成(2)
demoPublicSubnet1c:
Type: 'AWS::EC2::Subnet'
Properties:
CidrBlock: '192.168.2.0/24'
AvailabilityZone: 'ap-northeast-1c'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'demo-public-subnet-1c'
VpcId: !Ref demoVpc
# プライベートサブネットの作成(1)
demoPrivateSubnet1a:
Type: 'AWS::EC2::Subnet'
Properties:
CidrBlock: '192.168.11.0/24'
AvailabilityZone: 'ap-northeast-1a'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'demo-private-subnet-1a'
VpcId: !Ref demoVpc
# プライベートサブネットの作成(2)
demoPrivateSubnet1c:
Type: 'AWS::EC2::Subnet'
Properties:
CidrBlock: '192.168.12.0/24'
AvailabilityZone: 'ap-northeast-1c'
MapPublicIpOnLaunch: true
Tags:
- Key: 'Name'
Value: 'demo-private-subnet-1c'
VpcId: !Ref demoVpc
# インターネットゲートウェイの作成
demoInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: 'Name'
Value: 'demo-igw'
# インターネットゲートウェイをVPCにアタッチ
demoAttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref demoVpc
InternetGatewayId: !Ref demoInternetGateway
# カスタムパブリックルートテーブルの作成
demoPublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
Tags:
- Key: 'Name'
Value: 'demo-public-rt'
VpcId: !Ref demoVpc
# カスタムプライベートルートテーブルの作成
demoPrivateRouteTable:
Type: AWS::EC2::RouteTable
Properties:
Tags:
- Key: 'Name'
Value: 'demo-private-rt'
VpcId: !Ref demoVpc
# ルートの作成
demoRoute:
Type: AWS::EC2::Route
DependsOn: demoInternetGateway
Properties:
RouteTableId: !Ref demoPublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref demoInternetGateway
# カスタムパブリックルートテーブルの関連付け(1)
demoPublicSubnet1aRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref demoPublicSubnet1a
RouteTableId: !Ref demoPublicRouteTable
# カスタムパブリックルートテーブルの関連付け(2)
demoPublicSubnet1cRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref demoPublicSubnet1c
RouteTableId: !Ref demoPublicRouteTable
# カスタムプライベートルートテーブルの関連付け(1)
demoPrivateSubnet1aRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref demoPrivateSubnet1a
RouteTableId: !Ref demoPrivateRouteTable
# カスタムプライベートルートテーブルの関連付け(2)
demoPrivateSubnet1cRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref demoPrivateSubnet1c
RouteTableId: !Ref demoPrivateRouteTable
## EC2
# Webサーバ用EC2インスタンス(1)
demoWebEC2Instance1:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: "ami-3bd3c45c"
InstanceType: !Ref InstanceType
SubnetId: !Ref demoPublicSubnet1a
BlockDeviceMappings:
- DeviceName: '/dev/xvda'
Ebs:
VolumeType: 'gp2'
VolumeSize: 8
UserData: !Base64 |
#!/bin/bash
# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=demo-demo-web1/g' /etc/sysconfig/network
hostname 'demo-demo-web1'
# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
# 必要なパッケージの導入
yum update -y
yum install -y httpd24
yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
yum install -y mysql
yum install -y git
Tags:
- Key: 'Name'
Value: 'demo-web-instance1'
SecurityGroupIds:
- !Ref demoWebSecurityGroup
KeyName: !Ref KeyPair
# Webサーバ用EC2インスタンス(2)
demoWebEC2Instance2:
Type: 'AWS::EC2::Instance'
Properties:
ImageId: "ami-3bd3c45c"
InstanceType: !Ref InstanceType
SubnetId: !Ref demoPublicSubnet1c
BlockDeviceMappings:
- DeviceName: '/dev/xvda'
Ebs:
VolumeType: 'gp2'
VolumeSize: 8
UserData: !Base64 |
#!/bin/bash
# ホスト名設定
sed -i 's/^HOSTNAME=[a-zA-Z0-9\.\-]*$/HOSTNAME=demo-demo-web2/g' /etc/sysconfig/network
hostname 'demo-demo-web2'
# タイムゾーン設定
cp /usr/share/zoneinfo/Japan /etc/localtime
sed -i 's|^ZONE=[a-zA-Z0-9\.\-\"]*$|ZONE="Asia/Tokyo”|g' /etc/sysconfig/clock
# 言語設定
echo "LANG=ja_JP.UTF-8" > /etc/sysconfig/i18n
# 必要なパッケージの導入
yum update -y
yum install -y httpd24
yum install -y php70 php70-mbstring php70-pdo php70-mysqlnd
yum install -y mysql
yum install -y git
Tags:
- Key: 'Name'
Value: 'demo-web-instance2'
SecurityGroupIds:
- !Ref demoWebSecurityGroup
KeyName: !Ref KeyPair
# Webサーバ用セキュリティグループ
demoWebSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "demoWebSecurityGroup"
VpcId: !Ref demoVpc
Tags:
- Key: 'Name'
Value: 'demo-sg-web'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
## ELB
# ターゲットグループの作成
demoTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
Port: 80
Protocol: 'HTTP'
Tags:
- Key: 'Name'
Value: 'demo-tg'
Targets:
- Id: !Ref demoWebEC2Instance1
- Id: !Ref demoWebEC2Instance2
TargetType: 'instance'
VpcId: !Ref demoVpc
# リスナーの作成
demoListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: 'forward'
TargetGroupArn: !Ref demoTargetGroup
LoadBalancerArn: !Ref demoLoadBalancer
Port: '80'
Protocol: 'HTTP'
# ELBの作成
demoLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
SecurityGroups:
- !Ref demoLBSecurityGroup
Subnets:
- !Ref demoPublicSubnet1a
- !Ref demoPublicSubnet1c
Tags:
- Key: 'Name'
Value: 'demo-lb'
# ロードバランサー用セキュリティグループの作成
demoLBSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "demoLBSecurityGroup"
VpcId: !Ref demoVpc
Tags:
- Key: 'Name'
Value: 'demo-sg-lb'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '80'
ToPort: '80'
CidrIp: 0.0.0.0/0
## RDS
# MYSQL インスタンスの作成
demoDBInstance:
Type: 'AWS::RDS::DBInstance'
Properties:
AllocatedStorage: '20'
AutoMinorVersionUpgrade: true
DBInstanceClass: 'db.t2.micro'
DBParameterGroupName: !Ref demoDBParameterGroup
DBSubnetGroupName: !Ref demoDBSubnetGroup
Engine: 'mysql'
EngineVersion: '5.7.25'
MasterUsername: 'root'
MasterUserPassword: 'rootroot'
MultiAZ: true
PreferredBackupWindow: '20:00-20:30'
PreferredMaintenanceWindow: 'Sat:19:00-Sat:19:30'
VPCSecurityGroups:
- !Ref demoDbSecurityGroup
Tags:
- Key: 'Name'
Value: 'demo-db-instance'
# セキュリティグループの作成
demoDbSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: "demoDbSecurityGroup"
VpcId: !Ref demoVpc
Tags:
- Key: 'Name'
Value: 'demo-sg-db'
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: '22'
ToPort: '22'
SourceSecurityGroupId: !Ref demoWebSecurityGroup
- IpProtocol: tcp
FromPort: '3306'
ToPort: '3306'
SourceSecurityGroupId: !Ref demoWebSecurityGroup
# パラメータグループの作成
demoDBParameterGroup:
Type: "AWS::RDS::DBParameterGroup"
Properties:
Description: 'demo-db-pg'
Family: 'MySQL5.7'
Parameters:
slow_query_log: '1'
Tags:
- Key: 'Name'
Value: 'demo-db-pg'
# サブネットグループの作成
demoDBSubnetGroup:
Type: "AWS::RDS::DBSubnetGroup"
Properties:
DBSubnetGroupDescription: 'demo-db-subnetgroup'
DBSubnetGroupName: 'demo-db-subnetgroup'
SubnetIds:
- !Ref demoPrivateSubnet1a
- !Ref demoPrivateSubnet1c
Tags:
- Key: 'Name'
Value: 'demo-db-sg'