0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【AWSハンズオン実践】AWS Code サービス群を活用して、CI/CD のための構成を構築しよう!

0
Last updated at Posted at 2025-08-30

1. ハンズオン内容

image.png

  • ハンズオンでは各リソースを段階的に作成していきます

※Cloud9はVSCodeとPowerShellで代用
※画像はAWS公式ページより引用

前提条件&注意事項

  • 一部課金が発生します(数十円程度)。終了後は必ず削除しましょう。
  • 親ページ見てない人は見てね
  • CodeCommitは利用しません。GitHubを代用しますので、AWSから接続できるようご用意ください。
  • ブログ内でバケット、ドメインを扱っている場合、同一名称は使わないでください。
  • UIの操作は基本的にはルートアカウントを使っています。必要に応じてサービスロールを作成しています

2. Step1、S3、パイプライン作成

image.png

CodeCommitは利用しません。GitHubを代用しますのでご用意ください
※画像はハンズオンより引用

2.1. (Step1)S3

2.1.1. (Step1)S3バケット作成

一般的な設定 バケットタイプ ✅ 汎用
⬜ ディレクトリ
🔴バケット名 handson-lab.click 自分の保有ドメインを使うこと。直接S3ウェブサイトエンドポイントを使う場合は、ドメイン名とバケット名をする必要がある
オブジェクト所有者 - ✅ ACL 無効 (推奨)
⬜ ACL 有効
デフォルト
オブジェクト所有者 ✅ 希望するバケット所有者
⬜ オブジェクトライター
このバケットのブロックパブリックアクセス設定 🔴パブリックアクセス ⬜ パブリックアクセスをすべて ブロック
🔴 ✅ 現在の設定により、このバケットとバケット内のオブジェクトが公開される可能性があることを承認します。 これはUIのみに存在する項目
タグ - オプション -
デフォルトの暗号化 暗号化タイプ ✅ Amazon S3 マネージドキーを使用したサーバー側の暗号化 (SSE-S3)
⬜ AWS Key Management Service キーを使用したサーバー側の暗号化 (SSE-KMS)
⬜ AWS Key Management Service キーを使用したデュアルレイヤーサーバー側の暗号化 (DSSE-KMS)
KMSを選択すると設定項目が増えますがここでは割愛
バケットキー ✅ 無効にする
⬜ 有効にする
暗号化タイプがSSE-KMSのときは有効にすることが可能
詳細設定 オブジェクトロック ✅ 無効にする
⬜ 有効にする

2.1.2. (Step1)S3バケットにファイルアップロード

  • Amazon S3 > バケット > handson-lab.click > アップロード
    今回はUIでアップロードします。
大項目 中項目 選択肢 備考
🔴ファイルとフォルダ
(アップロードファイル)
index.html アップロードファイルはこちら
送信先
アクセス許可
プロパティ ストレージクラス ✅ スタンダード
⬜ Intelligent-Tiering
⬜ 標準 - IA
⬜ 1 ゾーン -IA
⬜ Glacier Instant Retrieval
⬜ Glacier Flexible Retrieval (旧 Glacier)
⬜ Glacier Deep Archive
サーバー側の暗号化 ✅ 暗号化キーを指定しない
⬜ 暗号化キーを指定する
しない場合は実質SSE-S3らしい
チェックサム
タグ
メタデータ - オプション データを検索するときに活用

2.1.3. (Step1)バケット設定(静的ホスティング)

  • Amazon S3 > バケット > handson-lab.click > プロパティ > 静的ウェブサイトホスティング > 編集
大項目 中項目 選択肢 備考
バケットのバージョニング 項目が多いので省略
タグ 項目が多いので省略
デフォルトの暗号化 項目が多いので省略
Intelligent-Tiering Archive 設定 項目が多いので省略
サーバーアクセスのログ記録 項目が多いので省略
AWS CloudTrail データイベント 項目が多いので省略
イベント通知 項目が多いので省略
Transfer Acceleration 項目が多いので省略
オブジェクトロック 項目が多いので省略
リクエスタ支払い 項目が多いので省略
静的ウェブサイトホスティング 🔴静的ウェブサイトホスティング ⬜ 無効にする
✅ 有効にする
ホスティングタイプ ✅ 静的ウェブサイトをホストする
⬜ オブジェクトのリクエストをリダイレクトする
🔴インデックスドキュメント index.html
エラードキュメント - オプション
リダイレクトルール – オプション

