Бывает, что
- общедоступная документация по терраформ ресурсам не всегда достоверна,
- в документации не хватает каких-нибудь правил валидации или неточно описаны параметры,
- понадобиться использовать провайдер без официальной документации,
- может возникнуть необходимость написать свой провайдер для системы используемой в ваших проектах.
Давайте потренируемся читать исходный код AWS провайдера, который можно склонировать от сюда: https://github.com/hashicorp/terraform-provider-aws.git. Просто найдите нужные ресурсы в исходном коде и ответы на вопросы станут понятны.
- Найдите, где перечислены все доступные
resourceиdata_source, приложите ссылку на эти строки в коде на гитхабе. - Для создания очереди сообщений SQS используется ресурс
aws_sqs_queueу которого есть параметрname.- С каким другим параметром конфликтует
name? Приложите строчку кода, в которой это указано. - Какая максимальная длина имени?
- Какому регулярному выражению должно подчиняться имя?
- С каким другим параметром конфликтует
Resource перечислены в файле ./internal/provider/provider.go строка 896, а DataSource в строке 420.
Конфликтует c параметром name_prefix, в коде это можно найти в строке 87 файла terraform-provider-aws/internal/service/sqs/queue.go.
Что касается валидации и регулярного выражения, то в описании параметра name (как собвственно и name_prefix) валидации нет, т.е. нет функции ValidateFunc:
// DELETED
"name": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
ConflictsWith: []string{"name_prefix"},
},
"name_prefix": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
ConflictsWith: []string{"name"},
// DELETEDПример, где валидация например есть:
// DELETED
"policy": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringIsJSON,
DiffSuppressFunc: verify.SuppressEquivalentPolicyDiffs,
StateFunc: func(v interface{}) string {
json, _ := structure.NormalizeJsonString(v)
return json
},
},
// DELETEDВалидация Strings описана в файле https://github.com/hashicorp/terraform-plugin-sdk/blob/main/helper/validation/strings.go, который импортируется в основном файле выше. Пример функции валидации строки указанному RexExp:
// StringMatch returns a SchemaValidateFunc which tests if the provided value
// matches a given regexp. Optionally an error message can be provided to
// return something friendlier than "must match some globby regexp".
func StringMatch(r *regexp.Regexp, message string) schema.SchemaValidateFunc {
return func(i interface{}, k string) ([]string, []error) {
v, ok := i.(string)
if !ok {
return nil, []error{fmt.Errorf("expected type of %s to be string", k)}
}
if ok := r.MatchString(v); !ok {
if message != "" {
return nil, []error{fmt.Errorf("invalid value for %s (%s)", k, message)}
}
return nil, []error{fmt.Errorf("expected value of %s to match regular expression %q, got %v", k, r, i)}
}
return nil, nil
}
}В рамках вебинара и презентации мы разобрали как создать свой собственный провайдер на примере кофемашины. Также вот официальная документация о создании провайдера: https://learn.hashicorp.com/collections/terraform/providers.
- Проделайте все шаги создания провайдера.
- В виде результата приложение ссылку на исходный код.
- Попробуйте скомпилировать провайдер, если получится то приложите снимок экрана с командой и результатом компиляции.
Будет выполнена позже... без необходимости проверки