Chrome Pointer

2023年9月20日 星期三

Terraform 常用指令與教學

當您使用Terraform時,您需要創建一個Terraform配置文件,通常以.tf為擴展名,以描述您要管理的基礎架構資源。以下是一個簡單的Terraform代碼示例,以創建一個AWS EC2實例:

hcl
# 指定要使用的提供商和認證信息 provider "aws" { region = "us-east-1" # 指定AWS區域 } # 定義EC2實例 resource "aws_instance" "example" { ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI ID instance_type = "t2.micro" # 實例類型 } # 輸出實例的公有IP地址 output "instance_public_ip" { value = aws_instance.example.public_ip }


這個示例中,我們使用了TerraformHCL語言來描述要創建的AWS EC2實例。這個配置文件包括以下幾個主要部分:

  1. provider 區塊:這個部分指定了使用的提供商(在本例中是AWS),並配置了相關的認證信息和區域。
  2. resource 區塊:這個部分定義了我們要創建的AWS EC2實例資源。我們指定了AMIAmazon Machine Image)和實例類型。
  3. output 區塊:這個部分定義了一個輸出,用於顯示創建的實例的公有IP地址。
provider 用於定義基礎設施平台(例如 AWS),而 resource 用於定義您在該平台上創建或管理的具體資源(例如 S3 存儲桶)。Terraform 會根據這些配置生成計劃,然後應用這些計劃以創建、更新或刪除相應的資源,以實現您的基礎設施即代碼需求。

要使用此配置文件,您需要執行以下步驟:

  1. 安裝Terraform並配置AWS認證。
  2. 創建一個以.tf為擴展名的配置文件,將上面的Terraform代碼粘貼到文件中。
  3. 在命令行中進入配置文件所在的目錄,然後執行以下命令:
csharp
terraform init terraform apply


terraform init 將初始化Terraform工作目錄,而 terraform apply 將創建配置中定義的AWS EC2實例。

Q: EC2實例都使用單獨的AMI,AMI ID都不同嗎?

對於大多數情況而言,當您創建多個EC2實例時,每個實例都可以使用相同的AMI(Amazon Machine Image)。這意味著這些實例將共享相同的AMI ID,因為它們都是基於相同的AMI創建的。

AMI ID代表的是AMI的版本和內容,通常不會因為多個實例的創建而變化。只有在您升級或更改AMI時,AMI ID才會改變。

因此,如果您想要創建多個具有相同配置的EC2實例,您可以使用相同的AMI ID。這些實例將基於相同的AMI進行創建,但每個實例都將獨立運行,擁有自己的狀態和資源。

然而,如果您要創建具有不同配置或不同軟體的實例,您可以選擇不同的AMI ID作為基礎映像。這樣,每個實例將基於不同的AMI進行創建,以滿足特定需求。


創建VPC:


hcl
resource "aws_vpc" "example" { cidr_block = "10.0.0.0/16" }
resource "aws_subnet" "example" { vpc_id = aws_vpc.example.id cidr_block = "10.0.0.0/24" availability_zone = "us-east-1a" }

這個示例創建一個AWS VPC,指定了CIDR地址範圍。

  • 10.0.0.0/16 包含了從 10.0.0.0 10.0.255.255 IPv4地址,總共有 256 x 256 = 65536 個地址。
  • 10.0.0.0/24 包含了從 10.0.0.0 10.0.0.255 IPv4地址,總共有 256 個地址。

CIDRClassless Inter-Domain Routing)表示法中的 /16 /24 表示子網掩碼的位數。子網掩碼用於定義IP地址範圍中哪些位用於網路地址,哪些位用於主機地址。下面是計算方法:

  1. /16 表示子網掩碼中有16個位用於網路地址,剩下的 32 - 16 = 16 個位用於主機地址。
    • 網路地址部分是前16位,它們是 10.0
    • 主機地址部分是後16位,它們可以有 2^16 = 65536 個不同的組合,因此有 65536 個可能的主機地址。
  2. /24 表示子網掩碼中有24個位用於網路地址,剩下的 32 - 24 = 8 個位用於主機地址。
    • 網路地址部分是前24位,它們是 10.0.0
    • 主機地址部分是後8位,它們可以有 2^8 = 256 個不同的組合,因此有 256 個可能的主機地址。
  3. "/16"的CIDR表示法對應的子網路遮罩是255.255.0.0,它表示前16位用於網絡,而後面的16位用於主機。同樣,"/24"的CIDR表示法對應的子網路遮罩是255.255.255.0,表示前24位用於網絡,後面的8位用於主機。

bucket 參數中,您應該輸入您想要創建的Amazon S3存儲桶的名稱。這個名稱是您為存儲桶指定的唯一標識符,用於識別存儲桶。


創建EC2實例:

hcl
resource "aws_instance" "example" { ami = "ami-12345678" instance_type = "t2.micro" }

這個示例創建一個EC2實例,指定了Amazon Machine Image (AMI) 和實例類型。

創建S3存儲桶:

hcl
resource "aws_s3_bucket" "example" { bucket = "my-example-bucket" acl = "private" }

這個示例創建一個Amazon S3存儲桶,設置了存儲桶名稱和存取控制列表(ACL)。

