使用Terraform操作AWS S3存储桶.
总结
Teraform是一种工具,旨在实现基础设施的代码化(Infrastructure as code),以安全高效地进行基础设施的构建、更改和版本管理。它是HashiCorp提供的开源工具集,包括Vagrant、Serf、Consul等。
这篇文章是关于Teraform支持的提供商之一,即亚马逊网络服务(AWS)中关于Simple Storage Service (S3) 桶的添加和删除的教程。
本教程旨在通过学习,加深对使用Terraform实现基础架构编码的理解。
-
- 参考:Terraform入門 日本語訳 – Qiita
http://qiita.com/zembutsu/items/84f5478701c5391df537
使用 Terraform 时,无需对现有的基础设施环境进行任何配置。Terraform 并不是用来读取现有配置的工具,而仅仅负责管理对当前状态的更改。
此外,选择处理S3是因为我们认为在了解和确认Terraform行为时,S3在AWS中是最简单和易于理解的。
追加说明:已创建安全组配置。
-
- TerraformでAWS(EC2)のセキュリティグループを管理 – Qiita
http://qiita.com/zembutsu/items/5de875ed99ac8a56a998
工作流程
-
- Terraform で、S3 のリソースファイル作成
-
- S3 バケットの作成
-
- AWS マネジメント・コンソールで確認
-
- S3 バケットの削除
- コンソールで確認
预先准备
-
- AWS のアカウント
- Terraform の実行環境
如果尚未开始使用Terraform,请参考以下教程。
-
- Terraform簡易チュートリアル on AWS – Qiita
http://qiita.com/zembutsu/items/93e546df765f8b2c4f32
创建Terraform的配置文件
AWS 和区域的设定
当执行Terraform时,它会读取当前目录下扩展名为*.tf的文件。在连接到AWS之前,首先需要准备一个包含访问密钥和安全密钥的文件。可以使用编辑器(如vi)创建一个名为aws_region.tf的文件作为示例。
provider "aws" {
access_key = "自分のアクセスキー"
secret_key = "自分のシークレットキー"
region = "us-east-1"
}
提供者是指可由Teraform处理的服务提供者的指定。指定”aws”作为提供者代表明确使用AWS作为服务提供商。`版本0.1.0中提供的服务包括AWS、CloudFlare、Consul、DigialOcean、DNSimple和Heroku。这些服务可以以插件形式进行扩展,并在IRC和问题中讨论了对OpenStack和VMware的支持。
另外,在这里使用S3,需要明确指定区域为us-east-1。如果您想在EC2或其他地方使用东京地区,则可以指定为ap-northeast-1。
创建S3的定义文件
接下来,创建一个扩展名为.tf并能识别s3的文件,名为s3.tf。
resource "aws_s3_bucket" "bucket1" {
bucket = "任意名称_tf_bucket"
acl = "private"
}
这是一个示例,作为资源(resource)指定了一个名为bucket1的aws_s3_bucket(S3存储桶)。其内容如下所示。
bucket = AWS 上の実際のバケット名称
acl = S3 上の ACL 指定 ※現バージョンでは private しか指定できない
如前所述,执行Terraform所需的是指定provider(提供程序)和resource(资源)。在这里,我们指定了AWS作为提供程序,并指定了S3存储桶作为资源。
使用 Terraform 构建以创建存储桶。
计划
接下来,我们要创建一个存储桶。在Terraform中,在执行(应用)之前,可以进行计划(规划)并确认变更内容(可以不进行计划直接应用,但从工作前的确认意义上来说,应该执行计划)。
在包含先前的`aws_region_tokyo.tf`和`s3.tf`文件的目录中运行`terraform plan`命令。
$ ./terraform plan
Refreshing Terraform state prior to plan...
The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.
Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.
+ aws_s3_bucket.bucket1
bucket: "" => "任意名称_tf_bucket"
可以看出,当执行时作为添加资源,指定了aws_s3_backet资源的资源名称为bucket1。在这个阶段,它是一个计划,表示对变更的计划。bucket:行是操作内容,意味着将空白的bucket更改为名为任意名称_tf_bucket的bucket,也就是说要创建它。
申请
如果更改内容符合预期,执行terraform apply来应用配置。请注意,在输入命令的瞬间,处理将立即进行。以下是创建一个名为zem_bucket1的存储桶的示例。
$ ./terraform apply
aws_s3_bucket.bucket1: Creating...
bucket: "" => "zem_bucket1"
aws_s3_bucket.bucket1: Creation complete
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
The state of your infrastructure has been saved to the path
below. This state is required to modify and destroy your
infrastructure, so keep it safe. To inspect the complete state
use the `terraform show` command.
State path: terraform.tfstate
值得注意的是,可以看到显示了“应用完成!”和“1个附加”的信息。在这里,我们能够展开一个桶。
在这个阶段,可以通过浏览器访问AWS管理控制台来确认指定的存储桶已经被创建。
另外,即使不使用浏览器,可以通过使用show命令来确认进行了哪些处理。
$ ./terraform show ./terraform.tfstate
aws_s3_bucket.bucket1:
id = zem_bucket1
资源的更改和删除
删除资源有两种方法。一种是删除 s3.tf 文件,另一种是更新 s3.tf 文件的内容。
然而,即使指定了更新,实际上所进行的是资源的删除和新建。Terraform仅仅是自动处理现有的操作流程,因此无法实现AWS S3没有提供的功能,比如修改资源名称。
让我们将s3.tf重命名为s3.tf.bak。此时,terraform只会识别aws_region.tf文件,而S3的资源信息将不再存在于配置文件中。
为了确认这个状态,需要执行terraform plan。
$ ./terraform plan
Refreshing Terraform state prior to plan...
aws_s3_bucket.bucket1: Refreshing state... (ID: zem_bucket1)
The Terraform execution plan has been generated and is shown below.
Resources are shown in alphabetical order for quick scanning. Green resources
will be created (or destroyed and then created if an existing resource
exists), yellow resources are being changed in-place, and red resources
will be destroyed.
Note: You didn't specify an "-out" parameter to save this plan, so when
"apply" is called, Terraform can't guarantee this is what will execute.
- aws_s3_bucket.bucket1
這表示要將目前 AWS 上的資源與手頭處理的 terraform 內容進行比較,作為資源差異,將 aws_s3_bucket.bucket1 這個資源進行刪除(實際上可以同時進行多個資源的新增和刪除。同時也可以進行處理的優先級排序。詳情請參閱文件)。
执行 terraform apply 以应用资源删除。但是,有一个条件需要注意,即存储桶中没有任何文件。如果存在文件,则无法进行删除。
$ ./terraform apply
aws_s3_bucket.bucket1: Refreshing state... (ID: zem_bucket1)
aws_s3_bucket.bucket1: Destroying...
aws_s3_bucket.bucket1: Destruction complete
Apply complete! Resources: 0 added, 0 changed, 1 destroyed.
以此显示为“1 destroyed”,可知目标资源已被销毁。
当再次查看管理控制台时,可以看到目标存储桶已被删除。
或者,您可以使用show命令,同样可以确认资源不存在。
$ ./terraform show ./terraform.tfstate
The state file is empty. No resources are represented.
其他还可以尝试创建自定义桶名称,并确认如果文件存在于桶中,则无法删除。
補充
Teffarom 所进行的是基础设施的定义和处理,无法执行存储桶中的高级操作。如果想要进行此类操作,建议使用 CLI 进行操作。
参考:
* [JAWS-UG CLI] S3: #1 使用高级S3命令(从创建存储桶到静态Web托管和删除)- Qiita
http://qiita.com/tcsh/items/edd5d65f1bc2f8d1819a
请参考
Provider: AWS – Terraform
http://www.terraform.io/docs/providers/aws/index.html
AWS: aws_s3_bucket – Terraform
http://www.terraform.io/docs/providers/aws/r/s3_bucket.html