2.1.4. (Step1)バケット設定(バケットポリシー)

  • Amazon S3 > バケット > handson-lab.click > アクセス許可 > バケットポリシー > 編集

バケットポリシーが複雑になっているが、理由を忘れてしまった。全体通して必要になったポリシーと他バケットで使いまわしを想定していろいろマージしたんだと思う。

大項目 中項目 選択肢 備考
アクセス許可(タブ) ブロックパブリックアクセス (バケット設定)
🔴バケットポリシー ここ参照 バケット名は修正すること
オブジェクト所有者
アクセスコントロールリスト (ACL)
Cross-Origin Resource Sharing (CORS)

2.1.5. (Step1)バケット動作確認

ブラウザで http://handson-lab.click.s3-website-ap-northeast-1.amazonaws.com/ にアクセスし、

Hello, AWS World!!

が表示されればOK。URLのバケット名は適宜読み替えてね

2.2 (Step1)パイプライン作成

  • デベロッパー用ツール > CodePipeline > パイプライン > 新規のパイプラインを作成する
大項目 中項目 選択肢 備考
🔴Category カスタムパイプラインを構築する
パイプラインの設定 🔴パイプライン名 aws-code-services-cicd-s3 ここはバケットを作成するパイプライン名と勘違い注意
実行モード ⬜優先済み
✅キュー
⬜並行
🔴サービスロール ⬜新しいサービスロール
✅既存のサービスロール
🔴ロールの ARN handson-pipeline-service-role 別のハンズオンで作ったものを利用します
高度な設定 🔴アーティファクトストア ⬜デフォルトのロケーション
✅カスタムロケーション
デフォルトのロケーションはS3です
🔴バケット codepipeline-ap-northeast-artifacts-moritokey 出力アーティファクト先を固定します
暗号化キー ✅デフォルトの AWS マネージド型キー
⬜カスタマーマネージド型キー
変数
ソース 🔴ソースプロバイダー GitHub(GitHubアプリ経由) GitHub OAuth(旧方式)は非推奨
🔴接続 github4 作った接続を選択。接続の作り方はこちら
🔴リポジトリ名 aws-code-services-cicd 目的のリポジトリを選択
🔴デフォルトブランチ main 目的のブランチを選択
出力アーティファクト形式 CodePipeline のデフォルト
✅ステージ障害時の自動再試行を有効にする
ウェブフックイベント デフォルトでOK
構築する - オプショナル ビルドステージをスキップする
構築する - オプショナル テストステージをスキップする
デプロイ 🔴デプロイプロバイダー Amanzon S3
🔴リージョン 東京
入力アーティファクト SourceArtifact
🔴バケット handson-lab.click 今回はリポジトリ内のファイルがすべてS3に展開される想定
S3 オブジェクトキー 個別のファイルをデプロイするオプションではない。zipでデプロイするときに必要なオプション
🔴 ✅デプロイする前にファイルを抽出する SourceArtifactはzip化されているため必要
追加設定 KMS 暗号化キー ARN - オプショナル
固定 ACL - オプショナル
キャッシュコントロール - オプショナル
出力ファイル名 ✅ステージ障害時の自動ロールバックを設定

この設定ではリポジトリ内のファイル全てがS3バケットに展開されます。
動作確認として、バケット内にindex.htmlがあればOKです。
index.htmlをアップデートすれば自動でデプロイされますが、手順は省略します。

このパイプラインは用済みとなります。

3. Step2、EC2作成

image.png

EC2を作成します
※画像はハンズオンより引用

3.1. (Step2)ネットワークの作成

  • VPC > お使いの VPC > VPC を作成

ハンズオンでは触れられていないと思うのですが、事前にネットワークの作成が必要です。
作成するリソースにVPCなどを選択し、必要なものを全部作ってしまいましょう。手順は簡単なので省略します。

3.2. (Step2)IAMロールの作成

  • IAM > ロール > ロールを作成

EC2がS3にアクセスするためのロールを作成します。

画面名:信頼されたエンティティを選択

