Chuyển đến nội dung chính

Cách tạo các tác vụ liên kết trong terraform.



 Trong quá trình provisioning một hạ tầng nào đó các bước khởi tạo một thành phần hay một service phải theo từng tự trước sau. 

 Trong terraform cũng có quá trình như vậy. 

 Trong bài viết này mình đề cập đến việc tạo các tác vụ tài nguyên và tác vụ module liên kết với nhau như thế nào. 

 Trong hầu hết việc tạo các tác vụ liên kết thì trong terraform phỏng đoán việc sắp xếp tạo các tài nguyên phụ thuộc vào các cấu hình đã đưa sẵn. Cho nên những tài nguyên được tạo và được xóa theo một từng tự có sẵn. 


Tuy nhiên trong một số trường hơp thì terraform không thể phỏng đoán đươc tuần tự trước sau của việc provisioning một số dịch vụ. Trong trường hợp này thì bạn sử dụng tham số : depends_on 

Ví dụ bạn tạo một file main.tf như sau: 


terraform { required_providers { aws = { source = "hashicorp/aws" version = "2.69.0" } }} provider aws { region = "us-west-1"} data "aws_ami" "amazon_linux" { most_recent = true owners = ["amazon"] filter { name = "name" values = ["amzn2-ami-hvm-*-x86_64-gp2"] }} resource "aws_instance" "example_a" { ami = data.aws_ami.amazon_linux.id instance_type = "t2.micro"} resource "aws_instance" "example_b" { ami = data.aws_ami.amazon_linux.id instance_type = "t2.micro"} resource "aws_eip" "ip" { vpc = true instance = aws_instance.example_a.id}

Trên đoạn script trên thì bạn thấy aws_eip là địa chỉ ip address của một instance. 

Và trong trường hợp này thì Ec2 instance phải được tạo trước rồi sau đó địa chỉ ip mới dc tạo và gán cho instance đó.

Ta khởi tạo terraform: 

$ terraform init

Apply cấu hình vào: 

$ terraform apply

Và output ra khi confirm yes cho việc apply của terraform. 

aws_instance.example_a: Creating...aws_instance.example_b: Creating...aws_instance.example_a: Still creating... [10s elapsed]aws_instance.example_b: Still creating... [10s elapsed]## ...aws_instance.example_a: Still creating... [1m0s elapsed]aws_instance.example_b: Still creating... [1m0s elapsed]aws_instance.example_b: Creation complete after 1m1s [id=i-0c31f0e4fb17a10e8]aws_instance.example_a: Creation complete after 1m1s [id=i-0f3b463f3b79b7206]aws_eip.ip: Creating...aws_eip.ip: Still creating... [10s elapsed]aws_eip.ip: Creation complete after 16s [id=eipalloc-04b1282f16b6fb068]

Trong trường hợp trên thì terraform sẽ đợi cho đến khi example_a xong thì eip_ip mới tạo. 

Và trường hợp này thì terraform sẽ ngầm hiểu vể thứ tự tạo của terraform. (implicit dependency).

Vậy trong trường hợp explicit ( rõ ràng) dependency thì như thế nào. 

Trong trường hợp này ta xem xét ví dụ sau: 

resource "aws_s3_bucket" "example" { acl = "private"} resource "aws_instance" "example_c" { ami = data.aws_ami.amazon_linux.id instance_type = "t2.micro" depends_on = [aws_s3_bucket.example]} module "example_sqs_queue" { source = "terraform-aws-modules/sqs/aws" version = "2.1.0" depends_on = [aws_s3_bucket.example, aws_instance.example_c]}


Trong đoạn script trên thì có một module sqs nên ta phải install module này trước. 

Chạy :

$ terraform getDownloading terraform-aws-modules/sqs/aws 2.1.0 for example_sqs_queue...- example_sqs_queue in .terraform/modules/example_sqs_queue

Sau đó ta apply : 

$ terraform apply

Và output ra là : 

