UNPKG

automation-deploy-template-iac

Version:

AWS CDK Infrastructure as Code templates for deploying full-stack applications with FastAPI backend, Vue.js frontend, and automated deployment

166 lines 26 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const cdk = __importStar(require("aws-cdk-lib")); const backend_stack_1 = require("../lib/backend-stack"); const env_1 = require("../lib/config/env"); const domain_utils_1 = require("../lib/utils/domain-utils"); const constants_1 = require("../lib/config/constants"); const cloudformation_sdk_utils_1 = require("../lib/utils/sdks/cloudformation-sdk-utils"); const rds_requests_1 = require("../lib/requests/rds-requests"); const container_config_requests_1 = require("../lib/requests/container-config-requests"); const custom_secrets_requests_1 = require("../lib/requests/custom-secrets-requests"); (async () => { const app = new cdk.App(); const projectName = (0, env_1.getProjectName)(); // Context から設定を取得 const environment = (0, env_1.getEnvironment)(app, 'dev'); const rootDomain = app.node.tryGetContext('rootDomain') || process.env.ROOT_DOMAIN; const domainName = rootDomain ? (0, domain_utils_1.getBackendDomain)(rootDomain, environment) : undefined; const containerPort = (0, env_1.getContainerPort)(app); const imageTag = (0, env_1.getImageTag)(); const cpu = (0, env_1.getCpu)(); const memory = (0, env_1.getMemory)(); const desiredCount = (0, env_1.getDesiredCount)(); //const databaseStackName = app.node.tryGetContext('databaseStackName') || `${projectName}-${environment}-DatabaseStack`; const stackName = (0, constants_1.createStackName)(projectName, environment, constants_1.STACK_TYPES.BACKEND); const databaseStackName = (0, constants_1.createStackName)(projectName, environment, constants_1.STACK_TYPES.DATABASE); // check the database stack is already deployed via sdk const databaseStack = await cloudformation_sdk_utils_1.CloudformationSdkUtils.create(databaseStackName); const isDatabaseStackDeployed = databaseStack.isDeployed; const rdsSecretArn = databaseStack.getOutputByKey('SecretArn'); const rdsRequests = rds_requests_1.RdsRequests.build(databaseStack.getOutputByKey('ClusterEndpoint'), databaseStack.getOutputByKey('ClusterPort'), databaseStack.getOutputByKey('DatabaseName'), databaseStack.getOutputByKey('SecretArn'), databaseStack.getOutputByKey('ClusterArn')); console.log('========================='); console.log(`Project Name: ${projectName}`); console.log(`Environment: ${environment}`); console.log(`Stack Name: ${stackName}`); console.log(`Domain Name: ${domainName}`); console.log(`Image Tag: ${imageTag}`); console.log(`Container Port: ${containerPort}`); console.log(`CPU: ${cpu}`); console.log(`Memory: ${memory}`); console.log(`Desired Count: ${desiredCount}`); console.log(`Database Stack Name: ${databaseStackName}`); console.log(`RDS Secret ARN: ${rdsSecretArn}`); // ============================================================================ // CUSTOM CONTAINER CONFIGURATION // ============================================================================ // Configure custom environment variables and secrets for ECS containers // Following layered architecture: pass only metadata, adapter will load secrets // To use: deploy the secrets stack first with `cdk deploy <SecretsStackName>` // Then pass the secret name via context: --context customSecretName=<secret-name> // ============================================================================ // ============================================================================ // AUTOMATIC SECRET DISCOVERY // ============================================================================ // Automatically discovers and loads secrets based on naming convention // Pattern: ${projectName}-${environment}-{custom-secrets, api-keys, third-party-secrets, encryption-secrets} // Secrets that don't exist will be gracefully skipped // ============================================================================ console.log(`\n📝 Custom Configuration: Auto-discovery mode`); console.log(`Looking for secrets with pattern: ${projectName}-${environment}-*`); // Define expected secrets and their key mappings const secretConfigurations = [ { // Main custom secrets (from SecretsStack) secretName: `${projectName}-${environment}-custom-secrets`, keyMappings: [ { envVarName: 'CUSTOM_API_KEY', secretKey: 'api-key' }, { envVarName: 'CUSTOM_API_TOKEN', secretKey: 'api-token' }, { envVarName: 'STRIPE_API_KEY', secretKey: 'stripe-api-key' }, { envVarName: 'SENDGRID_API_KEY', secretKey: 'sendgrid-api-key' }, { envVarName: 'ENCRYPTION_KEY', secretKey: 'encryption-key' }, { envVarName: 'JWT_SECRET', secretKey: 'jwt-secret' }, ], }, { // Optional: API keys secret secretName: `${projectName}-${environment}-api-keys`, keyMappings: [ { envVarName: 'EXTERNAL_API_KEY', secretKey: 'external-api-key' }, { envVarName: 'PAYMENT_API_KEY', secretKey: 'payment-api-key' }, ], }, { // Optional: Third-party service credentials secretName: `${projectName}-${environment}-third-party-secrets`, keyMappings: [ { envVarName: 'TWILIO_AUTH_TOKEN', secretKey: 'twilio-auth-token' }, { envVarName: 'AWS_S3_ACCESS_KEY', secretKey: 's3-access-key' }, ], }, ]; // Build custom secrets requests with all potential secrets // Adapter will gracefully handle secrets that don't exist const customSecretsRequests = custom_secrets_requests_1.CustomSecretsRequests.buildFromMultiple(secretConfigurations); // Build container configuration with custom environment variables and secrets metadata const containerConfigRequests = container_config_requests_1.ContainerConfigRequests.build({ // Custom environment variables CUSTOM_ENV_VAR: 'production-value', FEATURE_FLAG_ENABLED: 'true', LOG_LEVEL: environment === 'production' ? 'info' : 'debug', CUSTOM_API_ENDPOINT: 'https://api.example.com', }, customSecretsRequests); console.log(`✅ Custom container configuration prepared`); console.log(` - Custom environment variables: 4`); console.log(` - Secret configurations to check: ${customSecretsRequests.secretConfigurations.length}`); console.log(` - Total potential secret mappings: ${customSecretsRequests.getTotalMappingsCount()}`); console.log(` - Adapter will load secrets that exist and skip those that don't`); try { // BackendStackを作成 new backend_stack_1.BackendStack(app, stackName, { projectName, environment: environment, domainName, imageTag, containerPort, cpu, memory, desiredCount, databaseStackName, isDatabaseStackDeployed, rdsRequests, containerConfigRequests, /* If you don't specify 'env', this stack will be environment-agnostic. * Account/Region-dependent features and context lookups will not work, * but a single synthesized template can be deployed anywhere. */ /* Uncomment the next line to specialize this stack for the AWS Account * and Region that are implied by the current CLI configuration. */ env: { account: (0, env_1.getCdkDefaultAccount)(), region: (0, env_1.getCdkDefaultRegion)() }, /* Uncomment the next line if you know exactly what Account and Region you * want to deploy the stack to. */ // env: { account: '123456789012', region: 'us-east-1' }, /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */ tags: (0, constants_1.createDefaultTags)(projectName, environment, constants_1.STACK_TYPES.BACKEND, 'backend') }); console.log(`Successfully created ${stackName}`); } catch (error) { console.error('Failed to create BackendStack:', error instanceof Error ? error.message : String(error)); process.exit(1); } })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL2Jpbi9iYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsaURBQW1DO0FBQ25DLHdEQUFvRDtBQUNwRCwyQ0FBaUw7QUFDakwsNERBQTZEO0FBQzdELHVEQUEwRjtBQUMxRix5RkFBb0Y7QUFDcEYsK0RBQTJEO0FBQzNELHlGQUFvRjtBQUNwRixxRkFBZ0Y7QUFFaEYsQ0FBQyxLQUFLLElBQUksRUFBRTtJQUNWLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzFCLE1BQU0sV0FBVyxHQUFHLElBQUEsb0JBQWMsR0FBRSxDQUFDO0lBRXJDLGtCQUFrQjtJQUNsQixNQUFNLFdBQVcsR0FBRyxJQUFBLG9CQUFjLEVBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sVUFBVSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDO0lBQ25GLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBQSwrQkFBZ0IsRUFBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN0RixNQUFNLGFBQWEsR0FBRyxJQUFBLHNCQUFnQixFQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sUUFBUSxHQUFHLElBQUEsaUJBQVcsR0FBRSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxHQUFHLElBQUEsWUFBTSxHQUFFLENBQUM7SUFDckIsTUFBTSxNQUFNLEdBQUcsSUFBQSxlQUFTLEdBQUUsQ0FBQztJQUMzQixNQUFNLFlBQVksR0FBRyxJQUFBLHFCQUFlLEdBQUUsQ0FBQztJQUN2Qyx5SEFBeUg7SUFFekgsTUFBTSxTQUFTLEdBQUcsSUFBQSwy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UUFDeEcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBCYWNrZW5kU3RhY2sgfSBmcm9tICcuLi9saWIvYmFja2VuZC1zdGFjayc7XG5pbXBvcnQgeyBnZXRQcm9qZWN0TmFtZSwgZ2V0RW52aXJvbm1lbnQsIGdldENvbnRhaW5lclBvcnQsIGdldEltYWdlVGFnLCBnZXRDcHUsIGdldE1lbW9yeSwgZ2V0RGVzaXJlZENvdW50LCBnZXRDZGtEZWZhdWx0QWNjb3VudCwgZ2V0Q2RrRGVmYXVsdFJlZ2lvbiB9IGZyb20gJy4uL2xpYi9jb25maWcvZW52JztcbmltcG9ydCB7IGdldEJhY2tlbmREb21haW4gfSBmcm9tICcuLi9saWIvdXRpbHMvZG9tYWluLXV0aWxzJztcbmltcG9ydCB7IFNUQUNLX1RZUEVTLCBjcmVhdGVTdGFja05hbWUsIGNyZWF0ZURlZmF1bHRUYWdzIH0gZnJvbSAnLi4vbGliL2NvbmZpZy9jb25zdGFudHMnO1xuaW1wb3J0IHsgQ2xvdWRmb3JtYXRpb25TZGtVdGlscyB9IGZyb20gJy4uL2xpYi91dGlscy9zZGtzL2Nsb3VkZm9ybWF0aW9uLXNkay11dGlscyc7XG5pbXBvcnQgeyBSZHNSZXF1ZXN0cyB9IGZyb20gJy4uL2xpYi9yZXF1ZXN0cy9yZHMtcmVxdWVzdHMnO1xuaW1wb3J0IHsgQ29udGFpbmVyQ29uZmlnUmVxdWVzdHMgfSBmcm9tICcuLi9saWIvcmVxdWVzdHMvY29udGFpbmVyLWNvbmZpZy1yZXF1ZXN0cyc7XG5pbXBvcnQgeyBDdXN0b21TZWNyZXRzUmVxdWVzdHMgfSBmcm9tICcuLi9saWIvcmVxdWVzdHMvY3VzdG9tLXNlY3JldHMtcmVxdWVzdHMnO1xuXG4oYXN5bmMgKCkgPT4ge1xuICBjb25zdCBhcHAgPSBuZXcgY2RrLkFwcCgpO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IGdldFByb2plY3ROYW1lKCk7XG5cbiAgLy8gQ29udGV4dCDjgYvjgonoqK3lrprjgpLlj5blvpdcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBnZXRFbnZpcm9ubWVudChhcHAsICdkZXYnKTtcbiAgY29uc3Qgcm9vdERvbWFpbiA9IGFwcC5ub2RlLnRyeUdldENvbnRleHQoJ3Jvb3REb21haW4nKSB8fCBwcm9jZXNzLmVudi5ST09UX0RPTUFJTjtcbiAgY29uc3QgZG9tYWluTmFtZSA9IHJvb3REb21haW4gPyBnZXRCYWNrZW5kRG9tYWluKHJvb3REb21haW4sIGVudmlyb25tZW50KSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29udGFpbmVyUG9ydCA9IGdldENvbnRhaW5lclBvcnQoYXBwKTtcbiAgY29uc3QgaW1hZ2VUYWcgPSBnZXRJbWFnZVRhZygpO1xuICBjb25zdCBjcHUgPSBnZXRDcHUoKTtcbiAgY29uc3QgbWVtb3J5ID0gZ2V0TWVtb3J5KCk7XG4gIGNvbnN0IGRlc2lyZWRDb3VudCA9IGdldERlc2lyZWRDb3VudCgpO1xuICAvL2NvbnN0IGRhdGFiYXNlU3RhY2tOYW1lID0gYXBwLm5vZGUudHJ5R2V0Q29udGV4dCgnZGF0YWJhc2VTdGFja05hbWUnKSB8fCBgJHtwcm9qZWN0TmFtZX0tJHtlbnZpcm9ubWVudH0tRGF0YWJhc2VTdGFja2A7XG5cbiAgY29uc3Qgc3RhY2tOYW1lID0gY3JlYXRlU3RhY2tOYW1lKHByb2plY3ROYW1lLCBlbnZpcm9ubWVudCwgU1RBQ0tfVFlQRVMuQkFDS0VORCk7XG5cbiAgY29uc3QgZGF0YWJhc2VTdGFja05hbWUgPSBjcmVhdGVTdGFja05hbWUocHJvamVjdE5hbWUsIGVudmlyb25tZW50LCBTVEFDS19UWVBFUy5EQVRBQkFTRSk7XG5cbiAgLy8gY2hlY2sgdGhlIGRhdGFiYXNlIHN0YWNrIGlzIGFscmVhZHkgZGVwbG95ZWQgdmlhIHNka1xuICBjb25zdCBkYXRhYmFzZVN0YWNrID0gYXdhaXQgQ2xvdWRmb3JtYXRpb25TZGtVdGlscy5jcmVhdGUoZGF0YWJhc2VTdGFja05hbWUpO1xuICBjb25zdCBpc0RhdGFiYXNlU3RhY2tEZXBsb3llZCA9IGRhdGFiYXNlU3RhY2suaXNEZXBsb3llZDtcbiAgY29uc3QgcmRzU2VjcmV0QXJuID0gZGF0YWJhc2VTdGFjay5nZXRPdXRwdXRCeUtleSgnU2VjcmV0QXJuJyk7XG4gIGNvbnN0IHJkc1JlcXVlc3RzID0gUmRzUmVxdWVzdHMuYnVpbGQoZGF0YWJhc2VTdGFjay5nZXRPdXRwdXRCeUtleSgnQ2x1c3RlckVuZHBvaW50JyksIGRhdGFiYXNlU3RhY2suZ2V0T3V0cHV0QnlLZXkoJ0NsdXN0ZXJQb3J0JyksIGRhdGFiYXNlU3RhY2suZ2V0T3V0cHV0QnlLZXkoJ0RhdGFiYXNlTmFtZScpLCBkYXRhYmFzZVN0YWNrLmdldE91dHB1dEJ5S2V5KCdTZWNyZXRBcm4nKSwgZGF0YWJhc2VTdGFjay5nZXRPdXRwdXRCeUtleSgnQ2x1c3RlckFybicpKTtcblxuICBjb25zb2xlLmxvZygnPT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICBjb25zb2xlLmxvZyhgUHJvamVjdCBOYW1lOiAke3Byb2plY3ROYW1lfWApO1xuICBjb25zb2xlLmxvZyhgRW52aXJvbm1lbnQ6ICR7ZW52aXJvbm1lbnR9YCk7XG4gIGNvbnNvbGUubG9nKGBTdGFjayBOYW1lOiAke3N0YWNrTmFtZX1gKTtcbiAgY29uc29sZS5sb2coYERvbWFpbiBOYW1lOiAke2RvbWFpbk5hbWV9YCk7XG4gIGNvbnNvbGUubG9nKGBJbWFnZSBUYWc6ICR7aW1hZ2VUYWd9YCk7XG4gIGNvbnNvbGUubG9nKGBDb250YWluZXIgUG9ydDogJHtjb250YWluZXJQb3J0fWApO1xuICBjb25zb2xlLmxvZyhgQ1BVOiAke2NwdX1gKTtcbiAgY29uc29sZS5sb2coYE1lbW9yeTogJHttZW1vcnl9YCk7XG4gIGNvbnNvbGUubG9nKGBEZXNpcmVkIENvdW50OiAke2Rlc2lyZWRDb3VudH1gKTtcbiAgY29uc29sZS5sb2coYERhdGFiYXNlIFN0YWNrIE5hbWU6ICR7ZGF0YWJhc2VTdGFja05hbWV9YCk7XG4gIGNvbnNvbGUubG9nKGBSRFMgU2VjcmV0IEFSTjogJHtyZHNTZWNyZXRBcm59YCk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDVVNUT00gQ09OVEFJTkVSIENPTkZJR1VSQVRJT05cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBDb25maWd1cmUgY3VzdG9tIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc2VjcmV0cyBmb3IgRUNTIGNvbnRhaW5lcnNcbiAgLy8gRm9sbG93aW5nIGxheWVyZWQgYXJjaGl0ZWN0dXJlOiBwYXNzIG9ubHkgbWV0YWRhdGEsIGFkYXB0ZXIgd2lsbCBsb2FkIHNlY3JldHNcbiAgLy8gVG8gdXNlOiBkZXBsb3kgdGhlIHNlY3JldHMgc3RhY2sgZmlyc3Qgd2l0aCBgY2RrIGRlcGxveSA8U2VjcmV0c1N0YWNrTmFtZT5gXG4gIC8vIFRoZW4gcGFzcyB0aGUgc2VjcmV0IG5hbWUgdmlhIGNvbnRleHQ6IC0tY29udGV4dCBjdXN0b21TZWNyZXROYW1lPTxzZWNyZXQtbmFtZT5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQVVUT01BVElDIFNFQ1JFVCBESVNDT1ZFUllcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBBdXRvbWF0aWNhbGx5IGRpc2NvdmVycyBhbmQgbG9hZHMgc2VjcmV0cyBiYXNlZCBvbiBuYW1pbmcgY29udmVudGlvblxuICAvLyBQYXR0ZXJuOiAke3Byb2plY3ROYW1lfS0ke2Vudmlyb25tZW50fS17Y3VzdG9tLXNlY3JldHMsIGFwaS1rZXlzLCB0aGlyZC1wYXJ0eS1zZWNyZXRzLCBlbmNyeXB0aW9uLXNlY3JldHN9XG4gIC8vIFNlY3JldHMgdGhhdCBkb24ndCBleGlzdCB3aWxsIGJlIGdyYWNlZnVsbHkgc2tpcHBlZFxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIFxuICBjb25zb2xlLmxvZyhgXFxu8J+TnSBDdXN0b20gQ29uZmlndXJhdGlvbjogQXV0by1kaXNjb3ZlcnkgbW9kZWApO1xuICBjb25zb2xlLmxvZyhgTG9va2luZyBmb3Igc2VjcmV0cyB3aXRoIHBhdHRlcm46ICR7cHJvamVjdE5hbWV9LSR7ZW52aXJvbm1lbnR9LSpgKTtcbiAgXG4gIC8vIERlZmluZSBleHBlY3RlZCBzZWNyZXRzIGFuZCB0aGVpciBrZXkgbWFwcGluZ3NcbiAgY29uc3Qgc2VjcmV0Q29uZmlndXJhdGlvbnMgPSBbXG4gICAge1xuICAgICAgLy8gTWFpbiBjdXN0b20gc2VjcmV0cyAoZnJvbSBTZWNyZXRzU3RhY2spXG4gICAgICBzZWNyZXROYW1lOiBgJHtwcm9qZWN0TmFtZX0tJHtlbnZpcm9ubWVudH0tY3VzdG9tLXNlY3JldHNgLFxuICAgICAga2V5TWFwcGluZ3M6IFtcbiAgICAgICAgeyBlbnZWYXJOYW1lOiAnQ1VTVE9NX0FQSV9LRVknLCBzZWNyZXRLZXk6ICdhcGkta2V5JyB9LFxuICAgICAgICB7IGVudlZhck5hbWU6ICdDVVNUT01fQVBJX1RPS0VOJywgc2VjcmV0S2V5OiAnYXBpLXRva2VuJyB9LFxuICAgICAgICB7IGVudlZhck5hbWU6ICdTVFJJUEVfQVBJX0tFWScsIHNlY3JldEtleTogJ3N0cmlwZS1hcGkta2V5JyB9LFxuICAgICAgICB7IGVudlZhck5hbWU6ICdTRU5ER1JJRF9BUElfS0VZJywgc2VjcmV0S2V5OiAnc2VuZGdyaWQtYXBpLWtleScgfSxcbiAgICAgICAgeyBlbnZWYXJOYW1lOiAnRU5DUllQVElPTl9LRVknLCBzZWNyZXRLZXk6ICdlbmNyeXB0aW9uLWtleScgfSxcbiAgICAgICAgeyBlbnZWYXJOYW1lOiAnSldUX1NFQ1JFVCcsIHNlY3JldEtleTogJ2p3dC1zZWNyZXQnIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT3B0aW9uYWw6IEFQSSBrZXlzIHNlY3JldFxuICAgICAgc2VjcmV0TmFtZTogYCR7cHJvamVjdE5hbWV9LSR7ZW52aXJvbm1lbnR9LWFwaS1rZXlzYCxcbiAgICAgIGtleU1hcHBpbmdzOiBbXG4gICAgICAgIHsgZW52VmFyTmFtZTogJ0VYVEVSTkFMX0FQSV9LRVknLCBzZWNyZXRLZXk6ICdleHRlcm5hbC1hcGkta2V5JyB9LFxuICAgICAgICB7IGVudlZhck5hbWU6ICdQQVlNRU5UX0FQSV9LRVknLCBzZWNyZXRLZXk6ICdwYXltZW50LWFwaS1rZXknIH0sXG4gICAgICBdLFxuICAgIH0sXG4gICAge1xuICAgICAgLy8gT3B0aW9uYWw6IFRoaXJkLXBhcnR5IHNlcnZpY2UgY3JlZGVudGlhbHNcbiAgICAgIHNlY3JldE5hbWU6IGAke3Byb2plY3ROYW1lfS0ke2Vudmlyb25tZW50fS10aGlyZC1wYXJ0eS1zZWNyZXRzYCxcbiAgICAgIGtleU1hcHBpbmdzOiBbXG4gICAgICAgIHsgZW52VmFyTmFtZTogJ1RXSUxJT19BVVRIX1RPS0VOJywgc2VjcmV0S2V5OiAndHdpbGlvLWF1dGgtdG9rZW4nIH0sXG4gICAgICAgIHsgZW52VmFyTmFtZTogJ0FXU19TM19BQ0NFU1NfS0VZJywgc2VjcmV0S2V5OiAnczMtYWNjZXNzLWtleScgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgXTtcblxuICAvLyBCdWlsZCBjdXN0b20gc2VjcmV0cyByZXF1ZXN0cyB3aXRoIGFsbCBwb3RlbnRpYWwgc2VjcmV0c1xuICAvLyBBZGFwdGVyIHdpbGwgZ3JhY2VmdWxseSBoYW5kbGUgc2VjcmV0cyB0aGF0IGRvbid0IGV4aXN0XG4gIGNvbnN0IGN1c3RvbVNlY3JldHNSZXF1ZXN0cyA9IEN1c3RvbVNlY3JldHNSZXF1ZXN0cy5idWlsZEZyb21NdWx0aXBsZShzZWNyZXRDb25maWd1cmF0aW9ucyk7XG5cbiAgLy8gQnVpbGQgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gd2l0aCBjdXN0b20gZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCBzZWNyZXRzIG1ldGFkYXRhXG4gIGNvbnN0IGNvbnRhaW5lckNvbmZpZ1JlcXVlc3RzID0gQ29udGFpbmVyQ29uZmlnUmVxdWVzdHMuYnVpbGQoXG4gICAge1xuICAgICAgLy8gQ3VzdG9tIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgQ1VTVE9NX0VOVl9WQVI6ICdwcm9kdWN0aW9uLXZhbHVlJyxcbiAgICAgIEZFQVRVUkVfRkxBR19FTkFCTEVEOiAndHJ1ZScsXG4gICAgICBMT0dfTEVWRUw6IGVudmlyb25tZW50ID09PSAncHJvZHVjdGlvbicgPyAnaW5mbycgOiAnZGVidWcnLFxuICAgICAgQ1VTVE9NX0FQSV9FTkRQT0lOVDogJ2h0dHBzOi8vYXBpLmV4YW1wbGUuY29tJyxcbiAgICB9LFxuICAgIGN1c3RvbVNlY3JldHNSZXF1ZXN0c1xuICApO1xuXG4gIGNvbnNvbGUubG9nKGDinIUgQ3VzdG9tIGNvbnRhaW5lciBjb25maWd1cmF0aW9uIHByZXBhcmVkYCk7XG4gIGNvbnNvbGUubG9nKGAgICAtIEN1c3RvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXM6IDRgKTtcbiAgY29uc29sZS5sb2coYCAgIC0gU2VjcmV0IGNvbmZpZ3VyYXRpb25zIHRvIGNoZWNrOiAke2N1c3RvbVNlY3JldHNSZXF1ZXN0cy5zZWNyZXRDb25maWd1cmF0aW9ucy5sZW5ndGh9YCk7XG4gIGNvbnNvbGUubG9nKGAgICAtIFRvdGFsIHBvdGVudGlhbCBzZWNyZXQgbWFwcGluZ3M6ICR7Y3VzdG9tU2VjcmV0c1JlcXVlc3RzLmdldFRvdGFsTWFwcGluZ3NDb3VudCgpfWApO1xuICBjb25zb2xlLmxvZyhgICAgLSBBZGFwdGVyIHdpbGwgbG9hZCBzZWNyZXRzIHRoYXQgZXhpc3QgYW5kIHNraXAgdGhvc2UgdGhhdCBkb24ndGApO1xuXG4gIHRyeSB7XG4gICAgLy8gQmFja2VuZFN0YWNr44KS5L2c5oiQXG4gICAgbmV3IEJhY2tlbmRTdGFjayhhcHAsIHN0YWNrTmFtZSwge1xuICAgICAgcHJvamVjdE5hbWUsXG4gICAgICBlbnZpcm9ubWVudDogZW52aXJvbm1lbnQsXG4gICAgICBkb21haW5OYW1lLFxuICAgICAgaW1hZ2VUYWcsXG4gICAgICBjb250YWluZXJQb3J0LFxuICAgICAgY3B1LFxuICAgICAgbWVtb3J5LFxuICAgICAgZGVzaXJlZENvdW50LFxuICAgICAgZGF0YWJhc2VTdGFja05hbWUsXG4gICAgICBpc0RhdGFiYXNlU3RhY2tEZXBsb3llZCxcbiAgICAgIHJkc1JlcXVlc3RzLFxuICAgICAgY29udGFpbmVyQ29uZmlnUmVxdWVzdHMsXG4gICAgICAvKiBJZiB5b3UgZG9uJ3Qgc3BlY2lmeSAnZW52JywgdGhpcyBzdGFjayB3aWxsIGJlIGVudmlyb25tZW50LWFnbm9zdGljLlxuICAgICAgICogQWNjb3VudC9SZWdpb24tZGVwZW5kZW50IGZlYXR1cmVzIGFuZCBjb250ZXh0IGxvb2t1cHMgd2lsbCBub3Qgd29yayxcbiAgICAgICAqIGJ1dCBhIHNpbmdsZSBzeW50aGVzaXplZCB0ZW1wbGF0ZSBjYW4gYmUgZGVwbG95ZWQgYW55d2hlcmUuICovXG5cbiAgICAgIC8qIFVuY29tbWVudCB0aGUgbmV4dCBsaW5lIHRvIHNwZWNpYWxpemUgdGhpcyBzdGFjayBmb3IgdGhlIEFXUyBBY2NvdW50XG4gICAgICAgKiBhbmQgUmVnaW9uIHRoYXQgYXJlIGltcGxpZWQgYnkgdGhlIGN1cnJlbnQgQ0xJIGNvbmZpZ3VyYXRpb24uICovXG4gICAgICBlbnY6IHsgYWNjb3VudDogZ2V0Q2RrRGVmYXVsdEFjY291bnQoKSwgcmVnaW9uOiBnZXRDZGtEZWZhdWx0UmVnaW9uKCkgfSxcblxuICAgICAgLyogVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgaWYgeW91IGtub3cgZXhhY3RseSB3aGF0IEFjY291bnQgYW5kIFJlZ2lvbiB5b3VcbiAgICAgICAqIHdhbnQgdG8gZGVwbG95IHRoZSBzdGFjayB0by4gKi9cbiAgICAgIC8vIGVudjogeyBhY2NvdW50OiAnMTIzNDU2Nzg5MDEyJywgcmVnaW9uOiAndXMtZWFzdC0xJyB9LFxuXG4gICAgICAvKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9jZGsvbGF0ZXN0L2d1aWRlL2Vudmlyb25tZW50cy5odG1sICovXG4gICAgICB0YWdzOiBjcmVhdGVEZWZhdWx0VGFncyhwcm9qZWN0TmFtZSwgZW52aXJvbm1lbnQsIFNUQUNLX1RZUEVTLkJBQ0tFTkQsICdiYWNrZW5kJylcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgY3JlYXRlZCAke3N0YWNrTmFtZX1gKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY3JlYXRlIEJhY2tlbmRTdGFjazonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufSkoKTsgIl19