スクリーンショット_2019-05-15_0

Udemy で AWS を学んでみた(4)

(1) (2) (3) (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'

この記事が気に入ったらサポートをしてみませんか?