# Домашнее задание к занятию "7.6. Написание собственных провайдеров для Terraform."
Бывает, что
* общедоступная документация по терраформ ресурсам не всегда достоверна,
* в документации не хватает каких-нибудь правил валидации или неточно описаны параметры,
* понадобиться использовать провайдер без официальной документации,
* может возникнуть необходимость написать свой провайдер для системы используемой в ваших проектах.
## Задача 1.
Давайте потренируемся читать исходный код AWS провайдера, который можно склонировать от сюда:
[https://github.com/hashicorp/terraform-provider-aws.git](https://github.com/hashicorp/terraform-provider-aws.git).
Просто найдите нужные ресурсы в исходном коде и ответы на вопросы станут понятны.
1. Найдите, где перечислены все доступные `resource` и `data_source`, приложите ссылку на эти строки в коде на
гитхабе.
1. Для создания очереди сообщений SQS используется ресурс `aws_sqs_queue` у которого есть параметр `name`.
* С каким другим параметром конфликтует `name`? Приложите строчку кода, в которой это указано.
* Какая максимальная длина имени?
* Какому регулярному выражению должно подчиняться имя?
## Ответ 1.
В файле `./aws/provider.go` список всех DataSource
DataSourcesMap: map[string]*schema.Resource{
"aws_acm_certificate": dataSourceAwsAcmCertificate(),
"aws_acmpca_certificate_authority": dataSourceAwsAcmpcaCertificateAuthority(),
"aws_ami": dataSourceAwsAmi(),
"aws_ami_ids": dataSourceAwsAmiIds(),
"aws_api_gateway_api_key": dataSourceAwsApiGatewayApiKey(),
"aws_api_gateway_resource": dataSourceAwsApiGatewayResource(),
"aws_api_gateway_rest_api": dataSourceAwsApiGatewayRestApi(),
"aws_api_gateway_vpc_link": dataSourceAwsApiGatewayVpcLink(),
"aws_arn": dataSourceAwsArn(),
...
удалил 170 строк
...
"aws_servicequotas_service": dataSourceAwsServiceQuotasService(),
"aws_servicequotas_service_quota": dataSourceAwsServiceQuotasServiceQuota(),
"aws_sfn_activity": dataSourceAwsSfnActivity(),
"aws_sfn_state_machine": dataSourceAwsSfnStateMachine(),
"aws_signer_signing_job": dataSourceAwsSignerSigningJob(),
"aws_signer_signing_profile": dataSourceAwsSignerSigningProfile(),
"aws_sns_topic": dataSourceAwsSnsTopic(),
"aws_sqs_queue": dataSourceAwsSqsQueue(),
"aws_ssm_document": dataSourceAwsSsmDocument(),
"aws_ssm_parameter": dataSourceAwsSsmParameter(),
"aws_ssm_patch_baseline": dataSourceAwsSsmPatchBaseline(),
"aws_ssoadmin_instances": dataSourceAwsSsoAdminInstances(),
"aws_ssoadmin_permission_set": dataSourceAwsSsoAdminPermissionSet(),
"aws_storagegateway_local_disk": dataSourceAwsStorageGatewayLocalDisk(),
"aws_subnet": dataSourceAwsSubnet(),
"aws_subnet_ids": dataSourceAwsSubnetIDs(),
Resource:
ResourcesMap: map[string]*schema.Resource{
"aws_accessanalyzer_analyzer": resourceAwsAccessAnalyzerAnalyzer(),
"aws_acm_certificate": resourceAwsAcmCertificate(),
"aws_acm_certificate_validation": resourceAwsAcmCertificateValidation(),
"aws_acmpca_certificate_authority": resourceAwsAcmpcaCertificateAuthority(),
"aws_ami": resourceAwsAmi(),
"aws_ami_copy": resourceAwsAmiCopy(),
"aws_ami_from_instance": resourceAwsAmiFromInstance(),
"aws_ami_launch_permission": resourceAwsAmiLaunchPermission(),
"aws_api_gateway_account": resourceAwsApiGatewayAccount(),
"aws_api_gateway_api_key": resourceAwsApiGatewayApiKey(),
"aws_api_gateway_authorizer": resourceAwsApiGatewayAuthorizer(),
"aws_api_gateway_base_path_mapping": resourceAwsApiGatewayBasePathMapping(),
"aws_api_gateway_client_certificate": resourceAwsApiGatewayClientCertificate(),
"aws_api_gateway_deployment": resourceAwsApiGatewayDeployment(),
"aws_api_gateway_documentation_part": resourceAwsApiGatewayDocumentationPart(),
"aws_api_gateway_documentation_version": resourceAwsApiGatewayDocumentationVersion(),
"aws_api_gateway_domain_name": resourceAwsApiGatewayDomainName(),
"aws_api_gateway_gateway_response": resourceAwsApiGatewayGatewayResponse(),
...
удалил 600 строк
...
"aws_wafv2_regex_pattern_set": resourceAwsWafv2RegexPatternSet(),
"aws_wafv2_rule_group": resourceAwsWafv2RuleGroup(),
"aws_wafv2_web_acl": resourceAwsWafv2WebACL(),
"aws_wafv2_web_acl_association": resourceAwsWafv2WebACLAssociation(),
"aws_wafv2_web_acl_logging_configuration": resourceAwsWafv2WebACLLoggingConfiguration(),
"aws_worklink_fleet": resourceAwsWorkLinkFleet(),
"aws_worklink_website_certificate_authority_association": resourceAwsWorkLinkWebsiteCertificateAuthorityAssociation(),
"aws_workspaces_directory": resourceAwsWorkspacesDirectory(),
"aws_workspaces_workspace": resourceAwsWorkspacesWorkspace(),
"aws_batch_compute_environment": resourceAwsBatchComputeEnvironment(),
"aws_batch_job_definition": resourceAwsBatchJobDefinition(),
"aws_batch_job_queue": resourceAwsBatchJobQueue(),
"aws_pinpoint_app": resourceAwsPinpointApp(),
"aws_pinpoint_adm_channel": resourceAwsPinpointADMChannel(),
"aws_pinpoint_apns_channel": resourceAwsPinpointAPNSChannel(),
"aws_pinpoint_apns_sandbox_channel": resourceAwsPinpointAPNSSandboxChannel(),
"aws_pinpoint_apns_voip_channel": resourceAwsPinpointAPNSVoipChannel(),
"aws_pinpoint_apns_voip_sandbox_channel": resourceAwsPinpointAPNSVoipSandboxChannel(),
"aws_pinpoint_baidu_channel": resourceAwsPinpointBaiduChannel(),
"aws_pinpoint_email_channel": resourceAwsPinpointEmailChannel(),
"aws_pinpoint_event_stream": resourceAwsPinpointEventStream(),
"aws_pinpoint_gcm_channel": resourceAwsPinpointGCMChannel(),
"aws_pinpoint_sms_channel": resourceAwsPinpointSMSChannel(),
"aws_xray_encryption_config": resourceAwsXrayEncryptionConfig(),
"aws_xray_group": resourceAwsXrayGroup(),
"aws_xray_sampling_rule": resourceAwsXraySamplingRule(),
"aws_workspaces_ip_group": resourceAwsWorkspacesIpGroup(),
"aws_alb": resourceAwsLb(),
"aws_lb": resourceAwsLb(),
"aws_alb_listener": resourceAwsLbListener(),
"aws_lb_listener": resourceAwsLbListener(),
"aws_alb_listener_certificate": resourceAwsLbListenerCertificate(),
"aws_lb_listener_certificate": resourceAwsLbListenerCertificate(),
"aws_alb_listener_rule": resourceAwsLbbListenerRule(),
"aws_lb_listener_rule": resourceAwsLbbListenerRule(),
"aws_alb_target_group": resourceAwsLbTargetGroup(),
"aws_lb_target_group": resourceAwsLbTargetGroup(),
"aws_lb_target_group_attachment": resourceAwsLbTargetGroupAttachment(),
2.1. Конфликтует с name_prefix.
"name": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
Computed: true,
ConflictsWith: []string{"name_prefix"},
ValidateFunc: validateSQSQueueName,
},
"name_prefix": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ConflictsWith: []string{"name"},
2.2. Максимальная длина имени - 80 знаков
```
./aws/validators.go:1035:func validateSQSQueueName(v interface{}, k string) (ws []string, errors []error) {
./aws/validators.go-1036- value := v.(string)
./aws/validators.go-1037- if len(value) > 80 {
./aws/validators.go-1038- errors = append(errors, fmt.Errorf("%q cannot be longer than 80 characters", k))
./aws/validators.go-1039- }
```
2.3. Подчиняется regexp - `^[0-9A-Za-z-_]+(\.fifo)?$`
```
./aws/validators.go:1035:func validateSQSQueueName(v interface{}, k string) (ws []string, errors []error) {
./aws/validators.go-1036- value := v.(string)
./aws/validators.go-1041- if !regexp.MustCompile(`^[0-9A-Za-z-_]+(\.fifo)?$`).MatchString(value) {
./aws/validators.go-1042- errors = append(errors, fmt.Errorf("only alphanumeric characters and hyphens allowed in %q", k))
./aws/validators.go-1043- }
./aws/validators.go-1044- return
./aws/validators.go-1045-}
```
## Задача 2. (Не обязательно)
В рамках вебинара и презентации мы разобрали как создать свой собственный провайдер на примере кофемашины.
Также вот официальная документация о создании провайдера:
[https://learn.hashicorp.com/collections/terraform/providers](https://learn.hashicorp.com/collections/terraform/providers).
1. Проделайте все шаги создания провайдера.
2. В виде результата приложение ссылку на исходный код.
3. Попробуйте скомпилировать провайдер, если получится то приложите снимок экрана с командой и результатом компиляции.
Обязательно сделаю чуть позже - очень стараюсь нагнать до того как закроют возможность сдачи ДЗ