Terraformの環境構築: AWS CloudShellにTerraformを導入し、S3バケットを作成するデモ

## はじめに
AWS CloudShellは、AWSが提供するクラウドベースのターミナルで、ブラウザ上からAWS CLIやさまざまなツールを操作することができます。

:::note warn
**本記事では、CloudShellにTerraformを導入する方法と、簡単なデモとしてS3バケットを作成する手順をご紹介します。**
:::

さらに、おまけとしてTerraformを使用したリソース削除の方法も解説します。

## 知識整理
### AWS CloudShellとは

AWS CloudShellは、AWSが提供するブラウザベースのシェル環境です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ce88c49c-7686-ea91-cb66-dd521adbc117.png)

このサービスには以下のような特徴があります。

:::note
- **事前にAWS CLIが設定済み：**
すぐにAWSのコマンドラインインターフェース（CLI）を使用でき、セットアップの手間が省けます。

- **無料で利用可能（一部制限あり）：**
基本的な利用は無料で、特定の制限内でサービスを活用できます。

- **IAMユーザー/ロールの権限を活用可能：**
AWS Identity and Access Management（IAM）の権限を使用して、セキュアにリソースを管理できます。
:::

CloudShellに関しては、過去の記事でも詳しくまとめていますので、興味のある方はぜひご参照ください。

https://qiita.com/free-honda/items/cc3f4c68f7d1521830c3

### Terraformとは
Terraformは、インフラストラクチャをコード（Infrastructure as Code, IaC）として管理するためのツールです。

![スクリーンショット 2024-10-26 8.26.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a1531ea9-3a09-2a88-6aae-c6ee8c04baae.png)
引用画像：https://sdpf.ntt.com/services/docs/fic/tutorials/terraform/rsts/Terraform/about_terraform.html

Terraformには以下のようなメリットがあります。

:::note
- **多くのクラウドをサポート：**
AWS、Azure、Google Cloudなど、さまざまなクラウドプロバイダに対応しています。

- **宣言型：**
必要なインフラの状態を記述し、Terraformがその状態に到達するための処理を自動で行います。

- **バージョン管理：**
インフラの変更履歴を管理でき、変更が追跡可能です。
:::

Terraformについては、過去の記事でハンズオン形式で解説しているので、気になる方は参考にしてみてください。

https://qiita.com/free-honda/items/4cadfd1bafa6c71c85fb

## 実際に導入してみた

では、実際にCloudShellにTerraformを導入してみます。

まず、AWSマネジメントコンソールの画面左下にある「CloudShell」をクリックすると、ターミナルが起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/a85b9f12-7105-2cbc-9924-99b670d30866.png)

Terraformのインストールは、以下のコマンドをCloudShellで実行するだけです。

```bash
wget https://releases.hashicorp.com/terraform/0.14.2/terraform_0.14.2_linux_amd64.zip
sudo unzip terraform_0.14.2_linux_amd64.zip -d /usr/local/bin/
```

インストールが問題なく完了しているか確認するため、以下のコマンドでバージョンを確認します。

```bash
terraform --version
```

実際の操作画面はこのようになっており、バージョンが表示されればインストールが成功したことが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b75004ad-a681-3b53-432a-626f38d3e64f.png)

:::note warn
**私の環境では、``Terraform v0.14.2``が導入されていることが確認できました。**
:::

## 簡単なデモ：S3バケットの作成

次に、CloudShellでS3バケットを作成するための設定ファイルを作成します。以下のコマンドを入力して、**main.tf**というファイルを作成します。

```bash
vi main.tf
```

以下を貼り付けて保存します。``vi``では、ファイル編集後にESCキーを押し、``:wq``で保存して終了します。

```main.tf
provider "aws" {
  region = "ap-northeast-1"
}

resource "aws_s3_bucket" "example" {
  bucket = "honda-cloudshell-terraform-demo"
  acl    = "private"

  tags = {
    Name        = "ExampleBucket"
    Environment = "Demo"
  }
}
```

次に、以下のコマンドでTerraformを初期化します。

```bash
terraform init
```

実際に、以下のように「``Terraform has been successfully initialized!``」と表示され、成功が確認できました。

```bash
Partner and community providers are signed by their developers.
If you'd like to know more about provider signing, you can read about it here:
https://www.terraform.io/docs/plugins/signing.html

Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.

Terraform has been successfully initialized!

You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.

If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
```

次に、以下のコマンドでS3バケットを作成し、確認メッセージが表示されたら「``yes``」と入力します。

```bash
terraform apply
```

その後、以下のように「``Apply complete! Resources: 1 added, 0 changed, 0 destroyed.``」と表示され、作成が成功したことが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b773d2bb-891e-7e4c-f291-39d8e3c25a87.png)

AWSコンソールや以下のコマンドでバケットが作成されていることが確認できます。

```bash
[cloudshell-user@ip-10-132-68-53 ~]$ aws s3 ls | grep honda
2024-11-16 11:09:20 honda-cloudshell-terraform-demo
```

実際にAWSマネジメントコンソール上でも、S3バケットが作成されていることが確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/b393131d-d4d9-f823-fdbb-6a2596f945df.png)

## まとめ
AWS CloudShellでTerraformを利用すると、ローカル環境を準備することなくAWSリソースを簡単に管理できます。

本記事では、Terraformの導入からS3バケット作成のデモまでを解説しました。

:::note warn
**Terraformを使えば、コードベースでインフラ管理が効率化できます。**
:::

CloudShellとTerraformの組み合わせは非常に便利で、インフラ管理を大幅に簡素化できます。

## おまけ：リソースの削除方法

Terraformで作成したリソースやファイルをクリーンアップする手順も説明します。Terraformを使用して作成したAWSリソースを削除するには、以下のコマンドを実行します。

```bash
terraform destroy
```

実行後、Terraformは現在の状態ファイルを元に削除対象のリソースをリストアップし、確認メッセージが表示されます。

```bash
Do you really want to destroy all resources?
  Terraform will destroy all your managed infrastructure, as shown above.
  There is no undo. Only 'yes' will be accepted to confirm.

  Enter a value: yes        

aws_s3_bucket.example: Destroying... [id=honda-cloudshell-terraform-demo]
aws_s3_bucket.example: Destruction complete after 0s

Destroy complete! Resources: 1 destroyed.
```

このプロンプトに ``yes`` を入力すると、Terraformは指定されたリソース（ここではS3バケット）を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/83fff23f-1f9d-aabf-6a17-6b548036d544.png)

実際にAWSマネジメントコンソール上でも、作成したS3バケットが削除されていることが確認できました。

## 参考文献

https://dev.classmethod.jp/articles/terraform-cloudshell/

https://qiita.com/Catalyst3104/items/91a700e4cab601c97782