Развертывание AWS-сервера без лямбда-приложений с помощью AmazonServerlessApplicationRepositoryClient не работает? - PullRequest
0 голосов
/ 22 октября 2018

Я хочу развернуть проект ASP.Net Core Web Application через консольное приложение ac #.Это означает, что я пытаюсь создать серверное лямбда-приложение на AWS без AWS Toolkit или команды CLI.Я хочу сделать это с помощью AWS SDK.
Для этого я добавил ниже Nugets:

  • AWSSDK.ServerlessApplicationRepository
  • AWSSDK.Core
  • AWSSDK.Lambda

На первом этапе я делаю пакет с помощью команды msbuild.Затем заархивируйте и загрузите на S3 bucket, и на последнем этапе я запускаю код нижеОн не показывает никаких ошибок, но его нет в моем списке функций.

        AmazonServerlessApplicationRepositoryClient clie = new AmazonServerlessApplicationRepositoryClient("AKIAJQVBDUUDGLXOEKYA", "HdoCIeKqtnKYVXB6y/HHnK6mTD2G556jqAp+bk3e", RegionEndpoint.EUWest1);
        CreateApplicationRequest createApplicationRequestObject = new CreateApplicationRequest()
        {
            Name = "ApplicationTest",
            Author = "Mike",
            Description = "Mike Desc",
            SourceCodeUrl = "https://region/bucketname/publishfolder/" + packageFileName,

        };
        CreateApplicationResponse createApplicationResponseObject = clie.CreateApplication(createApplicationRequestObject);

Я не могу найти никаких ошибок в объекте CreateApplicationResponse.Также создается свойство статуса объекта CreateApplicationResponse, но я не могу найти новое Lambda-приложение в Lambda-> Application of console.

1 Ответ

0 голосов
/ 06 февраля 2019

Мне пришлось использовать запрос cloudFormation и ответы для развертывания такого проекта.В AWS SDK есть много хороших классов и функций, которые это делают.
Поэтому я разработал несколько методов, которые делают это для меня:

CheckAndFillBucketName();
CheckAndFillStackName();
CheckAndFillRegion();
MakePackage();
ZipPackage(zipPublishFolder, packageFileName);
UploadPackageToS3(zipPublishFolder, packageFileName);
UploadTemplateToS3(packageFileName);
var cloudFormation = new AWSCloudFormation(tempstack, templateUrl);
cloudFormation.CreateCloudFormationOnAWS();

для создания объекта CloudFormation, я создал такой класс, который делает это для меня:

public class AWSCloudFormation
{
    public string StackName { get; set; }
    public string TemplateUrl { get; set; }
    AmazonCloudFormationClient CloudFormationClient;
    public AWSCloudFormation(string stackName, string templateUrl)
    {
        CloudFormationClient = CreateCloudFormationClient();
        StackName = stackName;
        TemplateUrl = templateUrl;
    }

    public AmazonCloudFormationClient CreateCloudFormationClient()
    {
        var amazonCloudFormationConfig = new AmazonCloudFormationConfig
        {
            RegionEndpoint = RegionEndpoint.GetBySystemName(Program.AWSLambdaToolsJsonConfig.Region),
        };

        return new AmazonCloudFormationClient(Program.AccessKey, Program.SecretKey, amazonCloudFormationConfig);
    }

    static Stack GetStack(AmazonCloudFormationClient cloudFormationClient, string name)
    {
        return cloudFormationClient.DescribeStacks(new DescribeStacksRequest { StackName = name }).Stacks.First();
    }

