第一次使用GCP
因为我帮忙了,所以先写个备忘录。不写下来就会忘记。
根据情况不同,通过在WEB控制台界面进行设置,就会出现CLI和Rest的链接,这样可以方便地保留证据并确保可再现性,我觉得这很方便和友好。
另外,手册写得很详细,看起来值得仔细阅读。
· 云域名解析服务
首先,通过 CloudDNS 购买域名(由于这个过程需要手动操作,就不详细介绍了)。可以参考以下链接:
https://qiita.com/NagaokaKenichi/items/95052742d40392f3215e
· 网络:例如VPC
只要默认规则足够满足现有的防火墙规则,其实也不需要做太多事情,毕竟默认设置已经足够好了。
(听说AWS等的默认网络设置不太快,但我自己并没有测试过。。。)
gcloud compute --project=$mypj networks create ${myvpc1} --description=${mypj}-${myvpc1} --mode=custom
gcloud compute --project=$mypj networks subnets create ${mypj}-subnet1 --network=${myvpc1} --region=${myregion} --range=10.0.0.0/22 --enable-private-ip-google-access
防火墙
网络安全组(即AWS中的ACL)和VPC菜单中的防火墙(即AWS中的安全组)是存在的,对于防火墙来说,它是针对每个实例进行配置的,不能设置在HTTP负载均衡器上,而HTTP负载均衡器可以在后端服务上设置网络安全组,但网络安全组只能处理IP,无法处理TCP等,这是其特点。(AWS中ELB也可以进行安全组配置,实际上可以为所欲为,但选择子网指定更快速,一条规则只分配给一个对象更好,需要注意避免复杂化。另外,可能需要在nginx方面进行限制,因为无法像BigIP那样注册大量的源IP。)
另外,如果想要批量处理,可以在实例(宿主端)和规则中设置NW标签,以便与匹配项受到限制。如果是通用规则,还可以适用于整个项目。
默认的SSH规则是开放的,所以最好进行限制。
默认规则适用于默认的VPC和子网,所以如果创建了它们,则需要为项目新建规则。
gcloud compute --project=$mypj firewall-rules create ${allow-company} --description=${allow-from-company-ssh-web} --direction=INGRESS --priority=1000 --network=${myvpc1} --action=ALLOW --rules=icmp,tcp:80,tcp:443,tcp:22 --source-ranges=${source-ip-range1},${source-ip-range2} --target-tags=web
如果在进行准备期间等情况下不全力前进,未经过负载均衡器的健康检查,将无法连接到后端服务器并使后端服务保持无效状态,因此请注意。
https://cloud.google.com/compute/docs/load-balancing/health-checks?hl=ja
计算引擎
参考:https://qiita.com/kazunori279/items/c35cbc24c5b93df3ee6b
请参考这个链接:https://qiita.com/kazunori279/items/c35cbc24c5b93df3ee6b
以下是对”ssh鍵認証まわり”的中文本地化表达方式:
SSH密钥认证相关
https://qiita.com/NewGyu/items/3a65e837519297951e79
https://cloud.google.com/compute/docs/ssh-in-browser?hl=ja
https://cloud.google.com/compute/docs/instances/connecting-to-instance#generatesshkeypair
就像所谓的实例服务器IaaS那样。当想要使用GCP的实例启动速度很快时,可以使用它。
如果将密钥注册到元数据中,可以将其作为密钥认证用于账户。
可以从各种官方镜像正常启动。
通过CloudShell(在右上角点击[>_]符号,会出现可使用gcloud命令的CUI控制台)进行连接和设置。
但是在CloudShell中创建的密钥可能无法成功复制粘贴,因此似乎最好通过其他方法进行传输。
$ gcloud beta compute --project "$mypj" instances create "$mynode1" \
--zone "${myregion}-a" --machine-type "n1-standard-1" --subnet "$mysubnet1" \
--maintenance-policy "MIGRATE" \
--service-account "$myaccount" \
--scopes "https://www.googleapis.com/auth/datastore" \
--min-cpu-platform "Automatic" --tags "web" --image "centos-7-v20180314" --image-project "centos-cloud" \
--boot-disk-size "20" --boot-disk-type "pd-standard" --boot-disk-device-name "$mydisc1"
需要注意防火墙规则的限制才能登录到已经启动的实例。(由于不是默认网络,所以SSH端口不是完全开放的)
通过以下命令从CloudShell连接,并且允许tcp:22传入本地的全局IP值,可以通过wget -q -O – http://taruo.net/ip/?raw来获取。
$ gcloud compute --project "$mypj" ssh --zone "${myregion}-a" "$mynode1"
执行此操作后,会自动在实例上使用Gmail在GCP上注册并登录到控制台的同名操作系统帐户,该帐户具有sudo权限,并且还会创建密钥并进行密钥注册。
每次连接 CloudShell 时,它的 IP 地址都会发生变化,但是在使用 ANSIWHOIS 进行搜索后发现 GCP 的 IP 范围似乎是以下所示,所以我认为允许 SSH 的默认范围比全开还是要好一些。
NetRange: 35.192.0.0 - 35.207.255.255
CIDR: 35.192.0.0/12
NetName: GOOGLE-CLOUD
在获取机器镜像时,建议要停止操作,但也可以不停止进行获取(虽然不能保证一致性,但如果不是有状态的话应该没问题)。
・HTTP负载均衡器
有大约3种类型的负载均衡器,其中有http(s)负载均衡器(仅限于L7的http和https)以及ssl代理(可以选择几种L7,TCP协议)和网络负载均衡器(L4)。每种负载均衡器的设置选项似乎都不同。
本次我选择了http(s)负载均衡器。
如果将SSL策略设置为Beta,并且最低TLS版本设置为TLS 1.2,也是可能的。(仅限CLI设置)
进行证书注册后创建实例组,然后注册实例并创建后端服务,然后可以通过创建负载均衡器来设置前端服务和URL映射等。由于后端服务通过80端口访问,如果不直接访问服务器端,就不需要进行证书注册(本次使用pgadmin4共存,服务器端也启用了SSL)。
使用letsencrypt和clouddns创建通配符和SAN证书。
好像原本应该是通配符的,但是出现了名字不匹配的错误,所以根据SAN(ServerAliasName)添加了-d重新创建之类的操作。
在以下ACME v2通配符文档中(https://letsencrypt.jp/docs/acme-v2-wildcards.html)解释了如何使用Let’s Encrypt证书来设置通配符域名(https://advanceffort.com/lets-encrypt-%E3%83%AF%E3%82%A4%E3%83%AB%E3%83%89%E3%82%AB%E3%83%BC%E3%83%89%E8%A8%AD%E5%AE%9A%E6%89%8B%E9%A0%86/)。
sudo certbot certonly --manual --agree-tos --manual-public-ip-logging-ok \
-d "*.${mydomain1}" -d "${mydomain1}" -d "${mydomain2}" -d "${mydomain3}" \
--preferred-challenges dns -m ${my_mailaddr} --server https://acme-v02.api.letsencrypt.org/directory
如果DNS成功地记录并传播了给定的子域名和令牌的TXT记录,就根据”-d”的数量重复按下Enter键。
将证书注册到LB上。
使用日期进行注册并进行替换,更新时不会中断(提供包含中间证书的fullchain.pem进行上传)。
#日付つきの名前で証明書登録
sudo gcloud compute ssl-certificates create ${mydomain1}-cert-$(/bin/date +%Y%m%d) \
--certificate /etc/letsencrypt/live/${mydomain1}/fullchain.pem \
--private-key /etc/letsencrypt/live/${mydomain1}/privkey.pem \
--description "$(/bin/date +%Y%m%d) ${mydomain1} wildcard certification."
#ターゲットHTTPプロキシリソースの証明書を更新する
sudo gcloud compute target-https-proxies update $my-lb1-target-proxy \
--ssl-certificates ${mydomain1}-cert-$(/bin/date +%Y%m%d) --url-map $my-lb1
# ターゲットHTTPプロキシリソースをフロントエンドに割り当てる
sudo gcloud compute forwarding-rules set-target $my-fs --target-https-proxy $my-lb1-target-proxy --global
# ふるい証明書リソースを削除
$ sudo gcloud compute ssl-certificates delete ${mydomain1}-cert-yyyymmdd -q
创建周围的LB
创建实例组
看起来似乎在控制台上显示只有在单一区域才能选择未管理的选项。
(自动扩展、自动恢复、图像模板注册等托管功能可以在单一或多个区域选择,但未受管理的选项只能选择单一区域)
$ sudo gcloud compute --project=$mypj instance-groups unmanaged \
create ${my-ins-group1} --zone=${myregion}-a
$ sudo gcloud compute --project=$mypj instance-groups unmanaged \
add-instances ${my-ins-group1} --zone=${myregion}-a --instances=${myhost1}
制作健康检查
sudo gcloud compute --project "$mypj" http-health-checks create "$my-helthchk-1" --port "80" \
--request-path "/" --check-interval "60" --timeout "60" --unhealthy-threshold "2" --healthy-threshold "5"
创建后端服务
my-http-bs
プロトコルHTTP、名前付きポートhttp、タイムアウト30秒、
バックエンド:${my-ins-group1}
ヘルスチェック:$my-helthchk-1
セッションアフィニティ:なし(セッション管理とか送信元同じクライアントは同じサーバに振るとか)
接続ドレインのタイムアウト:300秒
在中国,只需要一种选择来释义以下内容:
・还可以创建后端桶
要为GCS(云存储)命名域名,需要进行域名所有者身份验证。
只有在命名域名时才能使用点号,否则只能使用连字符或下划线作为符号。
另外,如果要将其作为LB的后端,就不需要为其命名域名。
外部IP地址需要保留作为静态IP用于负载均衡。听起来似乎可以随时更改为永久不变的静态IP,而不是临时的(因重新启动而变化的)(根据VPC>外部IP地址)
使用A记录将LB的IP注册到CloudDNS中
${mydomain1} 10.xx.xx.xx
从创建新的HTTP(S)负载均衡器开始。
名前:my-lb1
バックエンドの設定:さっきつくったものを選択
ホストとパスのルール:バックエンドを設定すると同時にすべて通すルールが作成されるためそのままでOK
フロントエンド(グローバル転送ルール)の設定:
名前:my-fs
プロトコル:HTTPS
IP:さっき確保しておいたstaticip
ポート:443
証明書:さっき登録した$my-cert-yyyymmdd
・允许来自LB和健康检查API服务器的HTTP访问通过防火墙设置
由于与后端实例的连接似乎存在问题,因此进行了以下防火墙允许注册。
gcloud compute --project=$mypj firewall-rules create allow-gcp-http-lb \
--description=allow\ from\ gcp\ http\ load\ balancer \
--direction=INGRESS --priority=1002 --network=${myvpc1} --action=ALLOW --rules=tcp:80,tcp:443 \
--source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=web
· SSL政策分配
通过CLI进行设置(测试版),对TLS1.2进行限制,否则会报错。
$ sudo gcloud beta compute ssl-policies create ${my-custom-sslpolicy} --profile MODERN --min-tls-version 1.2
$ sudo gcloud beta compute ssl-policies list
NAME PROFILE MIN_TLS_VERSION
${my-custom-sslpolicy} MODERN TLS_1_2
$ sudo gcloud beta compute target-https-proxies update \
> $my-lb1-target-proxy --ssl-policy ${my-custom-sslpolicy}
$ sudo gcloud beta compute target-https-proxies describe ${my-lb1}-target-proxy
id: '******'
kind: compute#targetHttpsProxy
name: ${my-lb1}-target-proxy
selfLink: https://www.googleapis.com/compute/beta/projects/${mydomain1}/global/targetHttpsProxies/${my-lb1}-target-proxy
sslCertificates:
$ sudo gcloud beta compute ssl-policies describe ${my-custom-sslpolicy}
creationTimestamp: '2018-03-29T06:08:14.547-07:00'
enabledFeatures:
- TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
- TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
- TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
- TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
- TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
fingerprint: ******
id: 'xxxxxxxxxxxxx'
kind: compute#sslPolicy
minTlsVersion: TLS_1_2
name: ${my-lb1}-target-proxy
profile: MODERN
以下是用中文原生方式转述的一种选项:
“https://cloud.google.com/compute/docs/load-balancing/ssl-policies?hl=ja” 这篇文章介绍了关于负载均衡SSL策略的内容。
“https://cloudplatform-jp.googleblog.com/2018/03/announcing-SSL-policies-for-HTTPS-and-SSL-proxy-load-balancers.html” 这篇Google云平台的博客公告了关于HTTPS和SSL代理负载均衡器的SSL策略。
在CloudSQL中创建一个PostgreSQL实例。
由于CLI处于测试版阶段,所以下面是设置的配置。
インスタンスID:$my-csql
デフォルトのユーザー パスワード:*******
リージョン:${myregion}
ゾーン:${myregion}-a
DBバージョン:9.6
マシンtype:db-n1-standard-1選択できず
自動バックアップ:2-6時
可用性:シングル
ネットワークの承認:未設定
データベースフラグ追加:未設定
メンテスケジュールの設定:日曜の2-3時、遅め
ラベル:
environment:production
role:db
请参考以下链接:
1. Google Cloud SQL 文档中的 Postgres 连接配置指南(https://cloud.google.com/sql/docs/postgres/connect-admin-proxy?hl=ja)
2. 使用 Cloud SQL 的 Google App Engine PHP 指南(https://blog.hrendoh.com/google-appengine-php-using-cloud-sql/)
以下是连接外部应用程序的方法,但本案件不使用。
https://cloud.google.com/sql/docs/mysql/connect-external-app?hl=ja&_ga=2.49698144.-779814870.1500864087#proxy
对于连接外部应用程序的方法等,请参考上述链接,但在本案中不使用。
在flag中,更新设置的可选项有限。对于postgresql,如果要更改时区,似乎只能使用ALTER DATABASE $mydbschema SET timezone TO ‘Asia/Tokyo’;。该选项不在可设置的标志列表中。(似乎只能做一些与vacuum相关的设置)。
PostgreSQL 9.6.5文档,第19章:服务器配置
链接:https://www.postgresql.jp/document/9.6/html/runtime-config.html
https://www.postgresql.jp/document/9.6/html/config-setting.html
虽然可以使用 ALTER SYSTEM 进行设置,但如果没有超级用户权限,则无法完成操作。如预期那样,云服务 CloudSQL 无法添加超级用户权限。
相关链接:
https://www.postgresql.jp/document/9.6/html/sql-altersystem.html
https://cloud.google.com/sql/docs/postgres/users
安装cloud_sql_proxy并将其转化为systemd单元。
如果不在VPC的私有子网上创建GCP服务,就无法期望其提供如此详细的功能。在没有安装cloud_sql_proxy的情况下,将通过SSL连接使用全局IP进行连接。如果安装了cloud_sql_proxy,可以通过应用程序对本地进行访问,即使在故障转移时可能会中断,但仍可以使用相同的连接名称进行访问。
https://cloud.google.com/sql/docs/postgres/sql-proxy
https://cloud.google.com/sql/docs/postgres/connect-admin-proxy?hl=ja
https://cloud.google.com/sql/docs/postgres/sql-proxy
https://cloud.google.com/sql/docs/postgres/connect-admin-proxy?hl=ja
$ sudo wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
$ sudo chmod +x cloud_sql_proxy
此外,我已经启用了Google Cloud SQL API。
https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?project=649697318341
具体来说在此处
https://www.googleapis.com/auth/sqlservice.admin
$ ./cloud_sql_proxy -instances=${mypj}:${myregion}:${db-instance-name}=tcp:5432 &
[1] 29343
$ 2018/03/27 19:57:49 Listening on 127.0.0.1:5432 for ${mypj}:${myregion}:${db-instance-name}
2018/03/27 19:57:49 Ready for new connections
$ netstat -lnpt
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN 29343/./cloud_sql_p
$ psql "host=127.0.0.1 sslmode=disable dbname=postgres user=postgres"
パスワード:
postgres=> \l
postgres-> \du
如果继续这样,操作系统无法重新启动,所以需要进行systemd化。
$ sudo ln -s /usr/local/src/cloud_sql_proxy /usr/bin/cloud_sql_proxy
sudo mkdir /etc/systemd/system/cloud_sql_proxy\@.service.d
sudo vi /etc/systemd/system/cloud_sql_proxy\@.service.d/limits.conf
sudo vi /etc/systemd/system/cloud_sql_proxy\@.service
------------
[Unit]
Description = CloudSQL Proxy %i
After = network.target
[Service]
EnvironmentFile = /etc/sysconfig/cloud_sql_proxy/%i.conf
ExecStart = /usr/bin/cloud_sql_proxy -instances=${PROJECT_ID}:${REGION}:${INSTANCE_NAME}=tcp:${PORT}
ExecStop = /bin/kill ${MAINPID}
ExecReload = /bin/kill -HUP ${MAINPID}
Restart = always
Type = simple
[Install]
WantedBy = multi-user.target
------------
这句话主要是关于指定一个实例名称(instance_name),可能也是systemd系统为了确保内存空间的名称,并在启动时在“@”后面指定。
如果要连接到另一个SQL实例,可以在instances中用逗号分隔指定连接名(如果不更改端口的话可能会有问题)。
相关链接:
https://cloud.google.com/sql/docs/postgres/sql-proxy#multiple-instances
https://www.freedesktop.org/software/systemd/man/systemd.unit.html
sudo mkdir /etc/sysconfig/cloud_sql_proxy
sudo vi /etc/sysconfig/cloud_sql_proxy/${db-instance-name}.conf
------------
PROJECT_ID="${mypj}"
REGION="${myregion}"
INSTANCE_NAME="${db-instance-name}"
PORT="5432"
------------
$ sudo systemctl start cloud_sql_proxy@${db-instance-name}.service
$ sudo systemctl status cloud_sql_proxy@${db-instance-name}.service
$ sudo systemctl is-enabled cloud_sql_proxy@${db-instance-name}.service
$ sudo systemctl enable cloud_sql_proxy@${db-instance-name}.service
$ sudo systemctl is-enabled cloud_sql_proxy@${db-instance-name}.service
仅提供一种选项,以下是对该句的汉语本地化改写:
将pgadmin4与Apache连接(与GCP无关)
因为我觉得phppgadmin似乎没有适配php7.1和postgresql9.6,所以我将pgadmin4与mod_wsgi进行了集成。
Source: http://www.youyoukankan.net/cms/postgresql-pgadmin4-install.html
$ sudo yum install pgadmin4-v2 mod_wsgi
$ rpm -ql pgadmin4-v2
$ cat /etc/pgadmin/pgadmin4.conf
ApplicationPath="/usr/lib/python2.7/site-packages/pgadmin4-web/"
PythonPath="/usr/lib/python2.7/site-packages:/usr/lib64/python2.7/site-packages"
$ cd /usr/lib/python2.7/site-packages/pgadmin4-web/
$ sudo touch config_local.py
$ sudo vi config_local.py
$ sudo mkdir /var/lib/pgadmin4
$ sudo python setup.py
初期アカウント情報を入力
$ ls /var/lib/pgadmin4/
pgadmin4.db pgadmin4.log sessions storage
$ systemctl status pgadmin4-v2
$ systemctl is-enabled pgadmin4-v2
disabled
$ sudo chown -R apache:apache /var/lib/pgadmin4
$ sudo systemctl start pgadmin4-v2
$ sudo systemctl status pgadmin4-v2
cd /etc/httpd/conf.d/
$ sudo cp -p pgadmin4-v2.conf{.sample,}
$ sudo vim pgadmin4-v2.conf
$ diff pgadmin4-v2.conf{.sample,}
1c1
< LoadModule wsgi_module modules/mod_wsgi.so
---
> #LoadModule wsgi_module modules/mod_wsgi.so
10c10,14
< Require all granted
---
> #Require all granted
> Require local
> # allow from companys office
> Require ip ${myip1}
> Require ip ${myip2}
$ sudo systemctl restart httpd
$ sudo systemctl status httpd
登入后可以创建账户和设置连接信息。由于使用cloud_sql_proxy进行连接,所以可以在pgadmin4中指定本地主机进行连接。
在这里启用SELinux可能会导致无法登录,请注意。
・在Apache服务器上将IP和HTTP访问重写为HTTPS。
Apache和PHP的安装方法不在此进行讨论,推荐使用Remi进行安装。至于安装php-pgsql,建议在安装了PostgreSQL客户端之后再进行安装。
在进行重写之前,必须将负载均衡(LB)的健康检查IP排除在外,以免导致重定向,从而使得LB的后端服务无法正常运作,浏览器将显示服务器错误(ServerError)。
在2.4版本中,IP限制的写法与NameVirtualHost不再需要。
$ sudo cat /etc/httpd/conf.d/rewrite.conf
<ifModule mod_rewrite.c>
RewriteEngine On
LogLevel alert rewrite:trace3
RewriteCond %{HTTPS} off
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</ifModule>
$ sudo cat /etc/httpd/conf.d/vhost.conf
# Access using IP address to dummy
<VirtualHost *:80>
ServerName any
RewriteEngine On
#LogLevel alert rewrite:trace3
RewriteCond %{HTTP_USER_AGENT} !^GoogleHC
RewriteCond %{REMOTE_ADDR} !^35.191.0.0/16
RewriteCond %{REMOTE_ADDR} !^130.211.0.0/22
RewriteCond %{REMOTE_ADDR} !^35.186.211.99/32
RewriteCond %{REMOTE_ADDR} !^209.85.152.0/22
RewriteCond %{REMOTE_ADDR} !^209.85.204.0/22
RewriteCond %{HTTP_HOST} !=${mydomain}
RewriteRule . https://${mydomain}/%{REQUEST_URI} [L,R=301]
</VirtualHost>
# Listen for virtual host requests on all IP addresses
<VirtualHost *:80>
DocumentRoot /var/www/vhosts/${mydomain}/html
ServerName ${mydomain}
ServerAlias ${mydomain1}
ErrorLog "logs/${mydomain}.error_log"
CustomLog "logs/${mydomain}.access_log" combined env=!nolog
RewriteEngine On
#LogLevel alert rewrite:trace3
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
<Directory /var/www/vhosts/${mydomain}/html/>
Options FollowSymLinks
AllowOverride All
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName admin.${mydomain}
ErrorLog logs/admin.${mydomain}_error_log
TransferLog logs/admin.${mydomain}_access_log
RewriteEngine On
#LogLevel alert rewrite:trace3
RewriteCond %{HTTPS} off
RewriteRule . https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</VirtualHost>
$ cat ssl.conf|grep -v '^#'|sed -e '/^$/d'
Listen 443 https
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
SSLSessionCacheTimeout 300
SSLRandomSeed startup file:/dev/urandom 256
SSLRandomSeed connect builtin
SSLCryptoDevice builtin
<VirtualHost *:443>
ServerName any
RewriteEngine On
#LogLevel alert rewrite:trace3
RewriteCond %{HTTP_HOST} !=${mydomain}
RewriteRule ^/?(.*) https://admin.${mydomain}/$1 [L,R=301]
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/${mydomain}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${mydomain}/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/${mydomain}/chain.pem
</VirtualHost>
<VirtualHost _default_:443>
ErrorLog logs/ssl_error_log
TransferLog logs/ssl_access_log
LogLevel warn
SSLEngine on
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLProxyProtocol all -SSLv3
SSLHonorCipherOrder on
SSLCipherSuite ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4
SSLHonorCipherOrder on
SSLCompression off
SSLCertificateFile /etc/letsencrypt/live/${mydomain}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${mydomain}/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/${mydomain}/chain.pem
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch "MSIE [2-5]" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog logs/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>
<VirtualHost *:443>
ServerName admin.${mydomain}
SSLEngine on
ErrorLog logs/ssl_admin.${mydomain}_error_log
TransferLog logs/ssl_admin.${mydomain}_access_log
SSLCertificateFile /etc/letsencrypt/live/${mydomain}/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/${mydomain}/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/${mydomain}/chain.pem
# Uncomment the following directive when using client certificate authentication
#SSLCACertificateFile /path/to/ca_certs_for_client_authentication
# HSTS (mod_headers is required) (15768000 seconds = 6 months)
Header always set Strict-Transport-Security "max-age=15768000"
</VirtualHost>
以下是SSL設定生成的參考資料:
https://mozilla.github.io/server-side-tls/ssl-config-generator/
https://qiita.com/nightyknite/items/36cc1d4d067def437e04
如果使用LB,则如果%{HTTP:X-Forwarded-Proto} =http,则进行https重定向;
如果不使用LB,则如果%{HTTPS} off,则进行重定向。
在mod_rewrite的手册中列举了可用的变量。
http://httpd.apache.org/docs/current/mod/mod_rewrite.html
由于rewrite:trace3会产生大量日志记录,因此在验证完之后最好停止使用。
此外,由于LB的指示,手册上写着将KeepAliveTimeout设置为620,所以我就这样做了。
(手册上还写着AWS也应该设置为120,因此如果在LB下,长一点应该更好吧)
由于mail在OP25B上无法正常发送,所以需要通过SendGlid或其他方式进行中继。
在AWS中,有SES并且可以进行MTA的反向DNS注册以解除限制申请。而在Azure中,可能需要使用SendGlid或者Exchange Online。而在GCP中,可以通过SendGlid或者mailgun、mailiet等服务来通过日本的手机运营商的黑名单IP限制。然而,使用SendGlid的话需要支付费用,而且独立域名的使用也是收费的。
请安装StackDriver(Google Cloud Monitoring)的代理。
在https://cloud.google.com/logging/docs/agent/installation?hl=ja 和https://cloud.google.com/monitoring/agent/install-agent?hl=ja 这两个链接中,首先需要进行服务帐号注册,然后就可以安装代理应用程序。
$ cd /usr/local/src
$ sudo curl -sSO "https://dl.google.com/cloudagents/install-logging-agent.sh"
$ sudo bash install-logging-agent.sh
$ rpm -qa|grep google-fluentd
google-fluentd-catch-all-config-0.7-1.noarch
google-fluentd-1.5.29-1.el7.x86_64
$ sudo systemctl status google-fluentd
● google-fluentd.service - LSB: data collector for Treasure Data
Loaded: loaded (/etc/rc.d/init.d/google-fluentd; bad; vendor preset: disabled)
Active: active (running) since 水 2018-04-11 08:32:09 JST; 3h 35min ago
$ sudo curl -sSO https://dl.google.com/cloudagents/install-monitoring-agent.sh
$ sudo bash install-monitoring-agent.sh
$ rpm -qa|grep stackdriver
stackdriver-agent-5.5.2-379.el7.centos.x86_64
$ systemctl status stackdriver-agent
● stackdriver-agent.service - LSB: start and stop Stackdriver Agent
Loaded: loaded (/etc/rc.d/init.d/stackdriver-agent; bad; vendor preset: disabled)
Active: active (running) since 水 2018-04-11 11:37:43 JST; 4min 38s ago
~略~
详细文章的继续部分在以下链接中可以找到:
https://qiita.com/FumihikoSHIROYAMA/items/6846630b44fbc3f22b8e
关于日志这一点,默认情况下似乎每月有50GB的免费容量可供使用,相当于CloudTrail的Auditlogging功能,在https://cloud.google.com/stackdriver/pricing?hl=ja#logs-allotments 上有详细说明。
一旦安装了代理程序,就会自动应用默认配置,然后可以通过自定义路径等来进行个性化设置,或者自己编写设置来处理特殊情况。
通过添加标签,可以在StackDriver端进行过滤显示。
$ sudo ls -l /etc/google-fluentd/config.d
合計 112
-rw-r-----. 1 root root 515 2月 22 02:29 apache.conf
-rw-r-----. 1 root root 624 2月 22 02:29 cassandra.conf
-rw-r-----. 1 root root 2471 2月 22 02:29 chef.conf
-rw-r-----. 1 root root 162 2月 22 02:29 forward.conf
-rw-r-----. 1 root root 1614 2月 22 02:29 gitlab.conf
-rw-r-----. 1 root root 238 2月 22 02:29 jenkins.conf
-rw-r-----. 1 root root 537 2月 22 02:29 jetty.conf
-rw-r-----. 1 root root 322 2月 22 02:29 joomla.conf
-rw-r-----. 1 root root 747 2月 22 02:29 magento.conf
-rw-r-----. 1 root root 368 2月 22 02:29 mediawiki.conf
-rw-r-----. 1 root root 167 2月 22 02:29 memcached.conf
-rw-r-----. 1 root root 163 2月 22 02:29 mongodb.conf
-rw-r-----. 1 root root 936 2月 22 02:29 mysql.conf
-rw-r-----. 1 root root 350 2月 22 02:29 nginx.conf
-rw-r-----. 1 root root 192 2月 22 02:29 postgresql.conf
-rw-r-----. 1 root root 5197 2月 22 02:29 puppet-enterprise.conf
-rw-r-----. 1 root root 485 2月 22 02:29 puppet.conf
-rw-r-----. 1 root root 1096 2月 22 02:29 rabbitmq.conf
-rw-r-----. 1 root root 177 2月 22 02:29 redis.conf
-rw-r-----. 1 root root 163 2月 22 02:29 redmine.conf
-rw-r-----. 1 root root 674 2月 22 02:29 salt.conf
-rw-r-----. 1 root root 154 2月 22 02:29 solr.conf
-rw-r-----. 1 root root 166 2月 22 02:29 sugarcrm.conf
-rw-r-----. 1 root root 273 2月 22 02:30 syslog.conf
-rw-r-----. 1 root root 271 2月 22 02:29 syslog_endpoint.conf
-rw-r-----. 1 root root 639 2月 22 02:29 tomcat.conf
-rw-r-----. 1 root root 373 2月 22 02:29 zookeeper.conf
$ sudo cat /etc/google-fluentd/config.d/syslog.conf
<source>
@type tail
# Parse the timestamp, but still collect the entire line as 'message'
format /^(?<message>(?<time>[^ ]*\s*[^ ]* [^ ]*) .*)$/
path /var/log/messages
pos_file /var/lib/google-fluentd/pos/syslog.pos
read_from_head true
tag syslog
</source>
只是添加了上述代理,然后没有特别做什么。(但会在Web控制台上显示。如果Apache划分virtual host并更改日志文件名,则需要更改路径或增加源代码块并启动Google Fluentd代理)
据听说,从负载的角度来看,最多只能处理大约100台设备,我没有进行过测试。
总之就是这样了。
顺便提一下,相当于 CloudFormation 的东西叫做 CloudDeploymentManager。