aws_s3_bucket.example: Creating...aws_s3_bucket.example: Still creating... [10s elapsed]## ...aws_s3_bucket.example: Creation complete after 1m0s [id=terraform-20200813175124184300000001]aws_instance.example_c: Creating...aws_instance.example_c: Still creating... [10s elapsed]aws_instance.example_c: Still creating... [20s elapsed]aws_instance.example_c: Still creating... [30s elapsed]aws_instance.example_c: Still creating... [40s elapsed]aws_instance.example_c: Creation complete after 44s [id=i-08a44071a2517179f]module.example_sqs_queue.aws_sqs_queue.this[0]: Creating...module.example_sqs_queue.aws_sqs_queue.this[0]: Creation complete after 6s [id=https://sqs.us-west-1.amazonaws.com/561656980159/terraform-20200813175223563000000002]module.example_sqs_queue.data.aws_arn.this[0]: Reading...module.example_sqs_queue.data.aws_arn.this[0]: Read complete after 0s [id=arn:aws:sqs:us-west-1:561656980159:terraform-20200813175223563000000002] Apply complete! Resources: 3 added, 0 changed, 0 destroyed.

Trong trường hợp trên thì quá trình tạo s3 phải xảy ra đầu tiên và terraform sẽ đợi cho đến khi hoàn tất việc tạo s3 mới tạo instance và SQS. 

Vậy nếu xóa dịch vụ thì sao? Terraform sẽ xóa tất cả các dịch vụ kể cả đó là phụ thuộc ngầm hay phụ thuộc hiển thị trên thông số depends_on. 


Nhận xét

Bài đăng phổ biến từ blog này

Trang web medium.com chết, vì sao ?

 Medium.com là trang web có những bài viết về IT, phần mềm và công nghệ nói chung rất phổ biến và chất lượng.  Nhưng khoảng 1 tuần nay không vào được bằng cả mạng viettel và 4G của Mobi phone.  Dân It thường tham khảo các bài viết trên trang này. Nhiều bài viết hay và chất lượng. là một cơ sở dữ liệu lớn cho dân IT nhưng đã bị chặn.  Các bài viết này thường thì có tính quy chuẩn và dài hơn, các topic có chất lượng hơn so với stackoverflow.  Nhưng các subdomain thì vẫn truy cập được như:  https://about.medium.com Bạn có thể tham khảo lý do vì sao medium.com bị chặn ở Việt nam. tại trang tinh tế:  Nói chung mình không thích điều này.  https://tinhte.vn/thread/website-medium-khong-truy-cap-duoc-la-do-website-chet-hay-chan-ip-viet-nam-nhi.3231608/

Cách sử dụng sys.argv trong python.

Cách sử dụng sys.argv trong python. sys.argv là môt danh sách [list] trong python, nó được sư dụng khi bạn chạy một lệnh command-line nào đó trên hệ thống. Và argument này được đẩy vào script python để thực thi khi chạy câu lệnh. Ví dụ: python sys.argv arg1 arg2 Trước tiên bạn phải import mô đun sys trong script. import sys print "This is the name of the script: " , sys . argv [ 0 ] print "Number of arguments: " , len ( sys . argv ) print "The arguments are: " , str ( sys . argv ) Tên của script này : sysargv.py Số lượng arg là : 1 Arg là : ['sysargv.py'] python test1020.py 111 This is the name of the script:  test1020.py Number of arguments:  2 The arguments are:  ['test1020.py', '111']

GitHub Actions là gì ? Làm quen với GitHub Actions.

  Như ta đã biết github là nới chứa source code nổi tiếng thế giới hiện nay, ngoài github còn có gitlab, bitbucket, codecommit, ... Cơ bản github miễn phí cho người dùng developer, nếu nhu cầu sử dụng nhiều repo cũng như project có nhiều thanh viên developer tham gia thì bạn có thể mua bản nâng cao.  Về tiến trình CI/CD process, chúng ta có thể biết tới như Jenkins, Team City, Codepipeline trên AWS, ...  GitHub Actions mới ra đời gần đây , ngày 13 tháng 11 năm 2019, GitHub Actions ra phiên bản đầu tiên, trước đó khoảng 1 năm bản beta ra đời.  Tham khảo tại đây : https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/ GitHub Actions khá đơn giản, khi tiến trình build, test và deploy được viết trong một file có định dạng yaml nằm trong thư mục .github/workflows/ trong chính source code của bạn.  GitHub Actions là một event-driven nghĩa là chương trình chạy một loạt các dòng lệnh khi bạn nhận được 1 event, ví dụ mỗi lần một developer nào đó tạo một pull request cho một repositor