[1小时完成] 使用Terraform创建S3存储桶并公开静态内容的步骤
首先
-
- TerraformでS3バケットを作成してコンテンツを公開する手順です。
- 前提条件はAWSを利用できることです。
目录
-
- 要做什么?
- 步骤
你打算做什么?
本記事で対象としていないこと
- S3バケットに自動で静的コンテンツをアップロードすること
- 静的コンテンツの作成(Nuxtの場合は、2章の”静的コンテンツをアップロードし公開”に記載しています。)
本記事で触れていること
- Terraformをインストール
- プロバイダ(AWS)とプロファイルの設定
- HCLでAWS S3の設定を記述
- TerraformコマンドでAWSにS3を構築
- 静的コンテンツをアップロードし公開
操作顺序
Terraform的安装
安装Homebrew
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrc
$ source ~/.zshrc
$ brew -v
安装tfenv
→tfenv是terraform的版本管理工具
→类似于Homebrew,将其添加到zsh的路径中会很方便。
$ brew install tfenv
$ tfenv -v
安装Terraform时,请使用最新版本(1.0.6版本已经相当老)。
$ tfenv install 1.0.6
$ tfenv use 1.0.6
$ terraform -v
AWS的提供者和配置文件设置
AWS CLI的安装
$ brew install awscli
$ aws --version
在AWS控制台上创建IAM用户,并授予AdministratorAccess访问权限。
生成访问密钥和秘密访问密钥。
注册已创建的IAM用户的身份验证密钥。
$ aws configure --profile terraform-user
→进行对话式输入并进行设置
创建 SSH 密钥并限制权限
$ ssh-keygen -t rsa -f id_rsa_terraform
$ sudo chmod 600 id_rsa_terraform.pub
使用HCL描述AWS S3的设置。
首先,基本上我們可以參考以下的內容來了解如何在Terraform中進行哪些配置。以下是關於Resource: aws_s3_bucket的設定方法。
Terraform注册表资源:aws_s3_bucket
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket
使用Terraform命令在AWS上创建S3。
在同一个目录下,使用code命令打开VScode,并编写用于创建和公开s3存储桶的HCL terraform文件。
HCL是由HashiCorp(提供Terraform)创建的配置语言。
module "s3" {
source = "./module/s3"
}
terraform {
required_version = ">= 0.15"
required_providers {
aws = ">=3.44.0"
}
}
provider "aws" {
region = "AWSのリージョン"
profile = "プロファイルを設定した(IAMユーザの認証Keyを登録した)ユーザ名"
}
#今回は任意でnuxtappというリソース名とします。
#リソースはresourceブロック単位で設定します。
#構文としては、resource "<リースの種類>" "<リソース名>" {設定内容}となります。
resource "aws_s3_bucket" "nuxtapp" {
bucket = "ayumu-sample-bucket"
}
resource "aws_s3_bucket_website_configuration" "nuxtapp-website" {
bucket = aws_s3_bucket.nuxtapp.bucket
index_document {
suffix = "index.html"
}
}
resource "aws_s3_bucket_ownership_controls" "nuxtapp-ownership-controls" {
bucket = aws_s3_bucket.nuxtapp.id
rule {
object_ownership = "ObjectWriter"
}
}
resource "aws_s3_bucket_acl" "nuxtapp-acl" {
depends_on = [aws_s3_bucket_ownership_controls.nuxtapp-ownership-controls]
bucket = aws_s3_bucket.nuxtapp.id
acl = "public-read"
}
resource "aws_s3_bucket_public_access_block" "nuxtapp_public_access_block" {
bucket = aws_s3_bucket.nuxtapp.id
block_public_acls = false
block_public_policy = false
ignore_public_acls = false
restrict_public_buckets = false
}
resource "aws_s3_bucket_policy" "nuxtapp-policy" {
bucket = aws_s3_bucket.nuxtapp.id
policy = <<POLICY
{
"Version":"2012-10-17",
"Statement":[
{
"Sid":"PublicReadGetObject",
"Effect":"Allow",
"Principal": "*",
"Action":["s3:GetObject"],
"Resource":["arn:aws:s3:::${aws_s3_bucket.nuxtapp.bucket}/*"]
}
]
}
POLICY
}
aws_s3_bucket.ts中描述了创建S3存储桶并将静态内容公开的设置。具体设置如下:
-
- バケットの作成
-
- ホスティング設定
-
- ACLの設定
-
- バケットの公開設定
- バケットポリシーの設定
使用Terraform指令在AWS上创建S3。
接着,tf的描述已经完成,接下来执行Terraform命令来建立环境。
$ terraform init
初始化Terraform项目。 这意味着下载所需的提供者插件(例如AWS、Google Cloud、Azure等)并进行必要的配置。 只需在项目设置期间执行一次。
$ terraform plan
创建一个名为”计划”的文件,用于显示Terraform将执行的操作。这类似于模拟,可以确认将创建、更改和删除哪些资源。这样可以在执行apply命令之前避免意外操作。
$ terraform apply
这个命令实际上是用来创建、更新和删除基础设施的。具体来说,它会根据显示在”计划”命令中的计划进行操作。当执行这个命令时,Terraform会要求您确认计划,并且只有在您批准后才执行操作。
如果申请成功,就从AWS控制台打开S3,查看存储桶。如果创建成功,就可以了。
上传和发布静态内容
从AWS控制台打开S3,打开创建的存储桶的设置,然后上传静态内容。
如果是Nuxt项目,则使用yarn generate命令将其转化为静态内容(进行构建),并在dist目录中创建。然后将dist目录中的内容拖动到S3中进行上传。
上传完成后,在存储桶属性的底部会生成托管内容的URL,请点击该URL来访问内容,如果可以访问到内容则表示完成。
到目前为止,已经成功完成了标题中提到的“使用Terraform创建S3存储桶并公开托管内容”的任务。
<补充:删除创建的内容>
顺便提一下,使用Terraform创建的内容可以通过以下命令进行删除。需要注意的是,静态内容需要手动删除。请打开AWS控制台并删除通过S3上传的内容。
$ terraform destroy
执行后,请在AWS控制台进行确认。如果成功删除,就表示OK。
最后
-
- 最近、Terraformを触り始めたので良い勉強になりました。
-
- 他にもTerraformで色々試しましたが、とりあえず今回はS3の設定方法を残しておきます。
- 今後はGithub actionsと連携してコンテンツのアップロードまで自動化できるようにしたいです。