[AWS] ElastiCache redis basic

特徴

  • Amazon EC2、Amazon CloudWatch、AWS CloudTrail、Amazon SNS など他の AWS のサービスとの連携。
  • node の障害を自動検出、復旧。

replication

  • cluster の read replica。(ElastiCache API、AWS CLI では replication groups と呼ばれる)
  • 単一 shard & 複数 node (Cluster 無効)、もしくは複数 shard & 複数 node (cluster 有効)の構成となる。

cluster mode

cluster mode 無効

  • cluster に 1つのみ node が存在。
  • shard は 1つのみ。
  • multi AZ 可能 (自動 failover 付)。
  • 1つの(R/W)primary node と、複数(最大5個)の読み取り専用 replica node。
  • read replica の primary への昇格はサポート。
  • multi AZ が設定してあると read replica を primary へ昇格できない(一度 multi AZ を無効にする必要有)。
  • shard は1つの為、node タイプは cluster すべてのデータと必要なオーバーヘッドに対応できるだけの大きさである必要がある。
  • スケーリングをサポート (replica の増加/削除、node type の scale up)。

cluster mode 有効

  • cluster に 複数 node が存在(最低1つの read replica node, primary node が必要)。
  • shard は複数(1~15個)。shard は node の group である。データのパーティション化を行い、多くのエンドポイントへ負荷を分散させるのが目的。作成後の shard 数変更は不可。
  • shard には primary node と、最大5つ read replica node が存在する。
  • multi AZ 可能 (自動 failover 付)。
  • multi AZ が設定してあると read replica を primary へ昇格できない(一度 multi AZ を無効にする必要有)。
  • multi AZ (+failover) が必要。
  • 手動で read replica の primary への昇格はできない。
  • cluster 構造、node type, shard 数、node 数は、バックアップから復元することでのみ変更可能。
  • 複数の shard 間でデータを分割でき、node type をより小さくできる。
  • スケーリングできない。する場合は新しく cluster を作成する必要がある。

有効/無効の差異
https://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/Replication.Redis-RedisCluster.html

redis snapshot の取得

  • 2.8.22 以降の redis では、同期、保存中に swap を利用せず多くのメモリを消費することができる。

maxmemory

  • instance type 毎に固定で値が決まっている。
  • maxmemory パラメータは変更できない。

maxmemory-policy

  • memory 最大使用量に達した際に、適用される削除ポリシー
  • https://redis.io/topics/lru-cache
  • 設定された maxmemory を超えると、パラメータグループで設定された maxmemory-policy に従い、容量を確保する。

policy は下記の通り。
* noeviction: error を返す。error を返すだけなので、client がさらに増えたら maxmemory を超える可能性がある。
* allkeys-lru: 直近利用された (LRU) key を削除する。
* volatile-lru: expire が設定され、直近利用された (LRU) key のみを削除する。
* allkeys-random: ランダムに key を削除。
* volatile-random: expire が設定された key のみ、ランダムに key を削除。
* volatile-ttl: expire が設定され、TTL が短い key を削除する。

AOF (Redis Append Only Files)

scale up

  • 自動。

scale down

  • 手動でやる必要がある。

monitoring

CPU 使用率

cloudwatch では、Redis はシングルスレッドであるため、メトリクスのCPU 使用率に CPU のコア数を乗算する必要がある。

AWS CLI

$ aws elasticache describe-cache-clusters --profile xxx
// endpoint 取得
$ aws elasticache describe-cache-clusters --cache-cluster-id mycluster --show-cache-node-info

$ aws elasticache describe-replication-groups --replication-group-id myreplgroup

[AWS][WordPress] サーバー移管/初期設定

環境例

環境 Ver.
OS Amazon Linux AMI 2017.03.1.20170812 x86_64 HVM GP2
WordPress 4.8.1
Apache 2.4
MySQL 5.7
PHP 7.0
EC2 type t2.micro

環境構築

インスタンスを立てる