大項目 中項目 選択肢 備考
信頼されたエンティティタイプ 🔴 ✅ AWS のサービス
⬜ AWS アカウント
⬜ ウェブアイデンティティ
⬜ SAML 2.0 フェデレーション
⬜ カスタム信頼ポリシー

画面名:許可を追加

大項目 中項目 選択肢 備考
ユースケース 🔴サービスまたはユースケース EC2
🔴ユースケース EC2
🔴許可ポリシー ✅ AmazonS3FullAccess
...
許可の境界を設定 - オプション ✅ 許可の境界なしでロールを作成
⬜ 許可の境界を使用して、最大ロール許可を制御

画面名:名前、確認、および作成

大項目 中項目 選択肢 備考
ロールの詳細 🔴ロール名 handson-ec2-exec-role
説明 Allows EC2 instances to call AWS services on your behalf.
信頼ポリシー 省略
許可ポリシーの概要 AmazonS3FullAccess
タグを追加 - オプション

3.3. (Step2)EC2用セキュリティグループ作成

  • EC2 > セキュリティグループ > セキュリティグループを作成
大項目 中項目 選択肢 備考
基本的な詳細 🔴セキュリティグループ名 handson-ec2-sg
🔴説明 handson-ec2-sg 必須です
🔴VPC handson-vpc
インバウンドルール1 🔴タイプ SSH
プロトコル TCP
ポート範囲 22
🔴ソース 0.0.0.0/0 可能なら制限した方がよい
説明 - オプション
インバウンドルール2 🔴タイプ HTTP
プロトコル TCP
ポート範囲 80
🔴ソース 0.0.0.0/0 可能なら制限した方がよい
説明 - オプション
アウトバウンドルール
タグ - オプション

3.4. (Step2)EC2作成

  • EC2 > インスタンス > インスタンスを起動

画面名:インスタンスを起動

大項目 中項目 選択肢 備考
基本的な詳細 🔴セキュリティグループ名 handson-ec2-sg
🔴説明 handson-ec2-sg 必須です
🔴VPC handson-vpc
インバウンドルール1 🔴タイプ SSH
プロトコル TCP
ポート範囲 22
🔴ソース 0.0.0.0/0 可能なら制限した方がよい
説明 - オプション
インバウンドルール2 🔴タイプ HTTP
プロトコル TCP
ポート範囲 80
🔴ソース 0.0.0.0/0 可能なら制限した方がよい
説明 - オプション
アウトバウンドルール
タグ - オプション 🔴 Name=Web こことデプロイグループを合わせる。このWebという値を持つEC2にデプロイされる仕組みと思われる

3.5. (Step2)動作確認

  1. EC2へインスタンスコネクト接続
  2. httpdインストール
    sudo yum install -y
    sudo yum install httpd -y
    
    sudo systemctl start httpd.service
    sudo systemctl enable httpd.service
    sudo systemctl status httpd.service # active (running)が表示されればOK
    
  3. ブラウザで http://EC2のパブリック IPv4 アドレス/ にアクセスして、以下が表示されればOK
    It works!
    

3.6. CodeDeployエージェントインストール

sudo dnf install -y ruby wget

cd /home/ec2-user
wget https://aws-codedeploy-ap-northeast-1.s3.ap-northeast-1.amazonaws.com/latest/install # 日本リージョン用
chmod +x ./install
sudo ./install auto
sudo systemctl enable codedeploy-agent
sudo systemctl status codedeploy-agent # active (running)が表示されればOK

4. Step3、CodeBuild

image.png

※画像はハンズオンより引用

4.1. (Step3)Artifact用バケット作成

以前作ったcodepipeline-ap-northeast-artifacts-moritokeyを使います。ない人は作りましょう。特に設定はありません。

4.2. (Step3)CodeBuild用サービスロール作成

ロール名:handson-h4b-codebuild-service-role、ユースケース:CodeBuild
カスタムポリシー:handson-codebuild-all-in
マネージドポリシー:AWSCodeDeployDeployerAccess

ロールを自動生成した結果、うごかず苦労したので、事前に作りました。

4.3. (Step3)CodeBuild作成

  • デベロッパー用ツール > CodeBuild > ビルドプロジェクト > ビルドプロジェクトを作成する

画面名:ビルドプロジェクトを作成する

