【发布时间】:2022-01-11 11:50:21
【问题描述】:
有没有办法获取 ECS 集群上所有 EC2 容器实例的 ids/arns 列表,我尝试使用数据源:aws_ecs_cluster 但它只显示 register_container_instances_count - ECS 集群的已注册容器实例数,没有任何关于他们
【问题讨论】:
标签: amazon-web-services amazon-ec2 terraform amazon-ecs
有没有办法获取 ECS 集群上所有 EC2 容器实例的 ids/arns 列表,我尝试使用数据源:aws_ecs_cluster 但它只显示 register_container_instances_count - ECS 集群的已注册容器实例数,没有任何关于他们
【问题讨论】:
标签: amazon-web-services amazon-ec2 terraform amazon-ecs
如果 TF 没有提供适合您需求的数据源,您可以使用External Data Source 提供您自己的数据源。使用外部数据源,您可以在 TF 脚本中获取所需的任何信息以供将来使用。
【讨论】:
试试这个:
确保已导入 boto3 模块和所需的 AWS 权限
(不是 Python 或 Terraform 专家)
terraform {}
data "external" "external_resource" {
program = ["/usr/bin/python3", "${path.module}/list_instances.py"]
query = {
cluster_name = "CHANGE_ME"
}
}
output "output" {
value = data.external.external_resource.result
}
import boto3
import sys
import json
client = boto3.client('ecs')
def list_containers(cluster_name):
# list all container instances id
response = client.list_container_instances(
cluster=cluster_name
)
return response['containerInstanceArns']
def describe_container():
# get terraform query json and assign it to a dict
query=sys.stdin.readlines()
terraform_respone_dic=json.loads(query[0])
cluster_name=terraform_respone_dic['cluster_name']
# get the container instances
response = client.describe_container_instances(
cluster=cluster_name,
containerInstances=list_containers(cluster_name)
)
# get the instance id's and assign to a variable
instances=list(map(lambda x:x['ec2InstanceId'],response['containerInstances']))
# assign them to our original query json (dict)
terraform_respone_dic['instances_id\'s']=instances
# return as stdout
output = json.dumps({str(key): str(value) for key, value in terraform_respone_dic.items()})
sys.stdout.write(output)
if __name__ == '__main__':
describe_container()
预期输出:
terraform apply
Outputs:
output = tomap({
"cluster_name" = "production"
"instances_id's" = "['i-xxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxx', 'i-xxxxxxxxxxxxxxxx']"
})
【讨论】: