将elasticache节点端点传递给docker容器实例

时间:2016-09-23 20:35:51

标签: amazon-web-services environment-variables amazon-elasticache amazon-ecs terraform

在AWS中,我有一个弹性缓存集群,里面有一个redis节点和一个ECS集群。我无法弄清楚将redis端点url传递给我的docker容器的更好方法是什么。

目前,在我的任务定义中,我使用了一个名为REDIS_ENDPOINT的环境参数和我的值。之前运作良好。

但我正在将部署流程从所有手动操作(使用AWS UI)转换为Terraform。现在,REDIS_ENDPOINT环境变量不再工作得那么好了,因为redis节点将由terraform创建(dns可能会发生变化),而env变量(容器定义的一部分)必须在静态json文件中。

我阅读了一些文档,但我找不到正确的方法。或者可能是我在AWS文档中丢失了。

2 个答案:

答案 0 :(得分:0)

创建Elasticache cluster using Terraform时,您可以访问一些输出变量,其中包括所创建节点的地址。

所以你有两个选择:你可以创建一个DNS记录CNAME到你的应用程序可以静态使用的输出地址,或者你可以在你的应用程序可以访问的模板化文件中使用输出的地址。

我通常选择第一个选项,因此您可能会遇到以下情况:

resource "aws_elasticache_cluster" "redis" {
    cluster_id = "redis-cluster"
    engine = "redis"
    node_type = "cache.t2.micro"
    port = 6379
    num_cache_nodes = 1
    parameter_group_name = "default.redis2.8"
}

resource "aws_route53_record" "redis" {
   zone_id = "${var.dns_zone_id}"
   name = "redis.example.com"
   type = "CNAME"
   ttl = "60"
   records = ["${aws_elasticache_cluster.redis.address}"]
}

然后,您的应用程序可以使用redis.example.com:6379作为终点,即使重建Elasticache集群,这也将始终有效。

答案 1 :(得分:0)

您可以使用输出{}变量,然后在您的ECS中,您可以使用remote state来检索它。

resource "aws_elasticache_cluster" "redis" {
    cluster_id = "redis-cluster"
    engine = "redis"
    node_type = "cache.t2.micro"
    port = 6379
    num_cache_nodes = 1
    parameter_group_name = "default.redis2.8"
}


output "redis_address" {
  value = "${aws_elasticache_cluster.redis.address}"
}

然后在你的tf for ecs(假设s3远程状态):

data "terraform_remote_state" "redis" {
    backend = "s3"
    config {
        bucket = "com-my-bucket"
        key = "redis/terraform.tfstate"
        region = "us-east-1"
    }
}

# address = "${data.terraform_remote_state.redis.redis_address}"