# Домашнее задание к занятию "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. Попробуйте скомпилировать провайдер, если получится то приложите снимок экрана с командой и результатом компиляции. Обязательно сделаю чуть позже - очень стараюсь нагнать до того как закроют возможность сдачи ДЗ