Обновление файлов ресурсов с помощью токенов с помощью aws-cdk

Я создал этот стек:

    export class InfrastructureStack extends cdk.Stack {
    constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);


    const bucket = new s3.Bucket(this, "My Hello Website", {
      websiteIndexDocument: 'index.html',
      websiteErrorDocument: 'error.html',
      publicReadAccess: true,
      removalPolicy: cdk.RemovalPolicy.DESTROY
    });

    const api = new apigateway.RestApi(this, "My Endpoint", {
      restApiName: "My rest API name",
      description: "Some cool description"
    });

    const myLambda = new lambda.Function(this, 'My Backend', {
      runtime: lambda.Runtime.NODEJSconst url = URL_PLACEHOLDER;

function foo() {
    let req = new XMLHttpRequest();
    req.open('GET', url , false);

    req.send(null);

    if (req.status == 200) {
        replaceContent(req.response);
    }
}

function replaceContent(content) {
    document.getElementById('content').innerHTML = content;
}
10, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'code')) }); const apiToLambda = new apigateway.LambdaIntegration(myLambda) api.root.addMethod('GET', apiToLambda); updateWebsiteUrl.newUrl(api.url); } }

Последняя строка кода - это моя функция для обновления актива, который будет развернут на S3 как веб-сайт с URL-адресом API, который будет создан во время развертывания. Это простой скрипт Node.js, который заменяет файлы PLACEHOLDER на api.url.
Конечно, во время компиляции CDK не знает, какой будет окончательный адрес конечной точки REST, потому что это происходит во время развертывания, и он обновляет мой URL на что-то вроде:
'https://${Token[TOKEN.26]}.execute-api.${Token[AWS::Region.4]}.${Token[AWS::URLSuffix.1]}/${Token[TOKEN.32]}/;'

Есть ли способ обновить это после интеграции лямбда-выражения с API endpooint после их развертывания?

Я хотел бы использовать модуль @aws-cdk/aws-s3-deployment для развертывания кода во вновь созданном сегменте. Все в одном стеке, поэтому один cdk deploy обновит все, что мне нужно.

Во избежание путаницы. Мой updateWebsiteUrl:

    export function newUrl(newUrl: string): void {

    const scriptPath = path.join(__dirname, '/../../front/');
    const scriptName = 'script.js';

    fs.readFile(scriptPath + scriptName, (err, buf) => {
        let scriptContent : string = buf.toString();

        let newScript = scriptContent.replace('URL_PLACEHOLDER', newUrl);

        fs.writeFile(scriptPath + 'newScript.js', newScript, () => {
            console.log('done writing');
        });
    });
  }

А мой сценарий очень прост:

const url = URL_PLACEHOLDER;

function foo() {
    let req = new XMLHttpRequest();
    req.open('GET', url , false);

    req.send(null);

    if (req.status == 200) {
        replaceContent(req.response);
    }
}

function replaceContent(content) {
    document.getElementById('content').innerHTML = content;
}

person Zychoo    schedule 24.11.2019    source источник
comment
есть ли причина, по которой вы не используете aws-s3-deployment в первом случае (после updateWebsiteUrl)?   -  person quadroid    schedule 25.11.2019
comment
Я хочу обновить свой статический веб-сайт с помощью URL-адреса конечной точки API, а затем развернуть его. Мне нужно заменить часть моего кода.   -  person Zychoo    schedule 25.11.2019


Ответы (1)


Сегодня я столкнулся с той же проблемой, и мне удалось найти решение.

Код C #, который я использую в своей программе CDK, следующий:

// This will at runtime be just a token which refers to the actual JSON in the format  {'api':{'baseUrl':'https://your-url'}}
var configJson = stack.ToJsonString(new Dictionary<string, object>
        {
            ["api"] = new Dictionary<string, object>
            {
                ["baseUrl"] = api.Url
            }
        });

var configFile = new AwsCustomResource(this, "config-file", new AwsCustomResourceProps
        {
            OnUpdate = new AwsSdkCall
            {
                Service = "S3",
                Action = "putObject",
                Parameters = new Dictionary<string, string>
                {
                    ["Bucket"] = bucket.BucketName,
                    ["Key"] = "config.json",
                    ["Body"] = configJson,
                    ["ContentType"] = "application /json",
                    ["CacheControl"] = "max -age=0, no-cache, no-store, must-revalidate"
                },
                PhysicalResourceId = PhysicalResourceId.Of("config"),
            },
            Policy = AwsCustomResourcePolicy.FromStatements(
                new[]
                {
                    new PolicyStatement(new PolicyStatementProps
                    {
                        Actions = new[] { "s3:PutObject" },
                        Resources= new [] { bucket.ArnForObjects("config.json") }
                    })
                })
        });
    }

Чтобы типы были доступны, вам необходимо установить следующий пакет: https://docs.aws.amazon.com/cdk/api/latest/docs/custom-resources-readme.html

По сути, это часть решения, которое вы можете найти в качестве ответа на этот вопрос AWS CDK передает URL-адрес шлюза API на статический сайт в том же стеке или в этом репозитории GitHub: https://github.com/jogold/cloudstructs/blob/master/src/static-website/index.ts#L134

person Schweder    schedule 06.04.2021