DevOpsの視点から見た新規Webサイト（アプリ）の展開

**Alibaba Cloud**のインフラストラクチャ上に新しいWebサイト（アプリ）をデプロイする際のベストプラクティスについて、実装やメンテナンスを含めてご紹介します。

*本ブログは英語版からの翻訳です。オリジナルは[こちら](https://www.alibabacloud.com/blog/web-development-the-devops-way-alibaba-cloud-best-practices_593705)からご確認いただけます。一部機械翻訳を使用しております。翻訳の間違いがありましたら、ご指摘いただけると幸いです。*

[Alibaba Cloud Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.3c115845kkngS6)執筆者、Alberto Roura 。[Tech Share](https://www.alibabacloud.com/campaign/techshare?spm=a2c65.11461447.0.0.3c115845kkngS6)は、技術的な知識やベストプラクティスをクラウドコミュニティ内で共有することを奨励するAlibaba Cloudのインセンティブプログラムです。

ここでは、[Alibaba Cloud](https://account-intl.aliyun.com/register/intl_register.htm?spm=a2c65.11461447.0.0.3c115845kkngS6&biz_params=%7B)を利用して新しいWebサイトやWebアプリをインフラに導入する際のベストプラクティスについて、メンテナンスの実施を含めてお話ししたいと思います。

Alibaba Cloud上でのWeb開発についてはすでにお馴染みかもしれませんが、今回は別のアプローチからこのお馴染みのトピックを取り上げたいと思います。この記事では純粋なDevOpsの観点からのデプロイに焦点を当てていきますが、Alibaba Cloudは目標達成のために業界最高のツールを使用できる可能性を秘めたプラットフォームです。ここでは、紛れもなく業界のリーダーであるHashicorpのTerraformを使用します。

この記事では、私自身のウェブサイト「El Fotómetro Digital」を例に挙げます。これは、私が始めたばかりの写真に関するブログで、カメラや撮影テクニックなどの技術的な記事を掲載しているだけのものです。まだ始まったばかりなので、それまでの間は、私のブログの写真のセクションをチェックしてみてください。

#なぜアリババクラウドなのか？
Alibaba CloudはAWSとDigitalOceanの両方の長所を兼ね備えており、前者のスケーラビリティとサービスを提供しつつ、後者の透明性も兼ね備えていると思います。Alibaba Cloudはドキュメントの面では改善の余地がありますが、日々改善されており、ブログには毎月何百ものエントリーがあります。Alibaba Cloudのブログページには、会社が時々大きなニュースを提供しているので、今後も注目していてください。Alibaba Cloudは、すべてをゼロから構築するという正しい方法でクラウド業界を探求していると感じています。

#アリババクラウドのDevOps
このガイドは、最初は難しそうに見えますが、誰でもできるように細かく書いていきます。このハウツーを読み終えたら、あなたはDevOps業界の別のレベルに到達することになるので安心してください。また、Alibaba Cloud/Aliyunでデプロイを自動化するためのクールなツールについても学ぶことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/d4767aff-4e7f-ec2a-ef7e-f15b7af67286.png)

#アリババクラウドのアカウントを取得する
最初にアカウントが必要です。[300ドルの無料クレジット](https://www.alibabacloud.com/campaign/free-trial?spm=a2c65.11461447.0.0.3c115845kkngS6)があなたを待っています!　ぜひアカウントを作成して、プロフィールをアップして実行してみてください。登録には数分しかかかりません。

#アリババクラウドのリソースを計画する
すべての良いDevOpsワークフローには良いパターンが含まれているので、ここでは、ベストプラクティス・チェックリストの中の1つを適用することにします。それは計画を立てることです。

これにはTerraformを使用しているので、私が作成したこのガイドをチェックして、公式のAlibaba Cloud Providerの使用に慣れている方がよいでしょう。ここでは、APIキーを取得し、基本的なBoltアプリケーションをHelloWorld方式で実行する方法を説明しています。ここでは、その例を参照として使用して拡張し、実際のシナリオに移動します。

**展開インフラの設計**

以下は、Ubuntu 16.04と2つのGITリポジトリを使用して、ecs.xn4型のECSインスタンスを作成し、プロジェクトを設定する方法を示すためにASCIIFlowで作成した基本的な図です。

```
+------------------------------------------+
|                                          |
| +--------------------------------------+ |
| |                                      | |
| |                              ecs.xn4 | |
| |                                      | |
| | +--------------+                     | |
| | |              |                     | |
| | | Ubuntu 16.04 |                     | |
| | |              |                     | |
| | +--------------+                ^    | |
| |                                 |    | |
| +-----------^--------------------------+ |
|             |                     |      |
+------------------------------------------+
              |                     |
+-------------+----+ +--------------+------+
| Framework GIT    | | Project GIT         |
|                  | |                     |
+------------------+ +---------------------+
```

**リソースの配置計画を立てる**

ご存知のように、Terraformを使ってリソースやインフラストラクチャをデプロイする際には、大きく分けて2つのステージがあります。この段階では、最初のコマンドに注目します。このコマンドは、使用するリージョンのすべてのパラメータ、APIトークン、利用可能なリソースを考慮して、計画が意味のあるものであるかどうかを判断するものです。

main.tf ファイルは以下のようになります。

```
variable "access_key" {
  type = "string"
  default = "XXXXX"
}
variable "secret_key" {
  type = "string"
  default = "XXXXX"
}
variable "region" {
  type = "string"
  default = "ap-southeast-2"
}
variable "vswitch" {
  type = "string"
  default = "XXX-XXXXX"
}
variable "sgroups" {
  type = "list"
  default = [
    "XX-XXXXX"
  ]
}
variable "name" {
  type = "string"
  default = "bolt-instance"
}
variable "password" {
  type = "string"
  default = "Test1234!"
}

provider "alicloud" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  region = "${var.region}"
}

data "alicloud_images" "search" {
  name_regex = "^ubuntu_16.*_64"
}
data "alicloud_instance_types" "default" {
  instance_type_family = "ecs.xn4"
  cpu_core_count = 1
  memory_size = 1
}
data "template_file" "user_data" {
  template = "${file("user-data.sh")}"
}

resource "alicloud_instance" "web" {
  instance_name = "${var.name}"
  image_id = "${data.alicloud_images.search.images.0.image_id}"
  instance_type = "${data.alicloud_instance_types.default.instance_types.0.id}"

  vswitch_id = "${var.vswitch}"
  security_groups = "${var.sgroups}"
  internet_max_bandwidth_out = 100

  password = "${var.password}"

  user_data = "${data.template_file.user_data.template}"
}

output "ip" {
  value = "${alicloud_instance.web.public_ip}"
}

```

**デプロイのためのコードを準備**

インスタンスが初めて起動したときに、Ubuntuにスクリプトを実行してもらい、いくつかの余分なものを設定してもらうことができます。ECSのインスタンスが作成された後、アプリケーションのセットアップを自動化する方法ですが、これは "ユーザーデータ "と呼ばれています。この例では、GitHubで私自身のリポジトリを使用してみましょう。user-data.shファイルは以下のようになります。

```
#!/bin/bash -v

export REPO=https://github.com/roura356a/bolt-site.git

# Create docker-compose.yml
cat <<- 'EOF' > /opt/docker-compose.yml
version: '3.6'
services:
  web:
    image: roura/bolt
    container_name: bolt
    network_mode: bridge
    restart: on-failure
    ports:
      - "80:80"
    volumes:
      - /opt/repo/theme:/var/www/html/public/theme/bolt-theme
      - /opt/repo/config/config.yml:/var/www/html/app/config/config.yml
      - /opt/repo/config/menu.yml:/var/www/html/app/config/menu.yml
      - /opt/database:/var/www/html/app/database
EOF

# Create re-deploy.sh
cat <<- 'EOF' > /opt/re-deploy.sh
#!/bin/bash
cd /opt/repo && git pull
chown -R www-data:www-data /opt/repo
EOF

apt-get update && apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
apt-get update && apt-get install -y docker-ce docker-compose
curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose

# Setup cron job for re-deployment
chmod +x /opt/re-deploy.sh
sh /opt/re-deploy.sh
crontab -l > /tmp/newcron
echo "*/5 * * * * /opt/re-deploy.sh" >> /tmp/newcron
crontab /tmp/newcron
rm /tmp/newcron

cd /opt && git clone $REPO repo

mkdir database && chown www-data:www-data database

docker-compose up -d
```

URL_TO_YOUR_REPO_HERE をコードが存在する実際の URL に置き換えることを忘れないでください。プロジェクトのセキュリティを強化するために、代わりにプライベートリポジトリを使用することもできます。

#アリババクラウドリソースのデプロイ
中途半端な上に、一番大変なことは終わっています。何をすべきかが明確になったので、次のステップに進みましょう。デプロイです。

**コードを使ってリソースをデプロイする**

すべての計画は前のステップで完了しているので、あとは terraform apply を実行するだけです。ここは最もデリケートな部分で、すべてのリソースが作成され、環境をセットアップするためにコードが実行されます。

```
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

ip = XX.XX.XX.XX
```

**すべての動作を確認する**

デプロイがうまくいった場合（うまくいかなかった場合は、微調整を繰り返してみてください）、Terraformがインスタンスを作成してから5分ほど待つと、ブラウザでウェブサイトを開くことができるはずです。このステップを確認したら、その後、ドメインを取得してまとめることができます。

**アリババクラウドでドメインを登録する**

ドメインを登録するには、ユーザーコンソールに戻り、"製品 "をクリックしてトップナビゲーションを開いた後、次の画像のように検索フィルターに "ドメイン "と書いてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/df726101-7645-dcbb-f5f5-17c8e4bbb414.png)


次に「ドメイン」をクリックして、次の画面の指示に従ってお好みのドメインを追加してください。

**ドメインを当社のアプリケーションにフックアップする**

ドメインがアクティブになったら、"Domains "セクションから離れずに、サイドメニューの "Alibaba Cloud DNS "をクリックする必要があります。作成したドメインをクリックして、Terraformが出力したIPで "A "レコードを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/647921/b643a92b-3f26-dbe9-0d00-1403a0919fba.png)

#メンテナンス
私たちはウェブアプリケーションの運営に、時折コードを更新する必要があるため、メンテナンスが必要になってきます。

**コードをプッシュする**

最初のステップにきちんと従っていれば、デプロイメントに組み込まれたスクリプトがあるので、gitリポジトリにコードをプッシュするだけで、クラウドベースのアプリケーションを更新できるはずです。git commit、git push、そして結果をライブで見ることができます。user-data.sh "ファイルを見ればわかるように、5分ごとにプロジェクトのパスを更新するcronジョブを作成しました。

#結論
このハウツーでは、新規デプロイと移行の両方をカバーしています。この記事を読んで、何か新しいことを学んでいただけたのではないかと思います。

もしあなたが私と同じようにDevOpsを楽しんでいるのであれば、Alibaba Cloudの定期的な[ウェビナー](https://resource.alibabacloud.com/webinar/index.htm?spm=a2c65.11461447.0.0.3c115845kkngS6)に参加するか、[Alibaba Cloudの公式資格](https://www.alibabacloud.com/support/tutor-program?spm=a2c65.11461447.0.0.3c115845kkngS6)を取得することをお勧めします。DevOpsエンジニアにとって時間はエキサイティングなものであり、この分野では日々新しいチャンスが生まれています。

*アリババクラウドは日本に２つのデータセンターを有し、世界で60を超えるアベラビリティーゾーンを有するアジア太平洋地域No.1(2019ガートナー)のクラウドインフラ事業者です。
アリババクラウドの詳細は、こちらからご覧ください。
[アリババクラウドジャパン公式ページ](https://www.alibabacloud.com/ja)*