VPCの構築、Security Groupの設定、ELBの設定、RDSの構築、DNSの登録、Certificate Managerから証明書の発行等は今回、省略する。

既存サーバの状況確認

ミドルウェアインストール状況、DBの状態、バージョン確認等。

$ php -m
mysql> SELECT HOST, USER FROM `mysql`.`user`;
mysql> SHOW GRANTS FOR '{USER_NAME}'@'{HOST_NAME}'\G;

パッケージアップデート

$ yum update

# セキュリティパッケージの更新のみの場合
$ yum update --security

パッケージインストール

$ yum install tree dstat sysstat iotop htop

Crontab(オプション)

開発環境の場合、節約の為に例えば毎日22時にインスタンスが停止するよう設定する。
/etc/crontab

0 22 * * *     root    /sbin/shutdown -h now >/dev/null 2>&1

TimeZoneの変更

# オリジナルをバックアップ
$ cp /etc/localtime /etc/localtime.org
$ diff /etc/localtime /etc/localtime.org

$ ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ cp /etc/sysconfig/clock /etc/sysconfig/clock.org
$ diff /etc/sysconfig/clock /etc/sysconfig/clock.org

/etc/sysconfig/clock

# ZONEの変更
ZONE="Asia/Tokyo"
# falseにするとハードウェアのクロックもローカルタイムで設定されてしまう為、変更しない
UTC=true

反映の確認

$ /etc/init.d/crond restart
$ strings /etc/localtime
TZif2
TZif2
JST-9

ntpdateの起動

Amazon Linuxは初期状態でNTPによるシステムクロックの同期を行っている。

$ chkconfig ntpdate on
$ chkconfig --list | grep ntpdate

iptablesの停止

セキュリティグループを利用しているため、iptablesは停止する。

chkconfig iptables off
chkconfig ip6tables off
chkconfig --list | grep ip

文字コードの変更

/etc/sysconfig/i18n

LANG="ja_JP.UTF-8"

ホスト名の変更

/etc/sysconfig/network

HOSTNAME={YOUR_HOSTNAME}

各種パッケージインストール

$ yum install httpd24 php70 mysql php70-mysqlnd php70-mbstring php70-bcmath php70-gd php70-pecl-imagick php70-imap php70-intl php70-pecl-oauth php70-pgsql php70-soap php70-xmlrpc php70-opcache
$ service httpd start
$ chkconfig httpd on

# httpdが有効であることを確認。実行レベル 2/3/4/5 がonの必要がある。
$ chkconfig --list httpd
httpd           0:off   1:off   2:on    3:on    4:on    5:on    6:off

Apacheのテストページがブラウザへ表示されることを確認。
PHP情報ページが表示されることを確認。

$ echo "<?php phpinfo(); ?>" > /var/www/html/phpinfo.php

現行環境とPHPモジュールの差異がないことを確認。

PHP設定ファイル更新

$ cp /etc/php.ini /etc/php.ini.org

/etc/php.ini

# 検証/開発環境のみ
display_errors = On
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
date.timezone = Asia/Tokyo
expose_php = Off
[imagick]
extension=imagick.so

RDSのパラメータグループの設定

以下の設定でRDSのパラメータグループを作成/適用。

  • character-set-client-handshake: 1
  • skip-character-set-client-handshake: 1
  • character_set_client: utf8
  • character_set_connection: utf8
  • character_set_database: utf8
  • character_set_filesystem: utf8
  • character_set_results: utf8
  • character_set_server: utf8
  • time_zone: Asia/Tokyo
  • collation_connection: utf8_general_ci
  • collation_server: utf8_general_ci
  • max_connect_errors: 999999999
  • max_connections: 2048
  • wait_timeout: 100

httpd.confとVirtualHostの設定

$ cd /etc/httpd/conf/
$ cp -p httpd.conf httpd.conf.org
$ mkdir /etc/httpd/conf/vhosts
$ mkdir -p /var/www/vhosts/xxx/htdocs