acl 是Amazon S3(Simple Storage Service)中用於設定對象(例如存儲桶或對象)存取權限的縮寫,它代表「Access Control List」(存取控制列表)。

  1. private(默認):對象或存儲桶僅對擁有者(AWS帳戶)可見和可訪問。其他人無法訪問。
  2. public-read:對象或存儲桶對擁有者和任何人都是可讀的。換句話說,任何人都可以檢視對象的內容。
  3. public-read-write:對象或存儲桶對擁有者和任何人都是可讀和可寫的。這意味著任何人都可以檢視和修改對象的內容。
  4. authenticated-read:對象或存儲桶對擁有者和經過身份驗證的用戶(AWS帳戶)可見和可讀。其他人無法訪問。
  5. bucket-owner-read:對象或存儲桶對擁有者和存儲桶擁有者(AWS帳戶)可見和可讀。對象所有者可以提供對存儲桶擁有者的訪問。
  6. bucket-owner-full-control:對象或存儲桶對擁有者和存儲桶擁有者(AWS帳戶)都是可見和具有完全控制權限的。對象所有者可以提供對存儲桶擁有者的訪問,包括刪除對象。


創建RDS資料庫實例:

hcl
resource "aws_db_instance" "example" { allocated_storage = 20 storage_type = "gp2" engine = "mysql" engine_version = "5.7" instance_class = "db.t2.micro" name = "exampledb" username = "admin" password = "password" parameter_group_name = "default.mysql5.7" }

這個示例創建一個Amazon RDS資料庫實例,指定了存儲、引擎、類型等參數。


創建IAM角色和策略:

hcl
resource "aws_iam_role" "example" { name = "example-role" } resource "aws_iam_policy" "example" { name = "example-policy" description = "An example IAM policy" policy = jsonencode({ Version = "2012-10-17", Statement = [{ Action = "s3:ListBucket", Effect = "Allow", Resource = "arn:aws:s3:::my-example-bucket" }] }) } resource "aws_iam_role_policy_attachment" "example" { policy_arn = aws_iam_policy.example.arn role = aws_iam_role.example.name }

這個示例創建了一個IAM角色、一個IAM策略,並將策略附加到角色上,以設置AWS資源的權限。

hcl
resource "aws_iam_role" "example" { name = "example-role" }

這部分代碼創建了一個名為 "example-role" 的IAM角色。IAM角色用於授予其他AWS資源(如EC2實例或Lambda函數)訪問AWS服務的權限。在這個示例中,我們只指定了角色的名稱。


hcl
resource "aws_iam_policy" "example" { name = "example-policy" description = "An example IAM policy" policy = jsonencode({ Version = "2012-10-17", Statement = [{ Action = "s3:ListBucket", Effect = "Allow", Resource = "arn:aws:s3:::my-example-bucket" }] }) }

這部分代碼創建了一個名為 "example-policy" 的IAM策略。IAM策略定義了一組允許或拒絕操作的規則。在這個示例中,我們定義了一個策略,該策略允許對Amazon S3存儲桶 my-example-bucket 執行 s3:ListBucket 操作。這個策略的JSON表示如下:

    json
    { "Version": "2012-10-17", "Statement": [ { "Action": "s3:ListBucket", "Effect": "Allow", "Resource": "arn:aws:s3:::my-example-bucket" } ] }

    附加策略到IAM角色:

    hcl
    resource "aws_iam_role_policy_attachment" "example" { policy_arn = aws_iam_policy.example.arn role = aws_iam_role.example.name }

    這部分代碼創建了一個IAM策略附加(attachment),將剛剛創建的IAM策略附加到剛剛創建的IAM角色上。這表示該角色現在擁有了策略所定義的權限,即可以對 my-example-bucket 存儲桶執行 s3:ListBucket 操作。

    ARN 代表 "Amazon Resource Name",是Amazon Web Services (AWS) 中用於唯一標識和命名資源的統一格式。

      ruby
      arn:aws:s3:::my-example-bucket
      • arn:前綴,標識這是一個Amazon資源名稱。
      • aws:指定了資源所屬的AWS環境。
      • s3:指定了AWS服務的名稱,這表示這是一個Amazon S3存儲桶。
      • my-example-bucket:資源的唯一ID,這是S3存儲桶的名稱。

      這個ARN確保唯一標識了名為 "my-example-bucket" S3存儲桶,並可以用於設置IAM策略,以控制對該存儲桶的訪問權限。

      "Action": "s3:ListBucket" IAM策略中的一個語句,用於定義對Amazon S3存儲桶的操作許可權。

      • "Action":指定了允許或拒絕的操作。在這種情況下,操作是 "s3:ListBucket",它表示允許對指定的S3存儲桶列出內容的操作。
      • "s3:ListBucket":這是Amazon S3服務中的一個特定操作,它允許用戶列出指定存儲桶中的對象(文件和目錄)的內容。通常,當您需要將對象的列表傳回給用戶或應用程序時,需要這個操作。

      這個IAM策略語句告訴AWS,擁有這個策略的實體(例如IAM角色或IAM用戶)被授予對指定存儲桶的 s3:ListBucket 操作的訪問權限。這意味著該實體可以執行列出存儲桶內容的操作。


      當您在AWS中創建IAM策略時,AWS將自動為策略生成ARN,而不需要您手動指定。然後,您可以在Terraform配置中使用 aws_iam_policy 資源的 arn 屬性來引用這個自動生成的ARN。

      這是一個示例,如何在Terraform配置中使用 aws_iam_policy 資源的 arn 屬性:

      hcl
      resource "aws_iam_policy" "example" { name = "example-policy" description = "An example IAM policy" # other policy configuration... } # 在其他地方引用策略的ARN resource "aws_iam_role_policy_attachment" "attachment" { policy_arn = aws_iam_policy.example.arn role = aws_iam_role.example.name }

      在上述示例中,aws_iam_policy.example.arn 將包含由AWS自動生成的策略ARN,並用於附加到IAM角色。因此,您無需手動指定ARNTerraform將根據策略的名稱和AWS帳戶ID自動生成它。