第一次使用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。

广告
将在 10 秒后关闭
bannerAds