/etc/httpd/conf/httpd.conf

# 96行目付近
#ServerName www.example.com:80
ServerName xxx.com:80

# 121行目付近
DocumentRoot "/var/www/vhosts"

#
# Relax access to content within /var/www.
#
#<Directory "/var/www">
#    AllowOverride None
#    # Allow open access:
#    Require all granted
#</Directory>

# 133行目付近
#<Directory "/var/www/html">
<Directory "/var/www/vhosts">

# 154行目付近
#AllowOverride None
AllowOverride All

# 最終行付近
Include /etc/httpd/conf/vhosts/*.conf
KeepAlive On
KeepAliveTimeout 15
Timeout 300
$ mkdir /var/www/dvh

/etc/httpd/conf/vhosts/00_default_virtualhost.conf

<VirtualHost *:80>
    DocumentRoot /var/www/dvh/
    ServerName dummy
    ServerSignature Off
    <Location />
       Order deny,allow
       Deny from All
       Allow from 172
    </Location>
</VirtualHost>

/etc/httpd/conf/vhosts/httpd-vhosts.conf

<VirtualHost *:80>
    ServerName xxx.com
    DocumentRoot /var/www/vhosts/xxx/htdocs/wordpress
    <Directory "/var/www/vhosts/xxx/htdocs/wordpress">
        Require all granted
    </Directory>
</VirtualHost>

コンテンツ/DBデータを復元

# コンテンツ/dumpの取得
$ mysqldump --databases {DB_NAME} --default-character-set=utf8 --add-drop-database --user={USER_NAME} --password --host={HOST_NAME} > ./xxx.sql
$ GZIP=-9 tar czf xxx.tar.gz /path/to/directory

$ scp -P {PORT_NUM} -p {USER_NAME}@{HOST_NAME}:/path/to/xxx.sql.tar.gz ~/

# コンテンツ/dumpの復元
$ tar -zxf contents.tar.gz
$ tar -zxf dump.sql.tar.gz
$ mysql --databases {DB_NAME} --user={USER_NAME} --password --host={HOST_NAME} < ./xxx.sql

コンテンツディレクトリのPermission変更

$ chown apache:apache htdocs
$ find . -type d -exec chmod 0755 {} \;
$ find . -type f -exec chmod 0644 {} \;
$ chown -R apache:apache .
$ chmod -R g+w .
$ chmod 400 wp-config.php
$ chmod 644 .htaccess

wp-config.php の書き換え

/var/www/vhosts/xxx/htdocs/xxx/wp-config.php

define('DB_NAME', '{DB_NAME}');

/** MySQL のユーザー名 */
define('DB_USER', '{DB_USER}');

/** MySQL のパスワード */
define('DB_PASSWORD', '{DB_PASS}');

/** MySQL のホスト名 (ほとんどの場合変更する必要はありません。) */
define('DB_HOST', '{DB_HOST}:3306');

/** データベーステーブルのキャラクターセット (ほとんどの場合変更する必要はありません。) */
define('DB_CHARSET', 'utf8');

# 開発環境の場合は、Jetpackを開発者モードへ変更する。
define( 'JETPACK_DEV_DEBUG', true );

DB日付確認

日本時間となっていることを確認する。

mysql> SELECT now();
+---------------------+
| now()               |
+---------------------+
| 2017-04-xx 17:39:19 |
+---------------------+
1 row in set (0.00 sec)

DB内URL置換

xxx.jp → xxx.com/xxx 等へURLを変換する。
https://interconnectit.com/products/search-and-replace-for-wordpress-databases/ のツールを利用する。
“Search Regex” というWordPressプラグインでも置換が可能。

管理画面のサイトURL

http://xxx/wp-admin/options-general.php
サイトURLが新規URLへ変更されていることを確認する。

.htaccessの設定

  • wp-config.phpのアクセス制御
  • SSLへリダイレクト (ELB/CloudFrontへも対応)