大項目 中項目 選択肢 備考
プロジェクトの設定 🔴プロジェクト名 h4b-handson
プロジェクトタイプ ✅ デフォルトプロジェクト
⬜ ランナープロジェクト
追加設定 説明 - オプショナル
パブリックビルドアクセス - オプショナル ⬜ パブリックビルドアクセスを有効化
⬜ ビルドバッジを有効にする
同時ビルド制限の有効化 - オプショナル ⬜ このプロジェクトが開始できる同時ビルドの数を制限する
Tags キー:
値:
ソース 🔴ソースプロバイダ GitHub
🔴 ✅ このプロジェクトにのみオーバーライド認証情報を使用 これにチェックを入れると以前作ったCodeConnectionの設定を使うことができる
🔴接続 github4 以前作ったGithub接続用の「接続」を選択する
✅ codebuild:source タグが付いたシークレットのみを表示
リポジトリ
✅ GitHub アカウントのリポジトリ
⬜ パブリックリポジトリ
⬜ GitHub スコープウェブフック
🔴リポジトリの URL https://github.com/aws-hands-on-training/aws-code-services-cicd
ソースバージョン - オプショナル
追加設定 Git のクローンの深さ - オプショナル 1
git サブモジュールを有効にする ⬜ git サブモジュールを有効にする
プライマリソースのウェブフックイベント ウェブフック - オプショナル ✅ コードの変更がこのレポジトリにプッシュされるたびに再構築する
ビルドタイプ ✅ 単一ビルド
⬜ バッチビルド
コメント承認 ✅ ALL_PULL_REQUEST
⬜ ...
承認者ロール ✅ GITHUB_WRITE
✅ GITHUB_MAINTAIN
✅ GITHUB_ADMIN
ウェブフックイベントフィルタグループ フィルタグループ 1 イベントタイプ - オプショナル
追加設定 手動作成 - オプショナル ⬜このリポジトリのウェブフックを GitHub コンソールで手動で作成します。
環境 プロビジョニングモデル ✅ オンデマンド
⬜ リザーブドキャパシティ
環境イメージ ✅ マネージド型イメージ
⬜ カスタムイメージ
コンピューティング ✅ EC2
⬜ Lambda
実行モード ✅ コンテナ
⬜ インスタンス
オペレーティングシステム ✅ Amazon Linux
⬜ Ubuntu
ランタイム ✅ Standard
🔴イメージ ✅ aws/codebuild/amazonlinux-x86_64-standard:5.0
⬜ ...
standardの1番新しいものを選択すればOK。standard:correttoはJAVAのアプリを使うときに選択する
🔴イメージのバージョン ✅ aws/codebuild/amazonlinux-x86_64-standard:5.0-25.06.25
⬜ ...
standardの1番新しいものを選択すればOK。
⬜ GPU 強化コンピューティングを使用
🔴サービスロール ⬜ 新しいサービスロール
✅ 既存のサービスロール
🔴ロールの ARN
✅ AWS CodeBuild にこのサービスロールの編集を許可し、このビルドプロジェクトでの使用を可能にする。
追加設定 自動再試行の上限 値は省略。デフォルトでOK
タイムアウト 値は省略。デフォルトでOK
キュータイムアウト 値は省略。デフォルトでOK
特権付与 値は省略。デフォルトでOK
レポート自動検出 値は省略。デフォルトでOK
自動検出ディレクトリ - オプショナル 値は省略。デフォルトでOK
証明書 値は省略。デフォルトでOK
VPC 値は省略。デフォルトでOK
コンピューティング 8 GiB メモリ、4 vCPU
Docker server configuration 値は省略。デフォルトでOK
Docker server compute type 値は省略。デフォルトでOK
レジストリの認証情報 - オプショナル 値は省略。デフォルトでOK
環境変数 値は省略。デフォルトでOK
ファイルシステム 値は省略。デフォルトでOK
Buildspec 🔴ビルド仕様
⬜ ビルドコマンドの挿入
✅ buildspec ファイルを使用する
Buildspec 名 - オプショナル
バッチ設定 ⬜ バッチ設定を定義 - オプショナル
アーティファクト 🔴タイプ ✅ Amazon S3
⬜アーティファクトなし
🔴バケット名 codepipeline-ap-northeast-artifacts-moritokey
名前 出力アーティファクトを含むバケット内のフォルダまたは圧縮ファイルの名前です。
⬜ セマンティックバージョニングの有効化
パス - オプショナル
名前空間のタイプ - オプショナル ✅ なし
⬜ ビルドID
アーティファクトのパッケージ化 ✅ なし
⬜ Zip
⬜ アーティファクト暗号化の削除
追加設定 暗号化キー - オプショナル
キャッシュタイプ ✅ キャッシュなし
⬜ Amazon S3
⬜ ローカル""
ログ ✅ CloudWatch Logs - オプショナル
グループ名 - オプショナル
ストリーム名のプレフィックス - オプショナル
✅ S3 ログ - オプショナル
バケット
パスのプレフィックス
⬜ S3 ログの暗号化を無効にする