    public void CreateCloudFormationOnAWS()
    {
        try
        {
            Log.Info(Program.LogPath, "Creating Cloud Information");
            var describeStacksRequest = new DescribeStacksRequest();
            var changeSetName = "changeset" + Program.PostfixExpression;
            var changeSetType = ChangeSetType.CREATE;

            if (CheckStackIsExist(CloudFormationClient, StackName))
            {
                changeSetType = ChangeSetType.UPDATE;
            }

            var createChangeSetRequest = new CreateChangeSetRequest
            {
                ChangeSetName = changeSetName,
                StackName = StackName,
                //TemplateBody = ServerlessTemplateBody,
                TemplateURL = TemplateUrl,
                ChangeSetType = changeSetType,
                Capabilities = new List<string> { "CAPABILITY_IAM" },
            };

            var createChangeSetResponse = CloudFormationClient.CreateChangeSet(createChangeSetRequest);

            WaitForChangeSet(CloudFormationClient, StackName, changeSetName);

            var executeChangeSetResponse = CloudFormationClient.ExecuteChangeSet(new ExecuteChangeSetRequest
            {
                ChangeSetName = changeSetName,
                StackName = StackName,

            });

            WaitForStack(CloudFormationClient, StackName);

            var generatedStack = GetStack(CloudFormationClient, StackName);
            Log.Info(Program.LogPath, "Output URL is : " + generatedStack.Outputs.Find(x => x.OutputKey == "ApiURL").OutputValue);
            Log.Info(Program.LogPath, "Creating Cloud Information Finished");
        }
        catch (Exception ex)
        {
            Log.Error(Program.LogPath.FullName, "Creating Cloud Information  Error :   " + ex.Message);
        }
    }

    static void WaitForChangeSet(AmazonCloudFormationClient amazonCloudFormationClient, string stackName, string changeSetName)
    {
        var status = ChangeSetStatus.CREATE_PENDING;
        while (status != ChangeSetStatus.CREATE_COMPLETE)
        {
            var changeSet = amazonCloudFormationClient.DescribeChangeSet(new DescribeChangeSetRequest { StackName = stackName, ChangeSetName = changeSetName });
            status = changeSet.Status;
            Log.Info(Program.LogPath, $"Changeset '{changeSetName}' (In Stack : {stackName}) status is {changeSet.Status}  at {DateTime.Now.TimeOfDay}");
            if (status != ChangeSetStatus.CREATE_COMPLETE) Thread.Sleep(TimeSpan.FromSeconds(10));
        }
    }

    static void WaitForStack(AmazonCloudFormationClient amazonCloudFormationClient, string stackName)
    {
        var stack = GetStack(amazonCloudFormationClient, stackName);
        var status = stack.StackStatus;
        string statusReason = null;
        while (status == StackStatus.CREATE_IN_PROGRESS ||
                status == StackStatus.UPDATE_IN_PROGRESS ||
                status == StackStatus.UPDATE_ROLLBACK_IN_PROGRESS ||
                status == StackStatus.ROLLBACK_IN_PROGRESS ||
                status == StackStatus.UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS ||
                status == StackStatus.UPDATE_COMPLETE_CLEANUP_IN_PROGRESS ||
                status == StackStatus.REVIEW_IN_PROGRESS)
        {

            stack = GetStack(amazonCloudFormationClient, stackName);
            status = stack.StackStatus;
            statusReason = stack.StackStatusReason;
            Log.Info(Program.LogPath, $"Stack '{stackName}' status is {status} because {statusReason} at {DateTime.Now.TimeOfDay}");
            if (status == StackStatus.CREATE_IN_PROGRESS || status == StackStatus.UPDATE_IN_PROGRESS) Thread.Sleep(TimeSpan.FromSeconds(10));
        }

        if (status != StackStatus.CREATE_COMPLETE &&
            status != StackStatus.UPDATE_COMPLETE &&
            status != StackStatus.ROLLBACK_COMPLETE &&
            status != StackStatus.UPDATE_ROLLBACK_COMPLETE)
        {
            var eventsResponse = amazonCloudFormationClient.DescribeStackEvents(new DescribeStackEventsRequest { StackName = stackName });
            throw new FailedToCreateStackException(stackName, RegionEndpoint.GetBySystemName(Program.AWSLambdaToolsJsonConfig.Region), status.Value, statusReason, eventsResponse.StackEvents);
        }
    }

    static bool CheckStackIsExist(AmazonCloudFormationClient amazonCloudFormationClient, string stackName)
    {
        try
        {
            var stack =
            amazonCloudFormationClient.DescribeStacks(new DescribeStacksRequest { StackName = stackName }).Stacks.First();
            if (stack != null)
                return true;
            return false;
        }
        catch
        {
            return false;
        }
    }
}
...