/var/www/vhosts/xxx/htdocs/wordpress/wp-config.php

<?php
# add under for ELB
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') {
    $_SERVER['HTTPS'] = 'on';
}
/**
 * The base configuration for WordPress

/var/www/vhosts/xxx/htdocs/wordpress/.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !^https$
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !=https
RewriteCond %{REQUEST_URI} !^_health_check\.html$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>


<files wp-config.php>
    order allow,deny
    deny from all
</files>

# Not allowed access to .htaccess and .htpasswd
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

/var/www/vhosts/xxx/htdocs/wordpress/wp-admin/.htpasswd

# http://www.luft.co.jp/cgi/htpasswd.php で作成した値を貼り付け。

/var/www/vhosts/xxx/htdocs/wordpress/wp-admin/.htaccess

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
</IfModule>

# Basic Auth
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /var/www/vhosts/xxx/htdocs/wordpress/wp-admin/.htpasswd
AuthGroupfile /dev/null
require valid-user

# Not allowed access to .htaccess and .htpasswd
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

# maybe admin-ajax.php used by some plugin
<FilesMatch "(admin-ajax.php)$">
    Satisfy Any
    Order allow,deny
    Allow from all
    Deny from none
</FilesMatch>

Swapの作成

MB単位でTotal行のメモリ出力を行う。

$ free -tm
total       used       free     shared    buffers     cached
Mem:          3953       3315        637          0        161       2501
-/+ buffers/cache:        652       3300
Swap:            0          0          0
Total:        3953       3315        637

同程度のSwap容量を確保。

$ dd if=/dev/zero of=/swapfile bs=1M count=4000
4000+0 レコード入力
4000+0 レコード出力
4194304000 バイト (4.2 GB) コピーされました、 55.568 秒、 75.5 MB/秒
$ mkswap /swapfile
$ swapon /swapfile
$ chmod 600 /swapfile
$ free -tm

/etc/fstab

/swapfile swap swap defaults 0 0

サーバ構築後の管理画面設定

個人的に下記をインストール/有効化/設定している。

SEO対策プラグインの有効化

“All In One SEO Pack” をインストール/有効化

BackWPup

“AWS S3” へDump/コンテンツのBackupを定期的に行っている。

Better Delete Revision

作成した記事の “Revision” 等を削除し、動作を軽くする。

Comet Cache

キャッシュを消す。

SyntaxHighlighter Evolved

ソースコードのSyntaxをハイライト表示させる。

WordPressのツールバーを利用しないように設定

メニュー > JetPack > Writing > WordPress.com toolbar

“WordPress.com ツールバーを有効化” のチェックを外す。

Markdown設定

メニュー > ジェットパック > 設定 > composing

“プレーンテキストの Markdown 構文で投稿やページに書き込み” にチェック。

メニュー > あなたのプロフィール > ビジュアルエディター

“ビジュアルリッチエディターを使用しない” にチェック。

[AWS] Elastic BeanstalkのAutoscalingデプロイポリシー

バッチサイズやデプロイ中のヘルスチェックの動作を設定するオプション

[All at once]、[Rolling]、[Rolling with additional batch]、[Immutable]
・一度に全てのインスタンスへデプロイを反映させる時は”All at once”を選択する。
・デプロイ時にサービスに対しダウンタイムを発生させないようにするためには、”Rolling”を選択し1台ずつデプロイを行わせるようにする。
・全てのインスタンスを新しく構築し直す変更不可なデプロイは、”Immutable”を選択する。

例: Elastic Beanstalk config

ApplicationName: xxx
DateUpdated: 2017-08-18 05:22:49+00:00
EnvironmentName: dev
PlatformArn: arn:aws:elasticbeanstalk:ap-northeast-1::platform/Tomcat 7 with Java
  7 running on 64bit Amazon Linux/2.6.1
settings:
  AWSEBAutoScalingScaleDownPolicy.aws:autoscaling:trigger:
    LowerBreachScaleIncrement: '-1'
  AWSEBAutoScalingScaleUpPolicy.aws:autoscaling:trigger:
    UpperBreachScaleIncrement: '1'
  AWSEBCloudwatchAlarmHigh.aws:autoscaling:trigger:
    UpperThreshold: '90'
  AWSEBCloudwatchAlarmLow.aws:autoscaling:trigger:
    BreachDuration: '10'
    EvaluationPeriods: '1'
    LowerThreshold: '10'
    MeasureName: CPUUtilization
    Period: '10'
    Statistic: Average
    Unit: Percent
  AWSEBLoadBalancerSecurityGroup.aws:ec2:vpc:
    VPCId: null
  aws:autoscaling:asg:
    Availability Zones: Any
    Cooldown: '360'
    Custom Availability Zones: ap-northeast-1a
    MaxSize: '2'
    MinSize: '1'
  aws:autoscaling:launchconfiguration:
    BlockDeviceMappings: null
    EC2KeyName: xxx
    IamInstanceProfile: aws-elasticbeanstalk-ec2-role
    ImageId: ami-xxx
    InstanceType: t2.small
    MonitoringInterval: 5 minute
    RootVolumeIOPS: null
    RootVolumeSize: null
    RootVolumeType: null
    SSHSourceRestriction: tcp,xx,xx,xxx.xxx.xxx.xx/xx
    SecurityGroups: xxx
  aws:autoscaling:updatepolicy:rollingupdate:
    MaxBatchSize: '2'
    MinInstancesInService: '1'
    PauseTime: null
    RollingUpdateEnabled: 'true'
    RollingUpdateType: Health
    Timeout: PT30M
  aws:ec2:vpc:
    AssociatePublicIpAddress: null
    ELBScheme: public
    ELBSubnets: null
    Subnets: null
  aws:elasticbeanstalk:application:
    Application Healthcheck URL: /_health_check.html
  aws:elasticbeanstalk:cloudwatch:logs:
    DeleteOnTerminate: 'false'
    RetentionInDays: '7'
    StreamLogs: 'false'
  aws:elasticbeanstalk:container:tomcat:jvmoptions:
    JVM Options: -Duser.timezone="Asia/Tokyo" -Dhttps.protocols=TLSv1.1,TLSv1.2
    XX:MaxPermSize: 128m
    Xms: 512m
    Xmx: 1024m
  aws:elasticbeanstalk:control:
    DefaultSSHPort: '22'
    LaunchTimeout: '0'
    LaunchType: Migration
    RollbackLaunchOnFailure: 'false'
  aws:elasticbeanstalk:environment:
    EnvironmentType: LoadBalanced
    ExternalExtensionsS3Bucket: null
    ExternalExtensionsS3Key: null
    LoadBalancerType: classic
    ServiceRole: null
  aws:elasticbeanstalk:environment:proxy:
    GzipCompression: 'true'
    ProxyServer: apache
  aws:elasticbeanstalk:healthreporting:system:
    ConfigDocument: '{"Version":1,"CloudWatchMetrics":{"Instance":{"CPUIrq":null,"LoadAverage5min":null,"ApplicationRequests5xx":null,"ApplicationRequests4xx":null,"CPUUser":null,"LoadAverage1min":n...
    HealthCheckSuccessThreshold: Ok
    SystemType: basic
  aws:elasticbeanstalk:hostmanager:
    LogPublicationControl: 'false'
  aws:elasticbeanstalk:managedactions:
    ManagedActionsEnabled: 'false'
    PreferredStartTime: null
  aws:elasticbeanstalk:managedactions:platformupdate:
    InstanceRefreshEnabled: 'false'
    UpdateLevel: null
  aws:elasticbeanstalk:monitoring:
    Automatically Terminate Unhealthy Instances: 'true'
  aws:elasticbeanstalk:sns:topics:
    Notification Endpoint: xxx@xxx.com
    Notification Protocol: email
    Notification Topic ARN: arn:aws:sns:ap-northeast-1:xxx:ElasticBeanstalkNotifications-Environment-dev
    Notification Topic Name: null
  aws:elasticbeanstalk:xray:
    XRayEnabled: 'false'
  aws:elb:healthcheck:
    HealthyThreshold: '5'
    Interval: '10'
    Target: HTTP:80/_health_check.html
    Timeout: '5'
    UnhealthyThreshold: '5'
  aws:elb:listener:443:
    InstancePort: '80'
    InstanceProtocol: HTTPS
    ListenerEnabled: 'true'
    ListenerProtocol: HTTPS
    PolicyNames: null
    SSLCertificateId: arn:aws:acm:ap-northeast-1:xxx:certificate/xxx
  aws:elb:listener:80:
    InstancePort: '80'
    InstanceProtocol: HTTP
    ListenerEnabled: 'true'
    ListenerProtocol: HTTP
    PolicyNames: null
    SSLCertificateId: null
  aws:elb:loadbalancer:
    CrossZone: 'false'
    LoadBalancerHTTPPort: '80'
    LoadBalancerHTTPSPort: '443'
    LoadBalancerPortProtocol: HTTP
    LoadBalancerSSLPortProtocol: HTTPS
    SSLCertificateId: arn:aws:acm:ap-northeast-1:xxx:certificate/xxx
    SecurityGroups: sg-xxx
  aws:elb:policies:
    ConnectionDrainingEnabled: 'false'
    ConnectionDrainingTimeout: '20'
    ConnectionSettingIdleTimeout: '60'

トリガーのしきい値例

・MeasureName: CPU利用率
・UpperThreshold: CPU平均利用率 < 90% -> インスタンス増加
・LowerThreshold: CPU平均利用率 > 10% -> インスタンス減少
・Unit: 単位=%
・BreachDuration: 上記が10分継続した場合、Autoscalingが起動
・IgnoreHealthCheck: デプロイ時にHealthCheckは無視する

Rollingを指定したデプロイ時ダウンタイムを発生させない設定例

1. しきい値等変更作業

Autoscalingの設定、インスタンス台数の設定を変更する。
ダウンタイムを避けるためインスタンスを1台追加し、計2台で一時的に稼働させる。

・実行時間: 2分30秒
・ダウンタイム: 無

AWSEBCloudwatchAlarmHigh.aws:autoscaling:trigger:
  UpperThreshold: '90'
AWSEBCloudwatchAlarmLow.aws:autoscaling:trigger:
  BreachDuration: '10'
  LowerThreshold: '10'
  MeasureName: CPUUtilization
  Statistic: Average
  Unit: Percent
aws:autoscaling:asg:
  MaxSize: '4'
  MinSize: '2'
aws:autoscaling:updatepolicy:rollingupdate:
  MaxBatchSize: '2'
  MinInstancesInService: '2'
aws:elasticbeanstalk:command:
  BatchSizeType: Percentage
  IgnoreHealthCheck: 'true'

2. 新しいアプリケーションのデプロイ

2台のインスタンスへ対して、1つずつ順にデプロイされる。
その間、サイトが遅くなる可能性はあるものの、サービスのダウンタイムは発生しない。

・実行時間: 約6分30秒
・ダウンタイム: 無

3. インスタンス数を戻す

デプロイの為に追加したインスタンスの台数を減らす。
実行時間: 約2分

aws:autoscaling:asg:
  MaxSize: '4'
  MinSize: '1'
aws:autoscaling:updatepolicy:rollingupdate:
  MaxBatchSize: '2'
  MinInstancesInService: '2'

参考site

デプロイポリシーと設定
Elastic Beanstalk 環境設定のローリング更新
すべての環境に対する汎用オプション

[AWS][Beanstalk][Shell Script] デプロイスクリプト

AWS Elastic Beanstalk へのデプロイ

殴り書きです。

  • Gitからリポジトリを取得
  • 環境毎に設定を上書き
  • コンパイル
  • EB CLIでデプロイ

シェルスクリプト

sedで環境設定ファイルを書き換えている部分は引数渡しへ変更下さい。

#!/bin/bash
## Example of Beanstalk deploy
##
set -Ceu
PATH=/root/.local/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/opt/aws/bin:/root/bin

# Path
doc_path=/var/www/vhosts/
deploy_path=/var/www/vhosts/xxx
branch=develop

# Beanstalk Environment
prod_env=prod-xxx
stg_env=stg-xxx
dev_env=dev-xxx

# Beanstalk application
prod_app=xxx
stg_app=xxx
dev_app=xxx

# Beanstalk Keyname
prod_key=xxx
stg_key=xxx
dev_key=xxx

# AWS profile
prod_profile=prod
stg_profile=stg
dev_profile=dev

# Domain
prod_domain=xxx.com
stg_domain=xxx.com
dev_domain=xxx.com

# Internal ELB
prod_elb=internal-prod-xxx.com
sgc_elb=internal-stg-xxx.com
dev_elb=internal-dev-xxx.com

# Confirm Git CLI
if ! type 'git' > /dev/null 2>&1; then
  echo 'Git CLI not found.'
  exit 1
fi

cd ${doc_path}

# Confirm Deploy PATH
if [ -e "${deploy_path}" ]; then
  echo 'Remove existing Working copy.'
  rm -rf {woking copy}
fi

git clone https://github.com/xxx.git
cd ${deploy_path}

git checkout ${branch}

cd ${deploy_path}

git status

echo '~~~~~~~~~~~~ Overwrite conf file ~~~~~~~~~~~~'

# 00_application.conf
sed -i -e "s@${prod_elb}@${dev_elb}@g" ./src/main/ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf

# config.yml
sed -i -e "s@${prod_env}@${dev_env}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@${stg_env}@${dev_env}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@application_name: ${prod_app}@application_name: ${dev_app}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@default_ec2_keyname: ${prod_key}@default_ec2_keyname: ${dev_key}@g" ./.elasticbeanstalk/config.yml
sed -i -e "s@profile: ${prod_profile}@profile: ${dev_profile}@g" ./.elasticbeanstalk/config.yml

# httpd.conf ServerName
sed -i -e "s@${prod_domain}@${dev_domain}@g" ./src/main/ebextensions/httpd/conf/httpd.conf

# 00-basic-setting.config HOSTNAME
sed -i -e "s@${prod_domain}@${dev_domain}@g" ./src/main/ebextensions/00-basic-setting.config

if grep "${prod_elb}" "./src/main/ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf" >/dev/null; then
  echo 'failed to overwrite in 00_application.conf.'
  exit 1
elif grep "${prod_profile}" "./.elasticbeanstalk/config.yml" >/dev/null; then
  echo 'failed to overwrite in config.yml.'
  exit 1
elif grep "${prod_domain}" "./src/main/ebextensions/httpd/conf/httpd.conf" >/dev/null; then
  echo 'failed to overwrite in httpd.conf.'
  exit 1
else
  echo 'overwrite ok'
fi

echo '~~~~~~~~~~~~ Compile ~~~~~~~~~~~~'
mvn clean package

# Confirm EB CLI
if ! type 'eb' > /dev/null 2>&1; then
  echo 'EB CLI not found...'
  exit 1
fi

echo '~~~~~~~~~~~~ eb status ~~~~~~~~~~~~'
eb status ${dev_env}

echo '~~~~~~~~~~~~ Start deploy ~~~~~~~~~~~~'
eb deploy ${dev_env} --process --timeout 10

sleep 60s

echo '~~~~~~~~~~~~ eb logs ~~~~~~~~~~~~'
eb logs ${dev_env}

echo '~~~~~~~~~~~~ Deployment success ! ~~~~~~~~~~~~'

exit 0

関連記事

保護中: [AWS] AWS CLI

このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。