Learn the basics of AWS Support with an AWS SDK
The following code examples show how to:
Get and display available services and severity levels for cases.
Create a support case using a selected service, category, and severity level.
Get and display a list of open cases for the current day.
Add an attachment set and a communication to the new case.
Describe the new attachment and communication for the case.
Resolve the case.
Get and display a list of resolved cases for the current day.
- .NET
-
- AWS SDK for .NET
-
Note
There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Code Examples Repository
. Run an interactive scenario at a command prompt.
/// <summary> /// Hello AWS Support example. /// </summary> public static class SupportCaseScenario { /* Before running this .NET code example, set up your development environment, including your credentials. To use the AWS Support API, you must have one of the following AWS Support plans: Business, Enterprise On-Ramp, or Enterprise. This .NET example performs the following tasks: 1. Get and display services. Select a service from the list. 2. Select a category from the selected service. 3. Get and display severity levels and select a severity level from the list. 4. Create a support case using the selected service, category, and severity level. 5. Get and display a list of open support cases for the current day. 6. Create an attachment set with a sample text file to add to the case. 7. Add a communication with the attachment to the support case. 8. List the communications of the support case. 9. Describe the attachment set. 10. Resolve the support case. 11. Get a list of resolved cases for the current day. */ private static SupportWrapper _supportWrapper = null!; static async Task Main(string[] args) { // Set up dependency injection for the AWS Support service. // Use your AWS profile name, or leave it blank to use the default profile. using var host = Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => logging.AddFilter("System", LogLevel.Debug) .AddFilter<DebugLoggerProvider>("Microsoft", LogLevel.Information) .AddFilter<ConsoleLoggerProvider>("Microsoft", LogLevel.Trace)) .ConfigureServices((_, services) => services.AddAWSService<IAmazonAWSSupport>(new AWSOptions() { Profile = "default" }) .AddTransient<SupportWrapper>() ) .Build(); var logger = LoggerFactory.Create(builder => { builder.AddConsole(); }).CreateLogger(typeof(SupportCaseScenario)); _supportWrapper = host.Services.GetRequiredService<SupportWrapper>(); Console.WriteLine(new string('-', 80)); Console.WriteLine("Welcome to the AWS Support case example scenario."); Console.WriteLine(new string('-', 80)); try { var apiSupported = await _supportWrapper.VerifySubscription(); if (!apiSupported) { logger.LogError("You must have a Business, Enterprise On-Ramp, or Enterprise Support " + "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these examples."); return; } var service = await DisplayAndSelectServices(); var category = DisplayAndSelectCategories(service); var severityLevel = await DisplayAndSelectSeverity(); var caseId = await CreateSupportCase(service, category, severityLevel); await DescribeTodayOpenCases(); var attachmentSetId = await CreateAttachmentSet(); await AddCommunicationToCase(attachmentSetId, caseId); var attachmentId = await ListCommunicationsForCase(caseId); await DescribeCaseAttachment(attachmentId); await ResolveCase(caseId); await DescribeTodayResolvedCases(); Console.WriteLine(new string('-', 80)); Console.WriteLine("AWS Support case example scenario complete."); Console.WriteLine(new string('-', 80)); } catch (Exception ex) { logger.LogError(ex, "There was a problem executing the scenario."); } } /// <summary> /// List some available services from AWS Support, and select a service for the example. /// </summary> /// <returns>The selected service.</returns> private static async Task<Service> DisplayAndSelectServices() { Console.WriteLine(new string('-', 80)); var services = await _supportWrapper.DescribeServices(); Console.WriteLine($"AWS Support client returned {services.Count} services."); Console.WriteLine($"1. Displaying first 10 services:"); for (int i = 0; i < 10 && i < services.Count; i++) { Console.WriteLine($"\t{i + 1}. {services[i].Name}"); } var choiceNumber = 0; while (choiceNumber < 1 || choiceNumber > services.Count) { Console.WriteLine( "Select an example support service by entering a number from the preceding list:"); var choice = Console.ReadLine(); Int32.TryParse(choice, out choiceNumber); } Console.WriteLine(new string('-', 80)); return services[choiceNumber - 1]; } /// <summary> /// List the available categories for a service and select a category for the example. /// </summary> /// <param name="service">Service to use for displaying categories.</param> /// <returns>The selected category.</returns> private static Category DisplayAndSelectCategories(Service service) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"2. Available support categories for Service \"{service.Name}\":"); for (int i = 0; i < service.Categories.Count; i++) { Console.WriteLine($"\t{i + 1}. {service.Categories[i].Name}"); } var choiceNumber = 0; while (choiceNumber < 1 || choiceNumber > service.Categories.Count) { Console.WriteLine( "Select an example support category by entering a number from the preceding list:"); var choice = Console.ReadLine(); Int32.TryParse(choice, out choiceNumber); } Console.WriteLine(new string('-', 80)); return service.Categories[choiceNumber - 1]; } /// <summary> /// List available severity levels from AWS Support, and select a level for the example. /// </summary> /// <returns>The selected severity level.</returns> private static async Task<SeverityLevel> DisplayAndSelectSeverity() { Console.WriteLine(new string('-', 80)); var severityLevels = await _supportWrapper.DescribeSeverityLevels(); Console.WriteLine($"3. Get and display available severity levels:"); for (int i = 0; i < 10 && i < severityLevels.Count; i++) { Console.WriteLine($"\t{i + 1}. {severityLevels[i].Name}"); } var choiceNumber = 0; while (choiceNumber < 1 || choiceNumber > severityLevels.Count) { Console.WriteLine( "Select an example severity level by entering a number from the preceding list:"); var choice = Console.ReadLine(); Int32.TryParse(choice, out choiceNumber); } Console.WriteLine(new string('-', 80)); return severityLevels[choiceNumber - 1]; } /// <summary> /// Create an example support case. /// </summary> /// <param name="service">Service to use for the new case.</param> /// <param name="category">Category to use for the new case.</param> /// <param name="severity">Severity to use for the new case.</param> /// <returns>The caseId of the new support case.</returns> private static async Task<string> CreateSupportCase(Service service, Category category, SeverityLevel severity) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"4. Create an example support case" + $" with the following settings:" + $" \n\tService: {service.Name}, Category: {category.Name} " + $"and Severity Level: {severity.Name}."); var caseId = await _supportWrapper.CreateCase(service.Code, category.Code, severity.Code, "Example case for testing, ignore.", "This is my example support case."); Console.WriteLine($"\tNew case created with ID {caseId}"); Console.WriteLine(new string('-', 80)); return caseId; } /// <summary> /// List open cases for the current day. /// </summary> /// <returns>Async task.</returns> private static async Task DescribeTodayOpenCases() { Console.WriteLine($"5. List the open support cases for the current day."); // Describe the cases. If it is empty, try again and allow time for the new case to appear. List<CaseDetails> currentOpenCases = null!; while (currentOpenCases == null || currentOpenCases.Count == 0) { Thread.Sleep(1000); currentOpenCases = await _supportWrapper.DescribeCases( new List<string>(), null, false, false, DateTime.UtcNow.Date, DateTime.UtcNow); } foreach (var openCase in currentOpenCases) { Console.WriteLine($"\tCase: {openCase.CaseId} created {openCase.TimeCreated}"); } Console.WriteLine(new string('-', 80)); } /// <summary> /// Create an attachment set for a support case. /// </summary> /// <returns>The attachment set id.</returns> private static async Task<string> CreateAttachmentSet() { Console.WriteLine(new string('-', 80)); Console.WriteLine($"6. Create an attachment set for a support case."); var fileName = "example_attachment.txt"; // Create the file if it does not already exist. if (!File.Exists(fileName)) { await using StreamWriter sw = File.CreateText(fileName); await sw.WriteLineAsync( "This is a sample file for attachment to a support case."); } await using var ms = new MemoryStream(await File.ReadAllBytesAsync(fileName)); var attachmentSetId = await _supportWrapper.AddAttachmentToSet( ms, fileName); Console.WriteLine($"\tNew attachment set created with id: \n\t{attachmentSetId.Substring(0, 65)}..."); Console.WriteLine(new string('-', 80)); return attachmentSetId; } /// <summary> /// Add an attachment set and communication to a case. /// </summary> /// <param name="attachmentSetId">Id of the attachment set.</param> /// <param name="caseId">Id of the case to receive the attachment set.</param> /// <returns>Async task.</returns> private static async Task AddCommunicationToCase(string attachmentSetId, string caseId) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"7. Add attachment set and communication to {caseId}."); await _supportWrapper.AddCommunicationToCase( caseId, "This is an example communication added to a support case.", attachmentSetId); Console.WriteLine($"\tNew attachment set and communication added to {caseId}"); Console.WriteLine(new string('-', 80)); } /// <summary> /// List the communications for a case. /// </summary> /// <param name="caseId">Id of the case to describe.</param> /// <returns>An attachment id.</returns> private static async Task<string> ListCommunicationsForCase(string caseId) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"8. List communications for case {caseId}."); var communications = await _supportWrapper.DescribeCommunications(caseId); var attachmentId = ""; foreach (var communication in communications) { Console.WriteLine( $"\tCommunication created on: {communication.TimeCreated} has {communication.AttachmentSet.Count} attachments."); if (communication.AttachmentSet.Any()) { attachmentId = communication.AttachmentSet.First().AttachmentId; } } Console.WriteLine(new string('-', 80)); return attachmentId; } /// <summary> /// Describe an attachment by id. /// </summary> /// <param name="attachmentId">Id of the attachment to describe.</param> /// <returns>Async task.</returns> private static async Task DescribeCaseAttachment(string attachmentId) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"9. Describe the attachment set."); var attachment = await _supportWrapper.DescribeAttachment(attachmentId); var data = Encoding.ASCII.GetString(attachment.Data.ToArray()); Console.WriteLine($"\tAttachment includes {attachment.FileName} with data: \n\t{data}"); Console.WriteLine(new string('-', 80)); } /// <summary> /// Resolve the support case. /// </summary> /// <param name="caseId">Id of the case to resolve.</param> /// <returns>Async task.</returns> private static async Task ResolveCase(string caseId) { Console.WriteLine(new string('-', 80)); Console.WriteLine($"10. Resolve case {caseId}."); var status = await _supportWrapper.ResolveCase(caseId); Console.WriteLine($"\tCase {caseId} has final status {status}"); Console.WriteLine(new string('-', 80)); } /// <summary> /// List resolved cases for the current day. /// </summary> /// <returns>Async Task.</returns> private static async Task DescribeTodayResolvedCases() { Console.WriteLine(new string('-', 80)); Console.WriteLine($"11. List the resolved support cases for the current day."); var currentCases = await _supportWrapper.DescribeCases( new List<string>(), null, false, true, DateTime.UtcNow.Date, DateTime.UtcNow); foreach (var currentCase in currentCases) { if (currentCase.Status == "resolved") { Console.WriteLine( $"\tCase: {currentCase.CaseId}: status {currentCase.Status}"); } } Console.WriteLine(new string('-', 80)); } }
Wrapper methods used by the scenario for AWS Support actions.
/// <summary> /// Wrapper methods to use AWS Support for working with support cases. /// </summary> public class SupportWrapper { private readonly IAmazonAWSSupport _amazonSupport; public SupportWrapper(IAmazonAWSSupport amazonSupport) { _amazonSupport = amazonSupport; } /// <summary> /// Get the descriptions of AWS services. /// </summary> /// <param name="name">Optional language for services. /// Currently Chinese (“zh”), English ("en"), Japanese ("ja") and Korean (“ko”) are supported.</param> /// <returns>The list of AWS service descriptions.</returns> public async Task<List<Service>> DescribeServices(string language = "en") { var response = await _amazonSupport.DescribeServicesAsync( new DescribeServicesRequest() { Language = language }); return response.Services; } /// <summary> /// Get the descriptions of support severity levels. /// </summary> /// <param name="name">Optional language for severity levels. /// Currently Chinese (“zh”), English ("en"), Japanese ("ja") and Korean (“ko”) are supported.</param> /// <returns>The list of support severity levels.</returns> public async Task<List<SeverityLevel>> DescribeSeverityLevels(string language = "en") { var response = await _amazonSupport.DescribeSeverityLevelsAsync( new DescribeSeverityLevelsRequest() { Language = language }); return response.SeverityLevels; } /// <summary> /// Create a new support case. /// </summary> /// <param name="serviceCode">Service code for the new case.</param> /// <param name="categoryCode">Category for the new case.</param> /// <param name="severityCode">Severity code for the new case.</param> /// <param name="subject">Subject of the new case.</param> /// <param name="body">Body text of the new case.</param> /// <param name="language">Optional language support for your case. /// Currently Chinese (“zh”), English ("en"), Japanese ("ja") and Korean (“ko”) are supported.</param> /// <param name="attachmentSetId">Optional Id for an attachment set for the new case.</param> /// <param name="issueType">Optional issue type for the new case. Options are "customer-service" or "technical".</param> /// <returns>The caseId of the new support case.</returns> public async Task<string> CreateCase(string serviceCode, string categoryCode, string severityCode, string subject, string body, string language = "en", string? attachmentSetId = null, string issueType = "customer-service") { var response = await _amazonSupport.CreateCaseAsync( new CreateCaseRequest() { ServiceCode = serviceCode, CategoryCode = categoryCode, SeverityCode = severityCode, Subject = subject, Language = language, AttachmentSetId = attachmentSetId, IssueType = issueType, CommunicationBody = body }); return response.CaseId; } /// <summary> /// Add an attachment to a set, or create a new attachment set if one does not exist. /// </summary> /// <param name="data">The data for the attachment.</param> /// <param name="fileName">The file name for the attachment.</param> /// <param name="attachmentSetId">Optional setId for the attachment. Creates a new attachment set if empty.</param> /// <returns>The setId of the attachment.</returns> public async Task<string> AddAttachmentToSet(MemoryStream data, string fileName, string? attachmentSetId = null) { var response = await _amazonSupport.AddAttachmentsToSetAsync( new AddAttachmentsToSetRequest { AttachmentSetId = attachmentSetId, Attachments = new List<Attachment> { new Attachment { Data = data, FileName = fileName } } }); return response.AttachmentSetId; } /// <summary> /// Get description of a specific attachment. /// </summary> /// <param name="attachmentId">Id of the attachment, usually fetched by describing the communications of a case.</param> /// <returns>The attachment object.</returns> public async Task<Attachment> DescribeAttachment(string attachmentId) { var response = await _amazonSupport.DescribeAttachmentAsync( new DescribeAttachmentRequest() { AttachmentId = attachmentId }); return response.Attachment; } /// <summary> /// Add communication to a case, including optional attachment set ID and CC email addresses. /// </summary> /// <param name="caseId">Id for the support case.</param> /// <param name="body">Body text of the communication.</param> /// <param name="attachmentSetId">Optional Id for an attachment set.</param> /// <param name="ccEmailAddresses">Optional list of CC email addresses.</param> /// <returns>True if successful.</returns> public async Task<bool> AddCommunicationToCase(string caseId, string body, string? attachmentSetId = null, List<string>? ccEmailAddresses = null) { var response = await _amazonSupport.AddCommunicationToCaseAsync( new AddCommunicationToCaseRequest() { CaseId = caseId, CommunicationBody = body, AttachmentSetId = attachmentSetId, CcEmailAddresses = ccEmailAddresses }); return response.Result; } /// <summary> /// Describe the communications for a case, optionally with a date filter. /// </summary> /// <param name="caseId">The ID of the support case.</param> /// <param name="afterTime">The optional start date for a filtered search.</param> /// <param name="beforeTime">The optional end date for a filtered search.</param> /// <returns>The list of communications for the case.</returns> public async Task<List<Communication>> DescribeCommunications(string caseId, DateTime? afterTime = null, DateTime? beforeTime = null) { var results = new List<Communication>(); var paginateCommunications = _amazonSupport.Paginators.DescribeCommunications( new DescribeCommunicationsRequest() { CaseId = caseId, AfterTime = afterTime?.ToString("s"), BeforeTime = beforeTime?.ToString("s") }); // Get the entire list using the paginator. await foreach (var communications in paginateCommunications.Communications) { results.Add(communications); } return results; } /// <summary> /// Get case details for a list of case ids, optionally with date filters. /// </summary> /// <param name="caseIds">The list of case IDs.</param> /// <param name="displayId">Optional display ID.</param> /// <param name="includeCommunication">True to include communication. Defaults to true.</param> /// <param name="includeResolvedCases">True to include resolved cases. Defaults to false.</param> /// <param name="afterTime">The optional start date for a filtered search.</param> /// <param name="beforeTime">The optional end date for a filtered search.</param> /// <param name="language">Optional language support for your case. /// Currently Chinese (“zh”), English ("en"), Japanese ("ja") and Korean (“ko”) are supported.</param> /// <returns>A list of CaseDetails.</returns> public async Task<List<CaseDetails>> DescribeCases(List<string> caseIds, string? displayId = null, bool includeCommunication = true, bool includeResolvedCases = false, DateTime? afterTime = null, DateTime? beforeTime = null, string language = "en") { var results = new List<CaseDetails>(); var paginateCases = _amazonSupport.Paginators.DescribeCases( new DescribeCasesRequest() { CaseIdList = caseIds, DisplayId = displayId, IncludeCommunications = includeCommunication, IncludeResolvedCases = includeResolvedCases, AfterTime = afterTime?.ToString("s"), BeforeTime = beforeTime?.ToString("s"), Language = language }); // Get the entire list using the paginator. await foreach (var cases in paginateCases.Cases) { results.Add(cases); } return results; } /// <summary> /// Resolve a support case by caseId. /// </summary> /// <param name="caseId">Id for the support case.</param> /// <returns>The final status of the case after resolving.</returns> public async Task<string> ResolveCase(string caseId) { var response = await _amazonSupport.ResolveCaseAsync( new ResolveCaseRequest() { CaseId = caseId }); return response.FinalCaseStatus; } /// <summary> /// Verify the support level for AWS Support API access. /// </summary> /// <returns>True if the subscription level supports API access.</returns> public async Task<bool> VerifySubscription() { try { var response = await _amazonSupport.DescribeServicesAsync( new DescribeServicesRequest() { Language = "en" }); return response.HttpStatusCode == HttpStatusCode.OK; } catch (Amazon.AWSSupport.AmazonAWSSupportException ex) { if (ex.ErrorCode == "SubscriptionRequiredException") { return false; } else throw; } } }
-
For API details, see the following topics in AWS SDK for .NET API Reference.
-
- Java
-
- SDK for Java 2.x
-
Note
There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Code Examples Repository
. Run various AWS Support operations.
import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.support.SupportClient; import software.amazon.awssdk.services.support.model.AddAttachmentsToSetResponse; import software.amazon.awssdk.services.support.model.AddCommunicationToCaseRequest; import software.amazon.awssdk.services.support.model.AddCommunicationToCaseResponse; import software.amazon.awssdk.services.support.model.Attachment; import software.amazon.awssdk.services.support.model.AttachmentDetails; import software.amazon.awssdk.services.support.model.CaseDetails; import software.amazon.awssdk.services.support.model.Category; import software.amazon.awssdk.services.support.model.Communication; import software.amazon.awssdk.services.support.model.CreateCaseRequest; import software.amazon.awssdk.services.support.model.CreateCaseResponse; import software.amazon.awssdk.services.support.model.DescribeAttachmentRequest; import software.amazon.awssdk.services.support.model.DescribeAttachmentResponse; import software.amazon.awssdk.services.support.model.DescribeCasesRequest; import software.amazon.awssdk.services.support.model.DescribeCasesResponse; import software.amazon.awssdk.services.support.model.DescribeCommunicationsRequest; import software.amazon.awssdk.services.support.model.DescribeCommunicationsResponse; import software.amazon.awssdk.services.support.model.DescribeServicesRequest; import software.amazon.awssdk.services.support.model.DescribeServicesResponse; import software.amazon.awssdk.services.support.model.DescribeSeverityLevelsRequest; import software.amazon.awssdk.services.support.model.DescribeSeverityLevelsResponse; import software.amazon.awssdk.services.support.model.ResolveCaseRequest; import software.amazon.awssdk.services.support.model.ResolveCaseResponse; import software.amazon.awssdk.services.support.model.Service; import software.amazon.awssdk.services.support.model.SeverityLevel; import software.amazon.awssdk.services.support.model.SupportException; import software.amazon.awssdk.services.support.model.AddAttachmentsToSetRequest; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; /** * Before running this Java (v2) code example, set up your development * environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html * * In addition, you must have the AWS Business Support Plan to use the AWS * Support Java API. For more information, see: * * https://aws.amazon.com/premiumsupport/plans/ * * This Java example performs the following tasks: * * 1. Gets and displays available services. * 2. Gets and displays severity levels. * 3. Creates a support case by using the selected service, category, and * severity level. * 4. Gets a list of open cases for the current day. * 5. Creates an attachment set with a generated file. * 6. Adds a communication with the attachment to the support case. * 7. Lists the communications of the support case. * 8. Describes the attachment set included with the communication. * 9. Resolves the support case. * 10. Gets a list of resolved cases for the current day. */ public class SupportScenario { public static final String DASHES = new String(new char[80]).replace("\0", "-"); public static void main(String[] args) { final String usage = """ Usage: <fileAttachment>Where: fileAttachment - The file can be a simple saved .txt file to use as an email attachment.\s """; if (args.length != 1) { System.out.println(usage); System.exit(1); } String fileAttachment = args[0]; Region region = Region.US_WEST_2; SupportClient supportClient = SupportClient.builder() .region(region) .build(); System.out.println(DASHES); System.out.println("***** Welcome to the AWS Support case example scenario."); System.out.println(DASHES); System.out.println(DASHES); System.out.println("1. Get and display available services."); List<String> sevCatList = displayServices(supportClient); System.out.println(DASHES); System.out.println(DASHES); System.out.println("2. Get and display Support severity levels."); String sevLevel = displaySevLevels(supportClient); System.out.println(DASHES); System.out.println(DASHES); System.out.println("3. Create a support case using the selected service, category, and severity level."); String caseId = createSupportCase(supportClient, sevCatList, sevLevel); if (caseId.compareTo("") == 0) { System.out.println("A support case was not successfully created!"); System.exit(1); } else System.out.println("Support case " + caseId + " was successfully created!"); System.out.println(DASHES); System.out.println(DASHES); System.out.println("4. Get open support cases."); getOpenCase(supportClient); System.out.println(DASHES); System.out.println(DASHES); System.out.println("5. Create an attachment set with a generated file to add to the case."); String attachmentSetId = addAttachment(supportClient, fileAttachment); System.out.println("The Attachment Set id value is" + attachmentSetId); System.out.println(DASHES); System.out.println(DASHES); System.out.println("6. Add communication with the attachment to the support case."); addAttachSupportCase(supportClient, caseId, attachmentSetId); System.out.println(DASHES); System.out.println(DASHES); System.out.println("7. List the communications of the support case."); String attachId = listCommunications(supportClient, caseId); System.out.println("The Attachment id value is" + attachId); System.out.println(DASHES); System.out.println(DASHES); System.out.println("8. Describe the attachment set included with the communication."); describeAttachment(supportClient, attachId); System.out.println(DASHES); System.out.println(DASHES); System.out.println("9. Resolve the support case."); resolveSupportCase(supportClient, caseId); System.out.println(DASHES); System.out.println(DASHES); System.out.println("10. Get a list of resolved cases for the current day."); getResolvedCase(supportClient); System.out.println(DASHES); System.out.println(DASHES); System.out.println("***** This Scenario has successfully completed"); System.out.println(DASHES); } public static void getResolvedCase(SupportClient supportClient) { try { // Specify the start and end time. Instant now = Instant.now(); java.time.LocalDate.now(); Instant yesterday = now.minus(1, ChronoUnit.DAYS); DescribeCasesRequest describeCasesRequest = DescribeCasesRequest.builder() .maxResults(30) .afterTime(yesterday.toString()) .beforeTime(now.toString()) .includeResolvedCases(true) .build(); DescribeCasesResponse response = supportClient.describeCases(describeCasesRequest); List<CaseDetails> cases = response.cases(); for (CaseDetails sinCase : cases) { if (sinCase.status().compareTo("resolved") == 0) System.out.println("The case status is " + sinCase.status()); } } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } } public static void resolveSupportCase(SupportClient supportClient, String caseId) { try { ResolveCaseRequest caseRequest = ResolveCaseRequest.builder() .caseId(caseId) .build(); ResolveCaseResponse response = supportClient.resolveCase(caseRequest); System.out.println("The status of case " + caseId + " is " + response.finalCaseStatus()); } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } } public static void describeAttachment(SupportClient supportClient, String attachId) { try { DescribeAttachmentRequest attachmentRequest = DescribeAttachmentRequest.builder() .attachmentId(attachId) .build(); DescribeAttachmentResponse response = supportClient.describeAttachment(attachmentRequest); System.out.println("The name of the file is " + response.attachment().fileName()); } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } } public static String listCommunications(SupportClient supportClient, String caseId) { try { String attachId = null; DescribeCommunicationsRequest communicationsRequest = DescribeCommunicationsRequest.builder() .caseId(caseId) .maxResults(10) .build(); DescribeCommunicationsResponse response = supportClient.describeCommunications(communicationsRequest); List<Communication> communications = response.communications(); for (Communication comm : communications) { System.out.println("the body is: " + comm.body()); // Get the attachment id value. List<AttachmentDetails> attachments = comm.attachmentSet(); for (AttachmentDetails detail : attachments) { attachId = detail.attachmentId(); } } return attachId; } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } return ""; } public static void addAttachSupportCase(SupportClient supportClient, String caseId, String attachmentSetId) { try { AddCommunicationToCaseRequest caseRequest = AddCommunicationToCaseRequest.builder() .caseId(caseId) .attachmentSetId(attachmentSetId) .communicationBody("Please refer to attachment for details.") .build(); AddCommunicationToCaseResponse response = supportClient.addCommunicationToCase(caseRequest); if (response.result()) System.out.println("You have successfully added a communication to an AWS Support case"); else System.out.println("There was an error adding the communication to an AWS Support case"); } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } } public static String addAttachment(SupportClient supportClient, String fileAttachment) { try { File myFile = new File(fileAttachment); InputStream sourceStream = new FileInputStream(myFile); SdkBytes sourceBytes = SdkBytes.fromInputStream(sourceStream); Attachment attachment = Attachment.builder() .fileName(myFile.getName()) .data(sourceBytes) .build(); AddAttachmentsToSetRequest setRequest = AddAttachmentsToSetRequest.builder() .attachments(attachment) .build(); AddAttachmentsToSetResponse response = supportClient.addAttachmentsToSet(setRequest); return response.attachmentSetId(); } catch (SupportException | FileNotFoundException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } return ""; } public static void getOpenCase(SupportClient supportClient) { try { // Specify the start and end time. Instant now = Instant.now(); java.time.LocalDate.now(); Instant yesterday = now.minus(1, ChronoUnit.DAYS); DescribeCasesRequest describeCasesRequest = DescribeCasesRequest.builder() .maxResults(20) .afterTime(yesterday.toString()) .beforeTime(now.toString()) .build(); DescribeCasesResponse response = supportClient.describeCases(describeCasesRequest); List<CaseDetails> cases = response.cases(); for (CaseDetails sinCase : cases) { System.out.println("The case status is " + sinCase.status()); System.out.println("The case Id is " + sinCase.caseId()); System.out.println("The case subject is " + sinCase.subject()); } } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } } public static String createSupportCase(SupportClient supportClient, List<String> sevCatList, String sevLevel) { try { String serviceCode = sevCatList.get(0); String caseCat = sevCatList.get(1); CreateCaseRequest caseRequest = CreateCaseRequest.builder() .categoryCode(caseCat.toLowerCase()) .serviceCode(serviceCode.toLowerCase()) .severityCode(sevLevel.toLowerCase()) .communicationBody("Test issue with " + serviceCode.toLowerCase()) .subject("Test case, please ignore") .language("en") .issueType("technical") .build(); CreateCaseResponse response = supportClient.createCase(caseRequest); return response.caseId(); } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } return ""; } public static String displaySevLevels(SupportClient supportClient) { try { DescribeSeverityLevelsRequest severityLevelsRequest = DescribeSeverityLevelsRequest.builder() .language("en") .build(); DescribeSeverityLevelsResponse response = supportClient.describeSeverityLevels(severityLevelsRequest); List<SeverityLevel> severityLevels = response.severityLevels(); String levelName = null; for (SeverityLevel sevLevel : severityLevels) { System.out.println("The severity level name is: " + sevLevel.name()); if (sevLevel.name().compareTo("High") == 0) levelName = sevLevel.name(); } return levelName; } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } return ""; } // Return a List that contains a Service name and Category name. public static List<String> displayServices(SupportClient supportClient) { try { DescribeServicesRequest servicesRequest = DescribeServicesRequest.builder() .language("en") .build(); DescribeServicesResponse response = supportClient.describeServices(servicesRequest); String serviceCode = null; String catName = null; List<String> sevCatList = new ArrayList<>(); List<Service> services = response.services(); System.out.println("Get the first 10 services"); int index = 1; for (Service service : services) { if (index == 11) break; System.out.println("The Service name is: " + service.name()); if (service.name().compareTo("Account") == 0) serviceCode = service.code(); // Get the Categories for this service. List<Category> categories = service.categories(); for (Category cat : categories) { System.out.println("The category name is: " + cat.name()); if (cat.name().compareTo("Security") == 0) catName = cat.name(); } index++; } // Push the two values to the list. sevCatList.add(serviceCode); sevCatList.add(catName); return sevCatList; } catch (SupportException e) { System.out.println(e.getLocalizedMessage()); System.exit(1); } return null; } }
-
For API details, see the following topics in AWS SDK for Java 2.x API Reference.
-
- JavaScript
-
- SDK for JavaScript (v3)
-
Note
There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Code Examples Repository
. Run an interactive scenario in the terminal.
import { AddAttachmentsToSetCommand, AddCommunicationToCaseCommand, CreateCaseCommand, DescribeAttachmentCommand, DescribeCasesCommand, DescribeCommunicationsCommand, DescribeServicesCommand, DescribeSeverityLevelsCommand, ResolveCaseCommand, SupportClient, } from "@aws-sdk/client-support"; import * as inquirer from "@inquirer/prompts"; import { retry } from "@aws-doc-sdk-examples/lib/utils/util-timers.js"; const wrapText = (text, char = "=") => { const rule = char.repeat(80); return `${rule}\n ${text}\n${rule}\n`; }; const client = new SupportClient({ region: "us-east-1" }); // Verify that the account has a Support plan. export const verifyAccount = async () => { const command = new DescribeServicesCommand({}); try { await client.send(command); } catch (err) { if (err.name === "SubscriptionRequiredException") { throw new Error( "You must be subscribed to the AWS Support plan to use this feature.", ); } throw err; } }; /** * Select a service from the list returned from DescribeServices. */ export const getService = async () => { const { services } = await client.send(new DescribeServicesCommand({})); const selectedService = await inquirer.select({ message: "Select a service. Your support case will be created for this service. The list of services is truncated for readability.", choices: services.slice(0, 10).map((s) => ({ name: s.name, value: s })), }); return selectedService; }; /** * @param {{ categories: import('@aws-sdk/client-support').Category[]}} service */ export const getCategory = async (service) => { const selectedCategory = await inquirer.select({ message: "Select a category.", choices: service.categories.map((c) => ({ name: c.name, value: c })), }); return selectedCategory; }; // Get the available severity levels for the account. export const getSeverityLevel = async () => { const command = new DescribeSeverityLevelsCommand({}); const { severityLevels } = await client.send(command); const selectedSeverityLevel = await inquirer.select({ message: "Select a severity level.", choices: severityLevels.map((s) => ({ name: s.name, value: s })), }); return selectedSeverityLevel; }; /** * Create a new support case * @param {{ * selectedService: import('@aws-sdk/client-support').Service * selectedCategory: import('@aws-sdk/client-support').Category * selectedSeverityLevel: import('@aws-sdk/client-support').SeverityLevel * }} selections * @returns */ export const createCase = async ({ selectedService, selectedCategory, selectedSeverityLevel, }) => { const command = new CreateCaseCommand({ subject: "IGNORE: Test case", communicationBody: "This is a test. Please ignore.", serviceCode: selectedService.code, categoryCode: selectedCategory.code, severityCode: selectedSeverityLevel.code, }); const { caseId } = await client.send(command); return caseId; }; // Get a list of open support cases created today. export const getTodaysOpenCases = async () => { const d = new Date(); const startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()); const command = new DescribeCasesCommand({ includeCommunications: false, afterTime: startOfToday.toISOString(), }); const { cases } = await client.send(command); if (cases.length === 0) { throw new Error( "Unexpected number of cases. Expected more than 0 open cases.", ); } return cases; }; // Create an attachment set. export const createAttachmentSet = async () => { const command = new AddAttachmentsToSetCommand({ attachments: [ { fileName: "example.txt", data: new TextEncoder().encode("some example text"), }, ], }); const { attachmentSetId } = await client.send(command); return attachmentSetId; }; export const linkAttachmentSetToCase = async (attachmentSetId, caseId) => { const command = new AddCommunicationToCaseCommand({ attachmentSetId, caseId, communicationBody: "Adding attachment set to case.", }); await client.send(command); }; // Get all communications for a support case. export const getCommunications = async (caseId) => { const command = new DescribeCommunicationsCommand({ caseId, }); const { communications } = await client.send(command); return communications; }; /** * @param {import('@aws-sdk/client-support').Communication[]} communications */ export const getFirstAttachment = (communications) => { const firstCommWithAttachment = communications.find( (c) => c.attachmentSet.length > 0, ); return firstCommWithAttachment?.attachmentSet[0].attachmentId; }; // Get an attachment. export const getAttachment = async (attachmentId) => { const command = new DescribeAttachmentCommand({ attachmentId, }); const { attachment } = await client.send(command); return attachment; }; // Resolve the case matching the given case ID. export const resolveCase = async (caseId) => { const shouldResolve = await inquirer.confirm({ message: `Do you want to resolve ${caseId}?`, }); if (shouldResolve) { const command = new ResolveCaseCommand({ caseId: caseId, }); await client.send(command); return true; } return false; }; /** * Find a specific case in the list of provided cases by case ID. * If the case is not found, and the results are paginated, continue * paging through the results. * @param {{ * caseId: string, * cases: import('@aws-sdk/client-support').CaseDetails[] * nextToken: string * }} options * @returns */ export const findCase = async ({ caseId, cases, nextToken }) => { const foundCase = cases.find((c) => c.caseId === caseId); if (foundCase) { return foundCase; } if (nextToken) { const response = await client.send( new DescribeCasesCommand({ nextToken, includeResolvedCases: true, }), ); return findCase({ caseId, cases: response.cases, nextToken: response.nextToken, }); } throw new Error(`${caseId} not found.`); }; // Get all cases created today. export const getTodaysResolvedCases = async (caseIdToWaitFor) => { const d = new Date("2023-01-18"); const startOfToday = new Date(d.getFullYear(), d.getMonth(), d.getDate()); const command = new DescribeCasesCommand({ includeCommunications: false, afterTime: startOfToday.toISOString(), includeResolvedCases: true, }); const { cases, nextToken } = await client.send(command); await findCase({ cases, caseId: caseIdToWaitFor, nextToken }); return cases.filter((c) => c.status === "resolved"); }; const main = async () => { let caseId; try { console.log(wrapText("Welcome to the AWS Support basic usage scenario.")); // Verify that the account is subscribed to support. await verifyAccount(); // Provided a truncated list of services and prompt the user to select one. const selectedService = await getService(); // Provided the categories for the selected service and prompt the user to select one. const selectedCategory = await getCategory(selectedService); // Provide the severity available severity levels for the account and prompt the user to select one. const selectedSeverityLevel = await getSeverityLevel(); // Create a support case. console.log("\nCreating a support case."); caseId = await createCase({ selectedService, selectedCategory, selectedSeverityLevel, }); console.log(`Support case created: ${caseId}`); // Display a list of open support cases created today. const todaysOpenCases = await retry( { intervalInMs: 1000, maxRetries: 15 }, getTodaysOpenCases, ); console.log( `\nOpen support cases created today: ${todaysOpenCases.length}`, ); console.log(todaysOpenCases.map((c) => `${c.caseId}`).join("\n")); // Create an attachment set. console.log("\nCreating an attachment set."); const attachmentSetId = await createAttachmentSet(); console.log(`Attachment set created: ${attachmentSetId}`); // Add the attachment set to the support case. console.log(`\nAdding attachment set to ${caseId}`); await linkAttachmentSetToCase(attachmentSetId, caseId); console.log(`Attachment set added to ${caseId}`); // List the communications for a support case. console.log(`\nListing communications for ${caseId}`); const communications = await getCommunications(caseId); console.log( communications .map( (c) => `Communication created on ${c.timeCreated}. Has ${c.attachmentSet.length} attachments.`, ) .join("\n"), ); // Describe the first attachment. console.log(`\nDescribing attachment ${attachmentSetId}`); const attachmentId = getFirstAttachment(communications); const attachment = await getAttachment(attachmentId); console.log( `Attachment is the file '${ attachment.fileName }' with data: \n${new TextDecoder().decode(attachment.data)}`, ); // Confirm that the support case should be resolved. const isResolved = await resolveCase(caseId); if (isResolved) { // List the resolved cases and include the one previously created. // Resolved cases can take a while to appear. console.log( "\nWaiting for case status to be marked as resolved. This can take some time.", ); const resolvedCases = await retry( { intervalInMs: 20000, maxRetries: 15 }, () => getTodaysResolvedCases(caseId), ); console.log("Resolved cases:"); console.log(resolvedCases.map((c) => c.caseId).join("\n")); } } catch (err) { console.error(err); } };
-
For API details, see the following topics in AWS SDK for JavaScript API Reference.
-
- Kotlin
-
- SDK for Kotlin
-
Note
There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Code Examples Repository
. /** Before running this Kotlin code example, set up your development environment, including your credentials. For more information, see the following documentation topic: https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/setup.html In addition, you must have the AWS Business Support Plan to use the AWS Support Java API. For more information, see: https://aws.amazon.com/premiumsupport/plans/ This Kotlin example performs the following tasks: 1. Gets and displays available services. 2. Gets and displays severity levels. 3. Creates a support case by using the selected service, category, and severity level. 4. Gets a list of open cases for the current day. 5. Creates an attachment set with a generated file. 6. Adds a communication with the attachment to the support case. 7. Lists the communications of the support case. 8. Describes the attachment set included with the communication. 9. Resolves the support case. 10. Gets a list of resolved cases for the current day. */ suspend fun main(args: Array<String>) { val usage = """ Usage: <fileAttachment> Where: fileAttachment - The file can be a simple saved .txt file to use as an email attachment. """ if (args.size != 1) { println(usage) exitProcess(0) } val fileAttachment = args[0] println("***** Welcome to the AWS Support case example scenario.") println("***** Step 1. Get and display available services.") val sevCatList = displayServices() println("***** Step 2. Get and display Support severity levels.") val sevLevel = displaySevLevels() println("***** Step 3. Create a support case using the selected service, category, and severity level.") val caseIdVal = createSupportCase(sevCatList, sevLevel) if (caseIdVal != null) { println("Support case $caseIdVal was successfully created!") } else { println("A support case was not successfully created!") exitProcess(1) } println("***** Step 4. Get open support cases.") getOpenCase() println("***** Step 5. Create an attachment set with a generated file to add to the case.") val attachmentSetId = addAttachment(fileAttachment) println("The Attachment Set id value is $attachmentSetId") println("***** Step 6. Add communication with the attachment to the support case.") addAttachSupportCase(caseIdVal, attachmentSetId) println("***** Step 7. List the communications of the support case.") val attachId = listCommunications(caseIdVal) println("The Attachment id value is $attachId") println("***** Step 8. Describe the attachment set included with the communication.") describeAttachment(attachId) println("***** Step 9. Resolve the support case.") resolveSupportCase(caseIdVal) println("***** Step 10. Get a list of resolved cases for the current day.") getResolvedCase() println("***** This Scenario has successfully completed") } suspend fun getResolvedCase() { // Specify the start and end time. val now = Instant.now() LocalDate.now() val yesterday = now.minus(1, ChronoUnit.DAYS) val describeCasesRequest = DescribeCasesRequest { maxResults = 30 afterTime = yesterday.toString() beforeTime = now.toString() includeResolvedCases = true } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeCases(describeCasesRequest) response.cases?.forEach { sinCase -> println("The case status is ${sinCase.status}") println("The case Id is ${sinCase.caseId}") println("The case subject is ${sinCase.subject}") } } } suspend fun resolveSupportCase(caseIdVal: String) { val caseRequest = ResolveCaseRequest { caseId = caseIdVal } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.resolveCase(caseRequest) println("The status of case $caseIdVal is ${response.finalCaseStatus}") } } suspend fun describeAttachment(attachId: String?) { val attachmentRequest = DescribeAttachmentRequest { attachmentId = attachId } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeAttachment(attachmentRequest) println("The name of the file is ${response.attachment?.fileName}") } } suspend fun listCommunications(caseIdVal: String?): String? { val communicationsRequest = DescribeCommunicationsRequest { caseId = caseIdVal maxResults = 10 } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeCommunications(communicationsRequest) response.communications?.forEach { comm -> println("the body is: " + comm.body) comm.attachmentSet?.forEach { detail -> return detail.attachmentId } } } return "" } suspend fun addAttachSupportCase( caseIdVal: String?, attachmentSetIdVal: String?, ) { val caseRequest = AddCommunicationToCaseRequest { caseId = caseIdVal attachmentSetId = attachmentSetIdVal communicationBody = "Please refer to attachment for details." } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.addCommunicationToCase(caseRequest) if (response.result) { println("You have successfully added a communication to an AWS Support case") } else { println("There was an error adding the communication to an AWS Support case") } } } suspend fun addAttachment(fileAttachment: String): String? { val myFile = File(fileAttachment) val sourceBytes = (File(fileAttachment).readBytes()) val attachmentVal = Attachment { fileName = myFile.name data = sourceBytes } val setRequest = AddAttachmentsToSetRequest { attachments = listOf(attachmentVal) } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.addAttachmentsToSet(setRequest) return response.attachmentSetId } } suspend fun getOpenCase() { // Specify the start and end time. val now = Instant.now() LocalDate.now() val yesterday = now.minus(1, ChronoUnit.DAYS) val describeCasesRequest = DescribeCasesRequest { maxResults = 20 afterTime = yesterday.toString() beforeTime = now.toString() } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeCases(describeCasesRequest) response.cases?.forEach { sinCase -> println("The case status is ${sinCase.status}") println("The case Id is ${sinCase.caseId}") println("The case subject is ${sinCase.subject}") } } } suspend fun createSupportCase( sevCatListVal: List<String>, sevLevelVal: String, ): String? { val serCode = sevCatListVal[0] val caseCategory = sevCatListVal[1] val caseRequest = CreateCaseRequest { categoryCode = caseCategory.lowercase(Locale.getDefault()) serviceCode = serCode.lowercase(Locale.getDefault()) severityCode = sevLevelVal.lowercase(Locale.getDefault()) communicationBody = "Test issue with ${serCode.lowercase(Locale.getDefault())}" subject = "Test case, please ignore" language = "en" issueType = "technical" } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.createCase(caseRequest) return response.caseId } } suspend fun displaySevLevels(): String { var levelName = "" val severityLevelsRequest = DescribeSeverityLevelsRequest { language = "en" } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeSeverityLevels(severityLevelsRequest) response.severityLevels?.forEach { sevLevel -> println("The severity level name is: ${sevLevel.name}") if (sevLevel.name == "High") { levelName = sevLevel.name!! } } return levelName } } // Return a List that contains a Service name and Category name. suspend fun displayServices(): List<String> { var serviceCode = "" var catName = "" val sevCatList = mutableListOf<String>() val servicesRequest = DescribeServicesRequest { language = "en" } SupportClient { region = "us-west-2" }.use { supportClient -> val response = supportClient.describeServices(servicesRequest) println("Get the first 10 services") var index = 1 response.services?.forEach { service -> if (index == 11) { return@forEach } println("The Service name is ${service.name}") if (service.name == "Account") { serviceCode = service.code.toString() } // Get the categories for this service. service.categories?.forEach { cat -> println("The category name is ${cat.name}") if (cat.name == "Security") { catName = cat.name!! } } index++ } } // Push the two values to the list. serviceCode.let { sevCatList.add(it) } catName.let { sevCatList.add(it) } return sevCatList }
-
For API details, see the following topics in AWS SDK for Kotlin API reference.
-
- Python
-
- SDK for Python (Boto3)
-
Note
There's more on GitHub. Find the complete example and learn how to set up and run in the AWS Code Examples Repository
. Run an interactive scenario at a command prompt.
class SupportCasesScenario: """Runs an interactive scenario that shows how to get started using AWS Support.""" def __init__(self, support_wrapper): """ :param support_wrapper: An object that wraps AWS Support actions. """ self.support_wrapper = support_wrapper def display_and_select_service(self): """ Lists support services and prompts the user to select one. :return: The support service selected by the user. """ print("-" * 88) services_list = self.support_wrapper.describe_services("en") print(f"AWS Support client returned {len(services_list)} services.") print("Displaying first 10 services:") service_choices = [svc["name"] for svc in services_list[:10]] selected_index = q.choose( "Select an example support service by entering a number from the preceding list:", service_choices, ) selected_service = services_list[selected_index] print("-" * 88) return selected_service def display_and_select_category(self, service): """ Lists categories for a support service and prompts the user to select one. :param service: The service of the categories. :return: The selected category. """ print("-" * 88) print( f"Available support categories for Service {service['name']} {len(service['categories'])}:" ) categories_choices = [category["name"] for category in service["categories"]] selected_index = q.choose( "Select an example support category by entering a number from the preceding list:", categories_choices, ) selected_category = service["categories"][selected_index] print("-" * 88) return selected_category def display_and_select_severity(self): """ Lists available severity levels and prompts the user to select one. :return: The selected severity level. """ print("-" * 88) severity_levels_list = self.support_wrapper.describe_severity_levels("en") print(f"Available severity levels:") severity_choices = [level["name"] for level in severity_levels_list] selected_index = q.choose( "Select an example severity level by entering a number from the preceding list:", severity_choices, ) selected_severity = severity_levels_list[selected_index] print("-" * 88) return selected_severity def create_example_case(self, service, category, severity_level): """ Creates an example support case with the user's selections. :param service: The service for the new case. :param category: The category for the new case. :param severity_level: The severity level for the new case. :return: The caseId of the new support case. """ print("-" * 88) print(f"Creating new case for service {service['name']}.") case_id = self.support_wrapper.create_case(service, category, severity_level) print(f"\tNew case created with ID {case_id}.") print("-" * 88) return case_id def list_open_cases(self): """ List the open cases for the current day. """ print("-" * 88) print("Let's list the open cases for the current day.") start_time = str(datetime.utcnow().date()) end_time = str(datetime.utcnow().date() + timedelta(days=1)) open_cases = self.support_wrapper.describe_cases(start_time, end_time, False) for case in open_cases: print(f"\tCase: {case['caseId']}: status {case['status']}.") print("-" * 88) def create_attachment_set(self): """ Create an attachment set with a sample file. :return: The attachment set ID of the new attachment set. """ print("-" * 88) print("Creating attachment set with a sample file.") attachment_set_id = self.support_wrapper.add_attachment_to_set() print(f"\tNew attachment set created with ID {attachment_set_id}.") print("-" * 88) return attachment_set_id def add_communication(self, case_id, attachment_set_id): """ Add a communication with an attachment set to the case. :param case_id: The ID of the case for the communication. :param attachment_set_id: The ID of the attachment set to add to the communication. """ print("-" * 88) print(f"Adding a communication and attachment set to the case.") self.support_wrapper.add_communication_to_case(attachment_set_id, case_id) print( f"Added a communication and attachment set {attachment_set_id} to the case {case_id}." ) print("-" * 88) def list_communications(self, case_id): """ List the communications associated with a case. :param case_id: The ID of the case. :return: The attachment ID of an attachment. """ print("-" * 88) print("Let's list the communications for our case.") attachment_id = "" communications = self.support_wrapper.describe_all_case_communications(case_id) for communication in communications: print( f"\tCommunication created on {communication['timeCreated']} " f"has {len(communication['attachmentSet'])} attachments." ) if len(communication["attachmentSet"]) > 0: attachment_id = communication["attachmentSet"][0]["attachmentId"] print("-" * 88) return attachment_id def describe_case_attachment(self, attachment_id): """ Describe an attachment associated with a case. :param attachment_id: The ID of the attachment. """ print("-" * 88) print("Let's list the communications for our case.") attached_file = self.support_wrapper.describe_attachment(attachment_id) print(f"\tAttachment includes file {attached_file}.") print("-" * 88) def resolve_case(self, case_id): """ Shows how to resolve an AWS Support case by its ID. :param case_id: The ID of the case to resolve. """ print("-" * 88) print(f"Resolving case with ID {case_id}.") case_status = self.support_wrapper.resolve_case(case_id) print(f"\tFinal case status is {case_status}.") print("-" * 88) def list_resolved_cases(self): """ List the resolved cases for the current day. """ print("-" * 88) print("Let's list the resolved cases for the current day.") start_time = str(datetime.utcnow().date()) end_time = str(datetime.utcnow().date() + timedelta(days=1)) resolved_cases = self.support_wrapper.describe_cases(start_time, end_time, True) for case in resolved_cases: print(f"\tCase: {case['caseId']}: status {case['status']}.") print("-" * 88) def run_scenario(self): logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") print("-" * 88) print("Welcome to the AWS Support get started with support cases demo.") print("-" * 88) selected_service = self.display_and_select_service() selected_category = self.display_and_select_category(selected_service) selected_severity = self.display_and_select_severity() new_case_id = self.create_example_case( selected_service, selected_category, selected_severity ) wait(10) self.list_open_cases() new_attachment_set_id = self.create_attachment_set() self.add_communication(new_case_id, new_attachment_set_id) new_attachment_id = self.list_communications(new_case_id) self.describe_case_attachment(new_attachment_id) self.resolve_case(new_case_id) wait(10) self.list_resolved_cases() print("\nThanks for watching!") print("-" * 88) if __name__ == "__main__": try: scenario = SupportCasesScenario(SupportWrapper.from_client()) scenario.run_scenario() except Exception: logging.exception("Something went wrong with the demo.")
Define a class that wraps support client actions.
class SupportWrapper: """Encapsulates Support actions.""" def __init__(self, support_client): """ :param support_client: A Boto3 Support client. """ self.support_client = support_client @classmethod def from_client(cls): """ Instantiates this class from a Boto3 client. """ support_client = boto3.client("support") return cls(support_client) def describe_services(self, language): """ Get the descriptions of AWS services available for support for a language. :param language: The language for support services. Currently, only "en" (English) and "ja" (Japanese) are supported. :return: The list of AWS service descriptions. """ try: response = self.support_client.describe_services(language=language) services = response["services"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't get Support services for language %s. Here's why: %s: %s", language, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return services def describe_severity_levels(self, language): """ Get the descriptions of available severity levels for support cases for a language. :param language: The language for support severity levels. Currently, only "en" (English) and "ja" (Japanese) are supported. :return: The list of severity levels. """ try: response = self.support_client.describe_severity_levels(language=language) severity_levels = response["severityLevels"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't get severity levels for language %s. Here's why: %s: %s", language, err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return severity_levels def create_case(self, service, category, severity): """ Create a new support case. :param service: The service to use for the new case. :param category: The category to use for the new case. :param severity: The severity to use for the new case. :return: The caseId of the new case. """ try: response = self.support_client.create_case( subject="Example case for testing, ignore.", serviceCode=service["code"], severityCode=severity["code"], categoryCode=category["code"], communicationBody="Example support case body.", language="en", issueType="customer-service", ) case_id = response["caseId"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't create case. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return case_id def add_attachment_to_set(self): """ Add an attachment to a set, or create a new attachment set if one does not exist. :return: The attachment set ID. """ try: response = self.support_client.add_attachments_to_set( attachments=[ { "fileName": "attachment_file.txt", "data": b"This is a sample file for attachment to a support case.", } ] ) new_set_id = response["attachmentSetId"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't add attachment. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return new_set_id def add_communication_to_case(self, attachment_set_id, case_id): """ Add a communication and an attachment set to a case. :param attachment_set_id: The ID of an existing attachment set. :param case_id: The ID of the case. """ try: self.support_client.add_communication_to_case( caseId=case_id, communicationBody="This is an example communication added to a support case.", attachmentSetId=attachment_set_id, ) except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't add communication. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise def describe_all_case_communications(self, case_id): """ Describe all the communications for a case using a paginator. :param case_id: The ID of the case. :return: The communications for the case. """ try: communications = [] paginator = self.support_client.get_paginator("describe_communications") for page in paginator.paginate(caseId=case_id): communications += page["communications"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't describe communications. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return communications def describe_attachment(self, attachment_id): """ Get information about an attachment by its attachmentID. :param attachment_id: The ID of the attachment. :return: The name of the attached file. """ try: response = self.support_client.describe_attachment( attachmentId=attachment_id ) attached_file = response["attachment"]["fileName"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't get attachment description. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return attached_file def resolve_case(self, case_id): """ Resolve a support case by its caseId. :param case_id: The ID of the case to resolve. :return: The final status of the case. """ try: response = self.support_client.resolve_case(caseId=case_id) final_status = response["finalCaseStatus"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't resolve case. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: return final_status def describe_cases(self, after_time, before_time, resolved): """ Describe support cases over a period of time, optionally filtering by status. :param after_time: The start time to include for cases. :param before_time: The end time to include for cases. :param resolved: True to include resolved cases in the results, otherwise results are open cases. :return: The final status of the case. """ try: cases = [] paginator = self.support_client.get_paginator("describe_cases") for page in paginator.paginate( afterTime=after_time, beforeTime=before_time, includeResolvedCases=resolved, language="en", ): cases += page["cases"] except ClientError as err: if err.response["Error"]["Code"] == "SubscriptionRequiredException": logger.info( "You must have a Business, Enterprise On-Ramp, or Enterprise Support " "plan to use the AWS Support API. \n\tPlease upgrade your subscription to run these " "examples." ) else: logger.error( "Couldn't describe cases. Here's why: %s: %s", err.response["Error"]["Code"], err.response["Error"]["Message"], ) raise else: if resolved: cases = filter(lambda case: case["status"] == "resolved", cases) return cases
-
For API details, see the following topics in AWS SDK for Python (Boto3) API Reference.
-
For a complete list of AWS SDK developer guides and code examples, see Using AWS Support with an AWS SDK. This topic also includes information about getting started and details about previous SDK versions.