2016-10-06 2 views
1

Я хочу поделиться сценарием terraform, который будет использоваться в разных проектах. Я знаю, как создавать и обмениваться модулями, но эта настройка имеет большое раздражение: когда я ссылаюсь на модуль в скрипте и выполняю команду terraform apply, если ресурс модуля не существует, он будет создан, но также если я выполню terraform destroy ресурс будет уничтожен.Как использовать скрипт terraform без зависимостей между модулями

Если у меня есть два проекта в зависимости от того же модуля, и в одном из них я вызываю terraform destroy, это может привести к несогласованному состоянию, поскольку модуль используется другим проектом. Сценарий может терпеть неудачу, потому что он не может уничтожить ресурс, иначе он уничтожит ресурс и повлияет на другой проект.

В моем сценарии я хочу поделиться сетевыми сценариями между двумя проектами, и я хочу, чтобы сетевые ресурсы никогда не уничтожались. Я не могу создать проект только для этого ресурса, потому что мне нужно как-то ссылаться на его проекты, и единственный способ сделать это - через его идентификатор, который я понятия не имею, что будет.

prevent_destroy также не является вариантом, так как мне нужно уничтожить другие ресурсы, но ресурс общего ресурса. Эта конфигурация делает ошибку terraform destroy.

Есть ли способ ссылки на ресурс, например, по его названию, или есть ли другой лучший подход для достижения того, что я хочу?

ответ

4

Если вы правильно поняли, у вас есть ресурс R, который является «одиночным». То есть, только один экземпляр R может когда-либо существовать в вашей учетной записи AWS. Например, у вас может быть только один aws_route53_zone с именем «foo.com». Если вы включаете R в качестве модуля в двух разных местах, то он может создать его, когда вы запустите terraform apply, и либо он может удалить его при запуске terraform destroy. Вы бы хотели этого избежать, но вам все равно нужен способ получения выходного атрибута от R (например, zone_id для ресурса aws_route53_zone генерируется AWS, поэтому вы не можете догадаться).

Если это так, то вместо того, чтобы использовать R в качестве модуля, то вам необходимо:

  1. Создать R сам по себе в своем собственном наборе шаблонов терраформировать. Предположим, что они находятся под /terraform/R.
  2. Настройте /terraform/R на использование Remote State. Например, вот как вы можете настроить эти шаблоны, чтобы сохранить их удаленное состояние в ведре S3 (вам нужно заполнить имя ведра/регион, как указано):

    terraform remote config \ 
        -backend=s3 \ 
        -backend-config="bucket=(YOUR BUCKET NAME)" \ 
        -backend-config="key=terraform.tfstate" \ 
        -backend-config="region=(YOUR BUCKET REGION)" \ 
        -backend-config="encrypt=true" 
    
  3. Определение любого вывода атрибутов вам требуется от R в качестве выходных переменных. Например:

    output "zone_id" { 
        value = "${aws_route_53.example.zone_id}" 
    } 
    
  4. При запуске terraform apply в /terraform/R, он будет хранить его терраформировать состояние, в том числе и этот выход, в качестве ковша S3.
  5. Теперь, во всех других шаблонах Terraform, которым нужен этот выходной атрибут от R, вы можете вытащить его из ведра S3 с помощью terraform_remote_state data source.Например, предположим, что вы имели некоторый шаблон /terraform/foo, что нужно, что zone_id параметр создать aws_route53_record (вам нужно заполнить имя ведро/региона, как указано):

    data "terraform_remote_state" "r" { 
        backend = "s3" 
        config { 
        bucket = "(YOUR BUCKET NAME)" 
        key = "terraform.tfstate"  
        region = "(YOUR BUCKET REGION)" 
        } 
    } 
    
    resource "aws_route53_record" "www" { 
        zone_id = "${data.terraform_remote_state.r.zone_id}" 
        name = "www.foo.com" 
        type = "A" 
        ttl = "300" 
        records = ["${aws_eip.lb.public_ip}"] 
    } 
    
  6. Обратите внимание, что terraform_remote_state является Read- только источник данных. Это означает, что при запуске terraform apply или terraform destroy на любых шаблонах, которые используют этот ресурс, они не будут иметь никакого эффекта в R.

Для получения дополнительной информации, ознакомьтесь с How to manage terraform state и Terraform: Up & Running.

+0

Wow! Это действительно хороший подход! Я понятия не имел, что вы можете получить удаленное состояние и использовать его в качестве источника данных. –

Смежные вопросы