5. Step4、CodeDeploy

image.png

※画像はハンズオンより引用

5.1. (Step4)CodeDeploy用サービスロール作成

  • IAM > ロール

ロール名:handson-h4b-codedeploy-service-role、ユースケース:CodeDeploy
マネージドポリシー:AWSCodeDeployRole

5.2. (Step4)CodeDeployアプリケーション作成

  • デベロッパー用ツール > CodeDeploy > アプリケーション > アプリケーションの作成

アプリケーションの作成

大項目 中項目 選択肢 備考
アプリケーションの設定 🔴アプリケーション名 h4b-app
🔴コンピューティングプラットフォーム ✅ EC2/オンプレミス
⬜ Amazon Lambda
⬜ Amazon ECS
タグ
phases:
  build:
    commands:
      - aws deploy push --application-name h4b-app --s3-location s3://codepipeline-ap-northeast-artifacts-moritokey/artifact.zip --source src
artifacts:
  files:
    - '**/*'
  base-directory: src

5.2. (Step4)CodeDeployデプロイグループ作成

  • デベロッパー用ツール > CodeDeploy > アプリケーション > h4b-app > デプロイグループの作成

画面名:デプロイグループの作成

大項目 中項目 選択肢 備考
デプロイグループ名 🔴デプロイグループ名の入力 Web ここは任意だと思う
🔴サービスロール handson-h4b-codedeploy-service-role
デプロイタイプ ✅ インプレース
⬜ Blue/Green
環境設定 🔴 ⬜ Amazon EC2 Auto Scaling グループ
✅ Amazon EC2 インスタンス
⬜ オンプレミスインスタンス
🔴 キー:Name
値 - オプショナル:Web
ここはEC2側のタグと合わせるのだと思う
⬜ オンプレミスインスタンス
AWS Systems Manager を使用したエージェント設定 🔴AWS CodeDeploy エージェントのインストール ✅ なし
⬜ 1 回のみ
⬜ 今すぐ更新し、更新をスケジュール
手動でインストールしたため「なし」
デプロイ設定 ⬜ CodeDeployDefault.OneAtATime
⬜ CodeDeployDefault.HalfAtATime
✅ CodeDeployDefault.AllAtOnce
Load balancer 🔴 ⬜ ロードバランシングを有効にする
トリガー
アラーム
ロールバック
✅ ロールバックを無効にする
デプロイグループタグ

5.3. (Step4)CodeDeployデプロイグループ作成

  • デベロッパー用ツール > CodeBuild > ビルドプロジェクト > h4b-handson > ビルド開始

成功するのを待ちましょう

5.4. (Step4)CodeDeployデプロイの作成

  • デベロッパー用ツール > CodeDeploy > アプリケーション > h4b-app > Web

Create deployment

大項目 中項目 選択肢 備考
デプロイ設定 🔴デプロイグループ Web 選びましょう
リビジョンタイプ ✅ アプリケーションは Amazon S3 に格納されています
⬜ アプリケーションは GitHub に格納されています
S3でいいんだろうか?
🔴リビジョンの場所 選びましょう
リビジョンファイルの種類 zip
デプロイの説明
追加のデプロイ動作設定 ApplicationStop ライフサイクルイベントの障害 - オプショナル ⬜ このインスタンス上のライフサイクルイベントの障害で、デプロイを失敗させない
コンテンツオプション - オプショナル ⬜ デプロイの失敗
⬜ コンテンツの上書き
⬜ コンテンツの保持
デプロイグループのオーバーライド デプロイ設定 ⬜ CodeDeployDefault.OneAtATime
⬜ CodeDeployDefault.HalfAtATime
✅ CodeDeployDefault.AllAtOnce
ロールバック設定の上書き ⬜ デプロイが失敗したときにロールバックする
⬜ アラームのしきい値が一致したときにロールバックする
✅ ロールバックを無効にする

