{"id":76005,"date":"2024-09-07T11:18:25","date_gmt":"2024-09-07T07:48:25","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/aws-iam-database-authentication-with-ef-core-4e04\/"},"modified":"2024-09-07T11:18:25","modified_gmt":"2024-09-07T07:48:25","slug":"aws-iam-database-authentication-with-ef-core-4e04","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/aws-iam-database-authentication-with-ef-core-4e04\/","title":{"rendered":"\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 AWS IAM \u0628\u0627 EF Core"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang AWS Aurora (\u0647\u0645 MySQL \u0648 \u0647\u0645 Postgres) \u0648 MariaDB \u0627\u062c\u0627\u0632\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a IAM \u0631\u0627 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u062f\u0627\u0631\u06cc\u062f. \u062f\u0631 \u0639\u0648\u0636\u060c \u0627\u0632 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 IAM \u0628\u0627 EF Core \u0648 Aurora Postgres \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639\u060c \u0628\u0627\u06cc\u062f \u0686\u0646\u062f \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0631\u0639\u0627\u06cc\u062a \u06a9\u0646\u06cc\u062f:<\/p>\n<p>\u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 IAM Authentication \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Aurora Postgres.<br \/>\n\u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 IAM \u0628\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<br \/>\nAWS CLI \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062e\u0637 \u0645\u0634\u06cc IAM \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648 \u0627\u0633\u062a:<\/p>\n<p>{<br \/>\n   &#8220;Version&#8221;: &#8220;2012-10-17&#8221;,<br \/>\n   &#8220;Statement&#8221;: [<br \/>\n      {<br \/>\n         &#8220;Effect&#8221;: &#8220;Allow&#8221;,<br \/>\n         &#8220;Action&#8221;: [<br \/>\n             &#8220;rds-db:connect&#8221;<br \/>\n         ],<br \/>\n         &#8220;Resource&#8221;: [<br \/>\n             &#8220;arn:aws:rds-db:[region]:[account-id]:dbuser:[db-cluster-resourceId]\/[db-user-name]&#8221;<br \/>\n         ]\n      }<br \/>\n   ]\n}<\/p>\n[region]  \u0645\u0646\u0637\u0642\u0647 AWS \u0628\u0631\u0627\u06cc \u062e\u0648\u0634\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u06cc\u06a9 \u0645\u0646\u0637\u0642\u0647 \u0627\u0633\u062a us-east-2.<br \/>\n[account-id]  \u0634\u0645\u0627\u0631\u0647 \u062d\u0633\u0627\u0628 AWS \u0628\u0631\u0627\u06cc \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0634\u0645\u0627\u0631\u0647 \u062d\u0633\u0627\u0628 \u0627\u0633\u062a 1234567890.<br \/>\n[db-cluster-resourceId]  \u0634\u0646\u0627\u0633\u0647 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0634\u0646\u0627\u0633\u0647 \u0627\u0633\u062a cluster-ABCDEFGHIJKL01234.<br \/>\n[db-user-name]  \u0646\u0627\u0645 \u062d\u0633\u0627\u0628 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a IAM \u0627\u0633\u062a.<\/p>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0627\u0631\u06cc\u0645\u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 IAM \u062e\u0648\u062f \u0645\u062a\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a (\u0645\u0627 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 postgres \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0632\u06cc\u0631:<\/p>\n<p>CREATE DATABASE tasksmanager<br \/>\nWITH<br \/>\nENCODING = &#8216;UTF8&#8217;;<\/p>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0627\u06cc\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u062f\u06cc\u062f:<\/p>\n<p>CREATE TABLE tasks(<br \/>\n  id UUID PRIMARY KEY,<br \/>\n  name VARCHAR(255)<br \/>\n);<\/p>\n<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647:<\/p>\n<p>CREATE USER db_iam_user;<br \/>\nGRANT rds_iam TO db_iam_user;<br \/>\nGRANT postgres TO db_iam_user;<\/p>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 API .NET ASP Core Web \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc NuGet \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>AWSSDK.RDS.<br \/>\nNpgsql.EntityFrameworkCore.PostgreSQL.<br \/>\nEFCore.NamingConventions.<\/p>\n<p>\u062f\u0631 \u0645\u0627 appsetting.json\u060c \u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 a \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 ConnectionString \u062f\u0627\u0631\u0627\u06cc\u06cc:<\/p>\n<p>{<br \/>\n  &#8220;Logging&#8221;: {<br \/>\n    &#8220;LogLevel&#8221;: {<br \/>\n      &#8220;Default&#8221;: &#8220;Information&#8221;,<br \/>\n      &#8220;Microsoft.AspNetCore&#8221;: &#8220;Warning&#8221;<br \/>\n    }<br \/>\n  },<br \/>\n  &#8220;AllowedHosts&#8221;: &#8220;*&#8221;,<br \/>\n  &#8220;ConnectionString&#8221;: &#8220;host=[aurora-database-endpoint];Database=tasksmanager;Username=db_iam_user;SSL Mode=Require;TrustServerCertificate=true&#8221;<br \/>\n}<\/p>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0627 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>    public class Task<br \/>\n    {<br \/>\n        public Guid Id { get; set; }<br \/>\n        public string Name { get; set; }<\/p>\n<p>        private Task()<br \/>\n        {<\/p>\n<p>        }<\/p>\n<p>        public Task(string name)<br \/>\n        {<br \/>\n            Id = Guid.NewGuid();<br \/>\n            Name = name;<br \/>\n        }<br \/>\n    }<\/p>\n<p>\u0628\u0627 \u0622\u0646\u060c \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 DbContext \u06a9\u0644\u0627\u0633:<\/p>\n<p>    public class ApplicationDbContext : DbContext<br \/>\n    {<br \/>\n        public DbSet&lt;Task&gt; Tasks { get; set; }<\/p>\n<p>        public ApplicationDbContext(DbContextOptions options) : base(options)<br \/>\n        {<\/p>\n<p>        }<br \/>\n    }<\/p>\n<p>\u062d\u0627\u0644\u0627 \u06cc\u06a9 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f ServiceCollectionExtensions.cs \u0641\u0627\u06cc\u0644 \u0627\u06cc\u0646\u062c\u0627 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u062c\u0627\u062f\u0648 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f:<\/p>\n<p>    public static class ServiceCollectionExtensions<br \/>\n    {<br \/>\n        public static IServiceCollection AddPostgreSQL(this IServiceCollection services, IConfiguration configuration)<br \/>\n        {<br \/>\n            services.AddDbContext&lt;ApplicationDbContext&gt;(options =&gt;<br \/>\n            {<br \/>\n                var connectionString = configuration[&#8220;ConnectionString&#8221;];<br \/>\n                options.UseNpgsql(connectionString, npgsqlOption =&gt; { npgsqlOption.UseAwsIamAuthentication(); });<br \/>\n                options.UseLowerCaseNamingConvention();<br \/>\n            });<br \/>\n            return services;<br \/>\n        }<\/p>\n<p>        public static NpgsqlDbContextOptionsBuilder UseAwsIamAuthentication(this NpgsqlDbContextOptionsBuilder optionsBuilder)<br \/>\n        {<br \/>\n            optionsBuilder.ProvidePasswordCallback(RequestAwsIamAuthToken);<br \/>\n            return optionsBuilder;<br \/>\n        }<\/p>\n<p>        static string RequestAwsIamAuthToken(string host, int port, string database, string username)<br \/>\n        {<br \/>\n            return RDSAuthTokenGenerator.GenerateAuthToken(host, port, username);<br \/>\n        }<br \/>\n    }<\/p>\n<p>\u0633\u067e\u0633 \u062e\u0637 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u062e\u0637 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f Program.cs \u0641\u0627\u06cc\u0644:<\/p>\n<p>builder.Services.AddPostgreSQL(builder.Configuration);<\/p>\n<p>\u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648 \u067e\u0627\u0633\u062e \u0645\u0627 \u0686\u0646\u062f \u0645\u062f\u0644 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>    public class RegisterTaskCommand<br \/>\n    {<br \/>\n        public string Name { get; set; }<br \/>\n    }<\/p>\n<p>    public class ListTasksResult<br \/>\n    {<br \/>\n        public Guid Id { get; set; }<br \/>\n        public string Name { get; set; }<br \/>\n    }<\/p>\n<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0627 TaskController.cs \u0641\u0627\u06cc\u0644:<\/p>\n<p>    [ApiController]\n    [Route(&#8220;[controller]&#8221;)]\n    public class TasksController : ControllerBase<br \/>\n    {<br \/>\n        private readonly ApplicationDbContext _context;<br \/>\n        public TasksController(ApplicationDbContext context)<br \/>\n        {<br \/>\n            _context = context;<br \/>\n        }<\/p>\n<p>        [HttpGet()]\n        public Task&lt;ListTasksResult[]&gt; ListTasks()<br \/>\n        {<br \/>\n            return _context.Tasks.Select(t =&gt; new ListTasksResult() { Id = t.Id, Name = t.Name }).ToArrayAsync();<br \/>\n        }<\/p>\n<p>        [HttpPost()]\n        public async Task&lt;Guid&gt; RegisterTask(RegisterTaskCommand command)<br \/>\n        {<br \/>\n            var task = new Task(command.Name);<br \/>\n            _context.Tasks.Add(task);<br \/>\n            await _context.SaveChangesAsync();<br \/>\n            return task.Id;<br \/>\n        }<br \/>\n    }<\/p>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u062a\u0635\u0627\u0644 \u0628\u062f\u0648\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627 \u0648 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n<p>AWS Aurora (\u0647\u0645 MySQL \u0648 \u0647\u0645 Postgres) \u0648 MariaDB \u0627\u062c\u0627\u0632\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a IAM \u0631\u0627 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u062f\u0627\u0631\u06cc\u062f. \u062f\u0631 \u0639\u0648\u0636\u060c \u0627\u0632 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u067e\u0633\u062a\u060c \u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 \u0646\u062d\u0648\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 IAM \u0628\u0627 EF Core \u0648 Aurora Postgres \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n<p>\u0642\u0628\u0644 \u0627\u0632 \u0634\u0631\u0648\u0639\u060c \u0628\u0627\u06cc\u062f \u0686\u0646\u062f \u067e\u06cc\u0634 \u0646\u06cc\u0627\u0632 \u0631\u0627 \u0631\u0639\u0627\u06cc\u062a \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\n<p>\u0641\u0639\u0627\u0644 \u06a9\u0631\u062f\u0646 IAM Authentication \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 Aurora Postgres.<\/p>\n<\/li>\n<li>\n<p>\u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 IAM \u0628\u0627 \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f.<\/p>\n<\/li>\n<li>\n<p>AWS CLI \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0635\u0648\u0631\u062a \u0645\u062d\u0644\u06cc \u062a\u0646\u0638\u06cc\u0645 \u06a9\u0646\u06cc\u062f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0627\u0648\u0644\u06cc\u0646 \u0642\u062f\u0645 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u062e\u0637 \u0645\u0634\u06cc IAM \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0627\u0644\u06af\u0648 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n   <\/span><span class=\"nl\">\"Version\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"2012-10-17\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n   <\/span><span class=\"nl\">\"Statement\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n      <\/span><span class=\"p\">{<\/span><span class=\"w\">\n         <\/span><span class=\"nl\">\"Effect\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Allow\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n         <\/span><span class=\"nl\">\"Action\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n             <\/span><span class=\"s2\">\"rds-db:connect\"<\/span><span class=\"w\">\n         <\/span><span class=\"p\">],<\/span><span class=\"w\">\n         <\/span><span class=\"nl\">\"Resource\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">[<\/span><span class=\"w\">\n             <\/span><span class=\"s2\">\"arn:aws:rds-db:[region]:[account-id]:dbuser:[db-cluster-resourceId]\/[db-user-name]\"<\/span><span class=\"w\">\n         <\/span><span class=\"p\">]<\/span><span class=\"w\">\n      <\/span><span class=\"p\">}<\/span><span class=\"w\">\n   <\/span><span class=\"p\">]<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<\/div>\n<ul>\n<li>\n<p><code>[region]<\/code>  \u0645\u0646\u0637\u0642\u0647 AWS \u0628\u0631\u0627\u06cc \u062e\u0648\u0634\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u06cc\u06a9 \u0645\u0646\u0637\u0642\u0647 \u0627\u0633\u062a <code>us-east-2<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>[account-id]<\/code>  \u0634\u0645\u0627\u0631\u0647 \u062d\u0633\u0627\u0628 AWS \u0628\u0631\u0627\u06cc \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0634\u0645\u0627\u0631\u0647 \u062d\u0633\u0627\u0628 \u0627\u0633\u062a <code>1234567890<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>[db-cluster-resourceId]<\/code>  \u0634\u0646\u0627\u0633\u0647 \u06a9\u0644\u0627\u0633\u062a\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647 \u0627\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u0634\u0646\u0627\u0633\u0647 \u0627\u0633\u062a <code>cluster-ABCDEFGHIJKL01234<\/code>.<\/p>\n<\/li>\n<li>\n<p><code>[db-user-name]<\/code>  \u0646\u0627\u0645 \u062d\u0633\u0627\u0628 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a IAM \u0627\u0633\u062a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0647\u0646\u06af\u0627\u0645\u06cc \u06a9\u0647 \u0622\u0646 \u0631\u0627 \u062f\u0627\u0631\u06cc\u0645\u060c \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 IAM \u062e\u0648\u062f \u0645\u062a\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0645\u0631\u062d\u0644\u0647 \u0628\u0639\u062f\u06cc \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0627\u0633\u062a (\u0645\u0627 \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>postgres<\/code> \u06a9\u0627\u0631\u0628\u0631 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u0632\u06cc\u0631:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">DATABASE<\/span> <span class=\"n\">tasksmanager<\/span>\n<span class=\"k\">WITH<\/span> \n<span class=\"k\">ENCODING<\/span> <span class=\"o\">=<\/span> <span class=\"s1\">'UTF8'<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u0633\u067e\u0633 \u06cc\u06a9 \u062c\u062f\u0648\u0644 \u062f\u0631 \u062f\u0627\u062e\u0644 \u0627\u06cc\u0646 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062c\u062f\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">TABLE<\/span> <span class=\"n\">tasks<\/span><span class=\"p\">(<\/span>\n  <span class=\"n\">id<\/span> <span class=\"n\">UUID<\/span> <span class=\"k\">PRIMARY<\/span> <span class=\"k\">KEY<\/span><span class=\"p\">,<\/span>\n  <span class=\"n\">name<\/span> <span class=\"nb\">VARCHAR<\/span><span class=\"p\">(<\/span><span class=\"mi\">255<\/span><span class=\"p\">)<\/span>\n<span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a \u06a9\u0627\u0631\u0628\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight sql\"><code><span class=\"k\">CREATE<\/span> <span class=\"k\">USER<\/span> <span class=\"n\">db_iam_user<\/span><span class=\"p\">;<\/span> \n<span class=\"k\">GRANT<\/span> <span class=\"n\">rds_iam<\/span> <span class=\"k\">TO<\/span> <span class=\"n\">db_iam_user<\/span><span class=\"p\">;<\/span>\n<span class=\"k\">GRANT<\/span> <span class=\"n\">postgres<\/span> <span class=\"k\">TO<\/span> <span class=\"n\">db_iam_user<\/span><span class=\"p\">;<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u06a9\u0646\u0648\u0646 \u06cc\u06a9 \u0628\u0631\u0646\u0627\u0645\u0647 API .NET ASP Core Web \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc \u06a9\u0646\u06cc\u0645. \u0628\u0633\u062a\u0647 \u0647\u0627\u06cc NuGet \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u0622\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<ul>\n<li>\n<p>AWSSDK.RDS.<\/p>\n<\/li>\n<li>\n<p>Npgsql.EntityFrameworkCore.PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>EFCore.NamingConventions.<\/p>\n<\/li>\n<\/ul>\n<p>\u062f\u0631 \u0645\u0627 <code>appsetting.json<\/code>\u060c \u0645\u0627 \u0642\u0635\u062f \u062f\u0627\u0631\u06cc\u0645 a \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u0645 <code>ConnectionString<\/code> \u062f\u0627\u0631\u0627\u06cc\u06cc:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight json\"><code><span class=\"p\">{<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"Logging\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n    <\/span><span class=\"nl\">\"LogLevel\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"p\">{<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"Default\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Information\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n      <\/span><span class=\"nl\">\"Microsoft.AspNetCore\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"Warning\"<\/span><span class=\"w\">\n    <\/span><span class=\"p\">}<\/span><span class=\"w\">\n  <\/span><span class=\"p\">},<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"AllowedHosts\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"*\"<\/span><span class=\"p\">,<\/span><span class=\"w\">\n  <\/span><span class=\"nl\">\"ConnectionString\"<\/span><span class=\"p\">:<\/span><span class=\"w\"> <\/span><span class=\"s2\">\"host=[aurora-database-endpoint];Database=tasksmanager;Username=db_iam_user;SSL Mode=Require;TrustServerCertificate=true\"<\/span><span class=\"w\">\n<\/span><span class=\"p\">}<\/span><span class=\"w\">\n<\/span><\/code><\/pre>\n<\/div>\n<p>\u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0628\u0627 \u0645\u062d\u062a\u0648\u0627\u06cc \u0632\u06cc\u0631 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">Task<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">Guid<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n\n        <span class=\"k\">private<\/span> <span class=\"nf\">Task<\/span><span class=\"p\">()<\/span>\n        <span class=\"p\">{<\/span>\n\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"nf\">Task<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">name<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">Id<\/span> <span class=\"p\">=<\/span> <span class=\"n\">Guid<\/span><span class=\"p\">.<\/span><span class=\"nf\">NewGuid<\/span><span class=\"p\">();<\/span>\n            <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"n\">name<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0627 \u0622\u0646\u060c \u0645\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u062e\u0648\u062f \u0631\u0627 \u0627\u06cc\u062c\u0627\u062f \u06a9\u0646\u06cc\u0645 <code>DbContext<\/code> \u06a9\u0644\u0627\u0633:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">ApplicationDbContext<\/span> <span class=\"p\">:<\/span> <span class=\"n\">DbContext<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">DbSet<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Task<\/span><span class=\"p\">&gt;<\/span> <span class=\"n\">Tasks<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"nf\">ApplicationDbContext<\/span><span class=\"p\">(<\/span><span class=\"n\">DbContextOptions<\/span> <span class=\"n\">options<\/span><span class=\"p\">)<\/span> <span class=\"p\">:<\/span> <span class=\"k\">base<\/span><span class=\"p\">(<\/span><span class=\"n\">options<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062d\u0627\u0644\u0627 \u06cc\u06a9 \u0631\u0627 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>ServiceCollectionExtensions.cs<\/code> \u0641\u0627\u06cc\u0644 \u0627\u06cc\u0646\u062c\u0627 \u062c\u0627\u06cc\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647 \u062c\u0627\u062f\u0648 \u0627\u062a\u0641\u0627\u0642 \u0645\u06cc \u0627\u0641\u062a\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>    <span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">ServiceCollectionExtensions<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"n\">IServiceCollection<\/span> <span class=\"nf\">AddPostgreSQL<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"n\">IServiceCollection<\/span> <span class=\"n\">services<\/span><span class=\"p\">,<\/span> <span class=\"n\">IConfiguration<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">services<\/span><span class=\"p\">.<\/span><span class=\"n\">AddDbContext<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ApplicationDbContext<\/span><span class=\"p\">&gt;(<\/span><span class=\"n\">options<\/span> <span class=\"p\">=&gt;<\/span>\n            <span class=\"p\">{<\/span>\n                <span class=\"kt\">var<\/span> <span class=\"n\">connectionString<\/span> <span class=\"p\">=<\/span> <span class=\"n\">configuration<\/span><span class=\"p\">[<\/span><span class=\"s\">\"ConnectionString\"<\/span><span class=\"p\">];<\/span>\n                <span class=\"n\">options<\/span><span class=\"p\">.<\/span><span class=\"nf\">UseNpgsql<\/span><span class=\"p\">(<\/span><span class=\"n\">connectionString<\/span><span class=\"p\">,<\/span> <span class=\"n\">npgsqlOption<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"p\">{<\/span> <span class=\"n\">npgsqlOption<\/span><span class=\"p\">.<\/span><span class=\"nf\">UseAwsIamAuthentication<\/span><span class=\"p\">();<\/span> <span class=\"p\">});<\/span>\n                <span class=\"n\">options<\/span><span class=\"p\">.<\/span><span class=\"nf\">UseLowerCaseNamingConvention<\/span><span class=\"p\">();<\/span>\n            <span class=\"p\">});<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">services<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">public<\/span> <span class=\"k\">static<\/span> <span class=\"n\">NpgsqlDbContextOptionsBuilder<\/span> <span class=\"nf\">UseAwsIamAuthentication<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span> <span class=\"n\">NpgsqlDbContextOptionsBuilder<\/span> <span class=\"n\">optionsBuilder<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">optionsBuilder<\/span><span class=\"p\">.<\/span><span class=\"nf\">ProvidePasswordCallback<\/span><span class=\"p\">(<\/span><span class=\"n\">RequestAwsIamAuthToken<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">optionsBuilder<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"k\">static<\/span> <span class=\"kt\">string<\/span> <span class=\"nf\">RequestAwsIamAuthToken<\/span><span class=\"p\">(<\/span><span class=\"kt\">string<\/span> <span class=\"n\">host<\/span><span class=\"p\">,<\/span> <span class=\"kt\">int<\/span> <span class=\"n\">port<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">database<\/span><span class=\"p\">,<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">username<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">RDSAuthTokenGenerator<\/span><span class=\"p\">.<\/span><span class=\"nf\">GenerateAuthToken<\/span><span class=\"p\">(<\/span><span class=\"n\">host<\/span><span class=\"p\">,<\/span> <span class=\"n\">port<\/span><span class=\"p\">,<\/span> <span class=\"n\">username<\/span><span class=\"p\">);<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0633\u067e\u0633 \u062e\u0637 \u0632\u06cc\u0631 \u0631\u0627 \u0628\u0647 \u062e\u0637 \u062e\u0648\u062f \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f <code>Program.cs<\/code> \u0641\u0627\u06cc\u0644:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Services<\/span><span class=\"p\">.<\/span><span class=\"nf\">AddPostgreSQL<\/span><span class=\"p\">(<\/span><span class=\"n\">builder<\/span><span class=\"p\">.<\/span><span class=\"n\">Configuration<\/span><span class=\"p\">);<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0631\u0627\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648 \u067e\u0627\u0633\u062e \u0645\u0627 \u0686\u0646\u062f \u0645\u062f\u0644 \u0627\u0636\u0627\u0641\u0647 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">RegisterTaskCommand<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">ListTasksResult<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">Guid<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n        <span class=\"k\">public<\/span> <span class=\"kt\">string<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">{<\/span> <span class=\"k\">get<\/span><span class=\"p\">;<\/span> <span class=\"k\">set<\/span><span class=\"p\">;<\/span> <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0648 \u062f\u0631 \u0646\u0647\u0627\u06cc\u062a\u060c \u0645\u0627 <code>TaskController.cs<\/code> \u0641\u0627\u06cc\u0644:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight csharp\"><code>    <span class=\"p\">[<\/span><span class=\"n\">ApiController<\/span><span class=\"p\">]<\/span>\n    <span class=\"p\">[<\/span><span class=\"nf\">Route<\/span><span class=\"p\">(<\/span><span class=\"s\">\"[controller]\"<\/span><span class=\"p\">)]<\/span>\n    <span class=\"k\">public<\/span> <span class=\"k\">class<\/span> <span class=\"nc\">TasksController<\/span> <span class=\"p\">:<\/span> <span class=\"n\">ControllerBase<\/span>\n    <span class=\"p\">{<\/span>\n        <span class=\"k\">private<\/span> <span class=\"k\">readonly<\/span> <span class=\"n\">ApplicationDbContext<\/span> <span class=\"n\">_context<\/span><span class=\"p\">;<\/span>\n        <span class=\"k\">public<\/span> <span class=\"nf\">TasksController<\/span><span class=\"p\">(<\/span><span class=\"n\">ApplicationDbContext<\/span> <span class=\"n\">context<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"n\">_context<\/span> <span class=\"p\">=<\/span> <span class=\"n\">context<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"p\">[<\/span><span class=\"nf\">HttpGet<\/span><span class=\"p\">()]<\/span>\n        <span class=\"k\">public<\/span> <span class=\"n\">Task<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">ListTasksResult<\/span><span class=\"p\">[<\/span><span class=\"k\">]&gt;<\/span> <span class=\"nf\">ListTasks<\/span><span class=\"p\">()<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">_context<\/span><span class=\"p\">.<\/span><span class=\"n\">Tasks<\/span><span class=\"p\">.<\/span><span class=\"nf\">Select<\/span><span class=\"p\">(<\/span><span class=\"n\">t<\/span> <span class=\"p\">=&gt;<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">ListTasksResult<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span> <span class=\"n\">Id<\/span> <span class=\"p\">=<\/span> <span class=\"n\">t<\/span><span class=\"p\">.<\/span><span class=\"n\">Id<\/span><span class=\"p\">,<\/span> <span class=\"n\">Name<\/span> <span class=\"p\">=<\/span> <span class=\"n\">t<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span> <span class=\"p\">}).<\/span><span class=\"nf\">ToArrayAsync<\/span><span class=\"p\">();<\/span>\n        <span class=\"p\">}<\/span>\n\n        <span class=\"p\">[<\/span><span class=\"nf\">HttpPost<\/span><span class=\"p\">()]<\/span>\n        <span class=\"k\">public<\/span> <span class=\"k\">async<\/span> <span class=\"n\">Task<\/span><span class=\"p\">&lt;<\/span><span class=\"n\">Guid<\/span><span class=\"p\">&gt;<\/span> <span class=\"nf\">RegisterTask<\/span><span class=\"p\">(<\/span><span class=\"n\">RegisterTaskCommand<\/span> <span class=\"n\">command<\/span><span class=\"p\">)<\/span>\n        <span class=\"p\">{<\/span>\n            <span class=\"kt\">var<\/span> <span class=\"n\">task<\/span> <span class=\"p\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nf\">Task<\/span><span class=\"p\">(<\/span><span class=\"n\">command<\/span><span class=\"p\">.<\/span><span class=\"n\">Name<\/span><span class=\"p\">);<\/span>\n            <span class=\"n\">_context<\/span><span class=\"p\">.<\/span><span class=\"n\">Tasks<\/span><span class=\"p\">.<\/span><span class=\"nf\">Add<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">);<\/span>\n            <span class=\"k\">await<\/span> <span class=\"n\">_context<\/span><span class=\"p\">.<\/span><span class=\"nf\">SaveChangesAsync<\/span><span class=\"p\">();<\/span>\n            <span class=\"k\">return<\/span> <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"n\">Id<\/span><span class=\"p\">;<\/span>\n        <span class=\"p\">}<\/span>\n    <span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0631\u0646\u0627\u0645\u0647 \u062e\u0648\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u06a9\u0646\u06cc\u062f \u0648 \u0627\u062a\u0635\u0627\u0644 \u0628\u062f\u0648\u0646 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u0631\u0627 \u0628\u0627 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u062e\u0648\u062f \u0622\u0632\u0645\u0627\u06cc\u0634 \u06a9\u0646\u06cc\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u062a\u0645\u0627\u0645 \u06a9\u062f\u0647\u0627 \u0648 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0647\u0627\u06cc \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0631\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang AWS Aurora (\u0647\u0645 MySQL \u0648 \u0647\u0645 Postgres) \u0648 MariaDB \u0627\u062c\u0627\u0632\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a IAM \u0631\u0627 \u0645\u06cc \u062f\u0647\u0646\u062f. \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0627\u06cc\u0646 \u0631\u0648\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a\u060c \u0647\u0646\u06af\u0627\u0645 \u0627\u062a\u0635\u0627\u0644 \u0628\u0647 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u0646\u06cc\u0627\u0632\u06cc \u0628\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u062f\u0627\u0631\u06cc\u062f. \u062f\u0631 \u0639\u0648\u0636\u060c \u0627\u0632 \u06cc\u06a9 \u0646\u0634\u0627\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u06cc\u062f. \u062f\u0631 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-76005","post","type-post","status-publish","format-standard","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76005","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=76005"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/76005\/revisions"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=76005"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=76005"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=76005"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}