6. Step5、CodePipeline

image.png

※画像はハンズオンより引用

6.1. (Step5)CodePipelineの作成

  • デベロッパー用ツール > CodePipeline > パイプライン > パイプラインを作成する

画面名:作成オプションを選択する

大項目 中項目 選択肢 備考
🔴Category カスタムパイプラインを構築する

画面名:パイプラインの設定を選択する

大項目 中項目 選択肢 備考
パイプラインの設定 🔴パイプライン名 aws-code-services-cicd-ec2
実行モード ⬜優先済み
✅キュー
⬜並行
🔴サービスロール ✅新しいサービスロール
⬜既存のサービスロール
🔴ロールの ARN AWSCodePipelineServiceRole-ap-northeast-1-aws-code-services-cic 別のハンズオンで作ったものを利用します
高度な設定 🔴アーティファクトストア ⬜デフォルトのロケーション
✅カスタムロケーション
デフォルトのロケーションはS3です
🔴バケット codepipeline-ap-northeast-artifacts-moritokey 出力アーティファクト先を固定します
暗号化キー ✅デフォルトの AWS マネージド型キー
⬜カスタマーマネージド型キー
変数

画面名:ソースステージを追加する

大項目 中項目 選択肢 備考
ソース 🔴ソースプロバイダー GitHub(GitHubアプリ経由) GitHub OAuth(旧方式)は非推奨
🔴接続 github4 作った接続を選択。接続の作り方はこちら
🔴リポジトリ名 aws-code-services-cicd 目的のリポジトリを選択
🔴デフォルトブランチ main 目的のブランチを選択
出力アーティファクト形式 CodePipeline のデフォルト
✅ステージ障害時の自動再試行を有効にする
ウェブフックイベント ウェブフック - オプショナル ✅プッシュおよびプルリクエストイベントでパイプラインを開始します。 デフォルトでOK
ウェブフックイベントフィルター - オプショナル イベントタイプ
これらの条件でパイプラインを開始 - オプショナル フィルタータイプ
これらの条件でパイプラインを開始しないでください - オプショナル フィルタータイプ

画面名:ビルドステージを追加する

大項目 中項目 選択肢 備考
構築する - オプショナル 🔴プロバイダーを構築する ⬜ コマンド
✅ その他のビルドプロバイダー
ビルドステージをスキップする
🔴 ✅ AWS CodeBuild
⬜ AWS ECR
⬜ ジェンキンス
🔴プロジェクト名 h4b-handson
⬜ buildspec オーバーライドの定義 - オプショナル
環境変数 - オプショナル
ビルドタイプ ✅ 単一ビルド
⬜ バッチビルド
リージョン ✅ 東京
入力アーティファクト SouceArtifact

画面名:テストステージを追加

大項目 中項目 選択肢 備考
構築する - オプショナル テストステージをスキップする

画面名:デプロイステージを追加する

大項目 中項目 選択肢 備考
デプロイ 🔴デプロイプロバイダー AWS CodeDeploy
🔴リージョン 東京
入力アーティファクト BuildArtifact
🔴アプリケーション名 h4b-app
🔴デプロイグループ Web
🔴 ✅デプロイする前にファイルを抽出する SourceArtifactはzip化されているため必要
追加設定 KMS 暗号化キー ARN - オプショナル
固定 ACL - オプショナル
キャッシュコントロール - オプショナル
出力ファイル名 ✅ステージ障害時の自動ロールバックを設定

さいごに

感想です

  • ロールが相変わらずわからん。githubのロールが面倒すぎる。ロールの自動作成してもgithubの権限が漏れていることがある
  • コードデプロイエージェントはデフォルトでインストールされていない
  • buildspec.yamlではなく、yml。appspec.yamlではなく、yml
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?