diff --git a/.circleci/local_publish_helpers_codebuild.sh b/.circleci/local_publish_helpers_codebuild.sh index 108f1cbd314..18872b73854 100644 --- a/.circleci/local_publish_helpers_codebuild.sh +++ b/.circleci/local_publish_helpers_codebuild.sh @@ -139,10 +139,11 @@ function verifyPkgCli { fi } - verifySinglePkg "amplify-pkg-linux-x64" "amplify-pkg-linux-x64.tgz" $((930 * 1024 * 1024)) - verifySinglePkg "amplify-pkg-macos-x64" "amplify-pkg-macos-x64.tgz" $((930 * 1024 * 1024)) - verifySinglePkg "amplify-pkg-win-x64.exe" "amplify-pkg-win-x64.tgz" $((930 * 1024 * 1024)) - verifySinglePkg "amplify-pkg-linux-arm64" "amplify-pkg-linux-arm64.tgz" $((750 * 1024 * 1024)) + # TODO: After V3 migrations are done, decrease 995 back to 930 and 825 back to 750 + verifySinglePkg "amplify-pkg-linux-x64" "amplify-pkg-linux-x64.tgz" $((995 * 1024 * 1024)) + verifySinglePkg "amplify-pkg-macos-x64" "amplify-pkg-macos-x64.tgz" $((995 * 1024 * 1024)) + verifySinglePkg "amplify-pkg-win-x64.exe" "amplify-pkg-win-x64.tgz" $((995 * 1024 * 1024)) + verifySinglePkg "amplify-pkg-linux-arm64" "amplify-pkg-linux-arm64.tgz" $((825 * 1024 * 1024)) } function unsetNpmRegistryUrl { diff --git a/packages/amplify-category-auth/provider-utils/awscloudformation/triggers/CustomMessage/assets/verify.js b/packages/amplify-category-auth/provider-utils/awscloudformation/triggers/CustomMessage/assets/verify.js index 88bb9c6fab2..8d1f9b80714 100644 --- a/packages/amplify-category-auth/provider-utils/awscloudformation/triggers/CustomMessage/assets/verify.js +++ b/packages/amplify-category-auth/provider-utils/awscloudformation/triggers/CustomMessage/assets/verify.js @@ -37,9 +37,7 @@ function confirm() { Username: userName, }; - AWS.config.region = region; - - var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider(); + var cognitoidentityserviceprovider = new AWS.CognitoIdentityServiceProvider({ region: region }); cognitoidentityserviceprovider.confirmSignUp(params, function (err, data) { if (err) { diff --git a/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-file-uploader.ts b/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-file-uploader.ts index a1e921cba64..0993331fa44 100644 --- a/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-file-uploader.ts +++ b/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-file-uploader.ts @@ -4,14 +4,15 @@ import { createReadStream, readdirSync, existsSync } from 'fs-extra'; import mime from 'mime-types'; import * as path from 'path'; import { getAuthResourceName } from '../../../utils/getAuthResourceName'; +import s3 from 'aws-sdk/clients/s3'; const providerName = 'awscloudformation'; const getS3Client = async (context: $TSContext, action: string): Promise => { const providerPlugins = context.amplify.getProviderPlugins(context); const provider = await import(providerPlugins[providerName]); - const aws = await provider.getConfiguredAWSClient(context, AmplifyCategories.AUTH, action); - return new aws.S3(); + const config = await provider.getConfiguredAWSClientConfig(context, AmplifyCategories.AUTH, action); + return new s3(config); }; /** diff --git a/packages/amplify-category-geo/src/provider-controllers/import.ts b/packages/amplify-category-geo/src/provider-controllers/import.ts index 80da662edca..ffec5e9a9ff 100644 --- a/packages/amplify-category-geo/src/provider-controllers/import.ts +++ b/packages/amplify-category-geo/src/provider-controllers/import.ts @@ -3,7 +3,7 @@ import { $TSContext } from '@aws-amplify/amplify-cli-core'; import { prompter, printer } from '@aws-amplify/amplify-prompts'; import { existsSync, writeFileSync } from 'fs-extra'; import { join } from 'path'; -import aws from 'aws-sdk'; +import Location from 'aws-sdk/clients/location'; import { ServiceName } from '../service-utils/constants'; import { validateGeoJSONObj } from '../service-utils/validateGeoJSONObj'; import { @@ -112,7 +112,7 @@ export const importResource = async (context: $TSContext) => { const bulkUploadGeofence = async (context: $TSContext, params: ImportParams, region: string) => { printer.info('Updating your Geofences in the collection...'); try { - const { client } = await context.amplify.invokePluginMethod<{ client: aws.Location }>( + const { client } = await context.amplify.invokePluginMethod<{ client: Location }>( context, 'awscloudformation', undefined, diff --git a/packages/amplify-category-hosting/__mocks__/mockAwsProviderModule.js b/packages/amplify-category-hosting/__mocks__/mockAwsProviderModule.js index 614b1de99cd..ecb90c7f81f 100644 --- a/packages/amplify-category-hosting/__mocks__/mockAwsProviderModule.js +++ b/packages/amplify-category-hosting/__mocks__/mockAwsProviderModule.js @@ -1,9 +1,7 @@ -async function getConfiguredAWSClient() { +async function getConfiguredAWSClientConfig() { return { - S3, - IAM, - Pinpoint, - CloudFront, + credentials: 'some credentials', + customUserAgent: 'someCustomUserAgent', }; } @@ -11,31 +9,6 @@ async function getConfiguredPinpointClient() { return new Pinpoint(); } -class S3 { - upload() { - return { - promise: () => Promise.resolve({}), - }; - } -} - -class IAM { - createPolicy() { - return { - promise: () => - Promise.resolve({ - Policy: {}, - }), - }; - } - - attachRolePolicy() { - return { - promise: () => Promise.resolve({}), - }; - } -} - class Pinpoint { constructor() { this.config = {}; @@ -71,15 +44,7 @@ class Pinpoint { } } -class CloudFront { - createInvalidation() { - return { - promise: () => Promise.resolve({}), - }; - } -} - module.exports = { - getConfiguredAWSClient, + getConfiguredAWSClientConfig, getConfiguredPinpointClient, }; diff --git a/packages/amplify-category-hosting/__tests__/lib/S3AndCloudFront/helpers/cloudfront-manager.test.js b/packages/amplify-category-hosting/__tests__/lib/S3AndCloudFront/helpers/cloudfront-manager.test.js index 75305479b51..c26650b880e 100644 --- a/packages/amplify-category-hosting/__tests__/lib/S3AndCloudFront/helpers/cloudfront-manager.test.js +++ b/packages/amplify-category-hosting/__tests__/lib/S3AndCloudFront/helpers/cloudfront-manager.test.js @@ -1,5 +1,3 @@ -const mockAwsProviderModule = require('../../../../__mocks__/mockAwsProviderModule'); - const cloudFrontManager = require('../../../../lib/S3AndCloudFront/helpers/cloudfront-manager'); describe('cloudfront-manager', () => { @@ -76,14 +74,9 @@ describe('cloudfront-manager', () => { } } - mockAwsProviderModule.getConfiguredAWSClient = () => { - return { - CloudFront: mockCloudFront, - }; - }; - test('invalidateCloudFront', async () => { - const result = await cloudFrontManager.invalidateCloudFront(mockContext); + const mockCloudFrontClient = async (context, action) => Promise.resolve(new mockCloudFront()); + const result = await cloudFrontManager.invalidateCloudFront(mockContext, mockCloudFrontClient); expect(result).toBe(mockContext); expect(mockInvalidateMethod).toBeCalled(); expect(mockContext.exeInfo.cftInvalidationData).toEqual(mockcftInvalidationData); diff --git a/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/cloudfront-manager.js b/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/cloudfront-manager.js index 8b12fc7a499..088b6420c36 100644 --- a/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/cloudfront-manager.js +++ b/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/cloudfront-manager.js @@ -1,20 +1,21 @@ const chalk = require('chalk'); const constants = require('../../constants'); +const CloudFront = require('aws-sdk/clients/cloudfront'); const providerName = 'awscloudformation'; -function invalidateCloudFront(context) { +function invalidateCloudFront(context, cloudFrontClient = getCloudFrontClient) { if (context.parameters.options.invalidateCache || context.parameters.options.invalidateCloudFront || context.parameters.options.c) { - return invalidate(context); + return invalidate(context, cloudFrontClient); } } -async function invalidate(context) { +async function invalidate(context, cloudFrontClient = getCloudFrontClient) { if (context.exeInfo.serviceMeta && context.exeInfo.serviceMeta.output && context.exeInfo.serviceMeta.output.CloudFrontDistributionID) { const { CloudFrontDistributionID } = context.exeInfo.serviceMeta.output; const { CloudFrontSecureURL } = context.exeInfo.serviceMeta.output; - const cloudFront = await getCloudFrontClient(context, 'update'); + const cloudFront = await cloudFrontClient(context, 'update'); const invalidateParams = { DistributionId: CloudFrontDistributionID, InvalidationBatch: { @@ -43,8 +44,8 @@ async function invalidate(context) { async function getCloudFrontClient(context, action) { const providerPlugins = context.amplify.getProviderPlugins(context); const provider = require(providerPlugins[providerName]); - const aws = await provider.getConfiguredAWSClient(context, constants.CategoryName, action); - return new aws.CloudFront(); + const config = await provider.getConfiguredAWSClientConfig(context, constants.CategoryName, action); + return new CloudFront(config); } module.exports = { diff --git a/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/file-uploader.js b/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/file-uploader.js index 92c71c39cc3..7893cf7fdf0 100644 --- a/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/file-uploader.js +++ b/packages/amplify-category-hosting/lib/S3AndCloudFront/helpers/file-uploader.js @@ -3,6 +3,7 @@ const sequential = require('promise-sequential'); const fileScanner = require('./file-scanner'); const constants = require('../../constants'); const { uploadFile } = require('./upload-file'); +const S3 = require('aws-sdk/clients/s3'); const serviceName = 'S3AndCloudFront'; const providerName = 'awscloudformation'; @@ -41,8 +42,8 @@ function sortUploadFiles(fileList) { async function getS3Client(context, action) { const providerPlugins = context.amplify.getProviderPlugins(context); const provider = require(providerPlugins[providerName]); - const aws = await provider.getConfiguredAWSClient(context, constants.CategoryName, action); - return new aws.S3(); + const config = await provider.getConfiguredAWSClientConfig(context, constants.CategoryName, action); + return new S3(config); } function getHostingBucketName(context) { diff --git a/packages/amplify-category-hosting/package.json b/packages/amplify-category-hosting/package.json index 7cfb10181e8..e675ff75ed2 100644 --- a/packages/amplify-category-hosting/package.json +++ b/packages/amplify-category-hosting/package.json @@ -23,6 +23,7 @@ "dependencies": { "@aws-amplify/amplify-cli-core": "4.4.1", "@aws-amplify/amplify-prompts": "2.8.6", + "aws-sdk": "^2.1692.0", "chalk": "^4.1.1", "fs-extra": "^8.1.0", "mime-types": "^2.1.26", diff --git a/packages/amplify-category-notifications/src/auth-helper.ts b/packages/amplify-category-notifications/src/auth-helper.ts index f32ca755efa..b97118a8251 100644 --- a/packages/amplify-category-notifications/src/auth-helper.ts +++ b/packages/amplify-category-notifications/src/auth-helper.ts @@ -2,6 +2,7 @@ import { $TSAny, $TSContext, AmplifyCategories, AmplifyError } from '@aws-amplif import { printer } from '@aws-amplify/amplify-prompts'; import ora from 'ora'; import os from 'os'; +import IAM from 'aws-sdk/clients/iam'; const providerName = 'awscloudformation'; const policyNamePrefix = 'pinpoint_amplify-'; @@ -150,8 +151,10 @@ const getIamClient = async (context: $TSContext, action: string | undefined): Pr const providerPlugins = context.amplify.getProviderPlugins(context); // eslint-disable-next-line import/no-dynamic-require, global-require, @typescript-eslint/no-var-requires const provider = require(providerPlugins[providerName]); - const aws = await provider.getConfiguredAWSClient(context, AmplifyCategories.NOTIFICATIONS, action); - return new aws.IAM(); + const config = await provider.getConfiguredAWSClientConfig(context, AmplifyCategories.NOTIFICATIONS, action); + return new IAM({ + ...config, + }); }; const getPolicyDoc = (context: $TSContext): string => { diff --git a/packages/amplify-category-notifications/src/pinpoint-helper.ts b/packages/amplify-category-notifications/src/pinpoint-helper.ts index 18f8d90c70d..06e133c8226 100644 --- a/packages/amplify-category-notifications/src/pinpoint-helper.ts +++ b/packages/amplify-category-notifications/src/pinpoint-helper.ts @@ -26,7 +26,7 @@ import { PinpointName } from './pinpoint-name'; import { isChannelDeploymentDeferred } from './notifications-backend-cfg-channel-api'; import { constructResourceMeta, addPartialNotificationsAppMeta } from './notifications-amplify-meta-api'; import { addPartialNotificationsBackendConfig } from './notifications-backend-cfg-api'; -import aws from 'aws-sdk'; +import Pinpoint from 'aws-sdk/clients/pinpoint'; import { formUserAgentParam, loadConfiguration, @@ -524,12 +524,7 @@ const getConfiguredCredentials = async (context: $TSContext, envName?: string): } }; -export const getPinpointClient = async ( - context: $TSContext, - category: string, - action?: string, - envName?: string, -): Promise => { +export const getPinpointClient = async (context: $TSContext, category: string, action?: string, envName?: string): Promise => { const httpProxy = process.env.HTTP_PROXY || process.env.HTTPS_PROXY; const cred = await getConfiguredCredentials(context, envName); @@ -543,17 +538,14 @@ export const getPinpointClient = async ( region: pinpointApp?.Region ?? (await mapServiceRegion(context, cred?.region || resolveRegion())), customUserAgent: formUserAgentParam(context, userAgentAction), }; + let httpAgent = undefined; // HTTP_PROXY & HTTPS_PROXY env vars are read automatically by ProxyAgent, but we check to see if they are set before using the proxy if (httpProxy) { - aws.config.update({ - httpOptions: { - agent: new ProxyAgent(), - }, - }); + httpAgent = new ProxyAgent(); } - return new aws.Pinpoint({ ...cred, ...defaultOptions }); + return new Pinpoint({ ...cred, ...defaultOptions, httpOptions: { agent: httpAgent } }); }; export const mapServiceRegion = async (context: $TSContext, region: string): Promise => { diff --git a/packages/amplify-console-hosting/package.json b/packages/amplify-console-hosting/package.json index 44d2268bb9a..967e21eddbd 100644 --- a/packages/amplify-console-hosting/package.json +++ b/packages/amplify-console-hosting/package.json @@ -10,6 +10,7 @@ "@aws-amplify/amplify-cli-core": "4.4.1", "@aws-amplify/amplify-environment-parameters": "1.9.19", "archiver": "^7.0.1", + "aws-sdk": "^2.1692.0", "chalk": "^4.1.1", "cli-table3": "^0.6.0", "execa": "^5.1.1", diff --git a/packages/amplify-console-hosting/src/utils/client-factory.js b/packages/amplify-console-hosting/src/utils/client-factory.js index a80ab5a7110..9439ef0f5ff 100644 --- a/packages/amplify-console-hosting/src/utils/client-factory.js +++ b/packages/amplify-console-hosting/src/utils/client-factory.js @@ -1,19 +1,20 @@ const constants = require('../constants/plugin-constants'); +const AWS = require('aws-sdk'); async function getAmplifyClient(context) { - const AWS = await getAWSClient(context); - return new AWS.Amplify(); + const config = await getAWSClientConfig(context); + return new AWS.Amplify(config); } async function getS3Client(context) { - const AWS = await getAWSClient(context); - return new AWS.S3(); + const config = await getAWSClientConfig(context); + return new AWS.S3(config); } -async function getAWSClient(context) { +async function getAWSClientConfig(context) { const providerPlugin = context.amplify.getProviderPlugins(context); const provider = require(providerPlugin[constants.PROVIDER]); - return await provider.getConfiguredAWSClient(context, constants.CATEGORY, 'create'); + return await provider.getConfiguredAWSClientConfig(context, constants.CATEGORY, 'create'); } module.exports = { diff --git a/packages/amplify-container-hosting/src/lib/ElasticContainer/file-uploader.js b/packages/amplify-container-hosting/src/lib/ElasticContainer/file-uploader.js index 1e03af618c4..c2accf618d7 100644 --- a/packages/amplify-container-hosting/src/lib/ElasticContainer/file-uploader.js +++ b/packages/amplify-container-hosting/src/lib/ElasticContainer/file-uploader.js @@ -1,12 +1,13 @@ const fs = require('fs-extra'); const mime = require('mime-types'); const constants = require('../constants'); +const S3 = require('aws-sdk/clients/s3'); export async function getS3Client(context, action) { const providerPlugins = context.amplify.getProviderPlugins(context); const provider = require(providerPlugins[constants.providerName]); - const aws = await provider.getConfiguredAWSClient(context, constants.CategoryName, action); - return new aws.S3(); + const config = await provider.getConfiguredAWSClientConfig(context, constants.CategoryName, action); + return new S3(config); } export async function uploadFile(s3Client, bucketName, filePath, fileKey) { diff --git a/packages/amplify-e2e-tests/src/__tests__/storage-simulator/S3server.test.ts b/packages/amplify-e2e-tests/src/__tests__/storage-simulator/S3server.test.ts index b158e2869cc..63e3305a61f 100644 --- a/packages/amplify-e2e-tests/src/__tests__/storage-simulator/S3server.test.ts +++ b/packages/amplify-e2e-tests/src/__tests__/storage-simulator/S3server.test.ts @@ -7,20 +7,21 @@ const route = '/mock-testing'; const bucket = 'mock-testing'; const localDirS3 = __dirname + '/test-data/'; +const fakeAccessId = 'fakeaccesskeyidfortesting'; +const fakeSecretKey = 'fakeaccesssecretkeyfortesting'; +const fakeRegion = 'eu-west-2'; + let s3client; let simulator; jest.setTimeout(2000000); beforeAll(async () => { - AWS.config.update({ - accessKeyId: 'fakeaccesskeyidfortesting', - secretAccessKey: 'fakeaccesssecretkeyfortesting', - region: 'eu-west-2', - }); - const ep = new AWS.Endpoint('http://localhost:20005'); s3client = new AWS.S3({ + accessKeyId: fakeAccessId, + secretAccessKey: fakeSecretKey, + region: fakeRegion, apiVersion: '2006-03-01', endpoint: ep.href, s3BucketEndpoint: true, diff --git a/packages/amplify-e2e-tests/src/import-helpers/utilities.ts b/packages/amplify-e2e-tests/src/import-helpers/utilities.ts index 17507102d02..ba18f8e869e 100644 --- a/packages/amplify-e2e-tests/src/import-helpers/utilities.ts +++ b/packages/amplify-e2e-tests/src/import-helpers/utilities.ts @@ -296,9 +296,11 @@ const addAppClient = async ( const projectDetails = getProjectMeta(projectRoot); const authDetails = getAuthProjectDetails(projectRoot); const creds = new aws.SharedIniFileCredentials({ profile: profileName }); - aws.config.credentials = creds; - const cognitoClient = new aws.CognitoIdentityServiceProvider({ region: projectDetails.providers.awscloudformation.Region }); + const cognitoClient = new aws.CognitoIdentityServiceProvider({ + credentials: creds, + region: projectDetails.providers.awscloudformation.Region, + }); const response = await cognitoClient .createUserPoolClient({ ClientName: clientName, @@ -332,9 +334,11 @@ export const deleteAppClient = async (profileName: string, projectRoot: string, const authDetails = getAuthProjectDetails(projectRoot); const projectDetails = getProjectMeta(projectRoot); const creds = new aws.SharedIniFileCredentials({ profile: profileName }); - aws.config.credentials = creds; - const cognitoClient = new aws.CognitoIdentityServiceProvider({ region: projectDetails.providers.awscloudformation.Region }); + const cognitoClient = new aws.CognitoIdentityServiceProvider({ + credentials: creds, + region: projectDetails.providers.awscloudformation.Region, + }); await cognitoClient.deleteUserPoolClient({ ClientId: clientId, UserPoolId: authDetails.meta.UserPoolId }).promise(); }; diff --git a/packages/amplify-provider-awscloudformation/API.md b/packages/amplify-provider-awscloudformation/API.md index c87dd22534a..5b15e994b27 100644 --- a/packages/amplify-provider-awscloudformation/API.md +++ b/packages/amplify-provider-awscloudformation/API.md @@ -11,6 +11,24 @@ import * as AWS_2 from 'aws-sdk'; import { IAmplifyResource } from '@aws-amplify/amplify-cli-core'; import { Template } from '@aws-amplify/amplify-cli-core'; +// @public (undocumented) +export interface AwsSdkConfig { + // (undocumented) + accessKeyId: string; + // (undocumented) + expiration?: Date; + // (undocumented) + httpOptions?: { + agent: $TSAny; + }; + // (undocumented) + region: string; + // (undocumented) + secretAccessKey: string; + // (undocumented) + sessionToken?: string; +} + // @public (undocumented) export const cfnRootStackFileName = "root-cloudformation-stack.json"; @@ -50,13 +68,9 @@ export const getLocationRegionMapping: () => $TSObject; // @public (undocumented) export const getLocationSupportedRegion: (region: string) => string; -// Warning: (ae-forgotten-export) The symbol "AwsSecrets" needs to be exported by the entry point index.d.ts -// // @public (undocumented) -export function loadConfiguration(context: $TSContext): Promise; +export function loadConfiguration(context: $TSContext): Promise; -// Warning: (ae-forgotten-export) The symbol "AwsSdkConfig" needs to be exported by the entry point index.d.ts -// // @public (undocumented) export function loadConfigurationForEnv(context: $TSContext, env: string, appId?: string): Promise; diff --git a/packages/amplify-provider-awscloudformation/src/attach-backend.ts b/packages/amplify-provider-awscloudformation/src/attach-backend.ts index 60ac40ffc70..2cd911fcf3a 100644 --- a/packages/amplify-provider-awscloudformation/src/attach-backend.ts +++ b/packages/amplify-provider-awscloudformation/src/attach-backend.ts @@ -1,4 +1,4 @@ -import aws from 'aws-sdk'; +import S3 from 'aws-sdk/clients/s3'; import fs from 'fs-extra'; import path from 'path'; import { globSync } from 'glob'; @@ -118,7 +118,7 @@ async function ensureAmplifyMeta(context, amplifyApp, awsConfigInfo) { async function storeArtifactsForAmplifyService(context, awsConfigInfo, deploymentBucketName) { const projectPath = process.cwd(); - const s3Client = new aws.S3(awsConfigInfo); + const s3Client = new S3(awsConfigInfo); const amplifyMetaFilePath = context.amplify.pathManager.getCurrentAmplifyMetaFilePath(projectPath); const backendConfigFilePath = context.amplify.pathManager.getCurrentBackendConfigFilePath(projectPath); await uploadFile(s3Client, deploymentBucketName, amplifyMetaFilePath); @@ -313,7 +313,7 @@ async function downloadBackend(context, backendEnv, awsConfigInfo) { const backendDir = context.amplify.pathManager.getBackendDirPath(projectPath); const zipFileName = constants.S3BackendZipFileName; - const s3Client = new aws.S3(awsConfigInfo); + const s3Client = new S3(awsConfigInfo); const deploymentBucketName = backendEnv.deploymentArtifacts; const params = { diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify.js index 3e1be6ed115..50f6d5c626c 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-amplify.js @@ -1,12 +1,11 @@ const aws = require('aws-sdk'); -const { ProxyAgent } = require('proxy-agent'); const configurationManager = require('../configuration-manager'); const { regions: amplifyServiceRegions } = require('../aws-regions'); +const { proxyAgent } = require('./aws-globals'); async function getConfiguredAmplifyClient(context, options = {}) { let cred = {}; let defaultOptions = {}; - const httpProxy = process.env.HTTP_PROXY || process.env.HTTPS_PROXY; const envVarEndpoint = process.env.AWS_AMPLIFY_ENDPOINT; try { @@ -21,15 +20,14 @@ async function getConfiguredAmplifyClient(context, options = {}) { }; } - if (httpProxy) { - aws.config.update({ - httpOptions: { - agent: new ProxyAgent(), - }, - }); - } - - const config = { ...cred, ...defaultOptions, ...options }; + const config = { + ...cred, + ...defaultOptions, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }; // this is the "project" config level case, creds and region are explicitly set or retrieved from a profile if (config.region) { diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-apigw.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-apigw.ts index 1082490c860..7d11020cc38 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-apigw.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-apigw.ts @@ -2,6 +2,7 @@ import { $TSContext } from '@aws-amplify/amplify-cli-core'; import aws from './aws.js'; import { APIGateway as APIGW } from 'aws-sdk'; import { loadConfiguration } from '../configuration-manager'; +import { proxyAgent } from './aws-globals'; export class APIGateway { private static instance: APIGateway; @@ -24,6 +25,12 @@ export class APIGateway { constructor(context: $TSContext, creds, options = {}) { this.context = context; - this.apigw = new aws.APIGateway({ ...creds, ...options }); + this.apigw = new aws.APIGateway({ + ...creds, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-appsync.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-appsync.js index 193ec82c094..44be1b9c3bf 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-appsync.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-appsync.js @@ -1,5 +1,6 @@ const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class AppSync { constructor(context, options = {}) { @@ -12,7 +13,13 @@ class AppSync { } this.context = context; - this.appSync = new aws.AppSync({ ...cred, ...options }); + this.appSync = new aws.AppSync({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cfn.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cfn.js index 5577b829b26..7dedd13908b 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cfn.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cfn.js @@ -20,6 +20,7 @@ const { initializeProgressBars } = require('./aws-cfn-progress-formatter'); const { getStatusToErrorMsg, collectStackErrorMessages } = require('./cloudformation-error-serializer'); const { printer } = require('@aws-amplify/amplify-prompts'); +const { proxyAgent } = require('./aws-globals'); const CFN_MAX_CONCURRENT_REQUEST = 5; const CFN_POLL_TIME = (process.env.IS_AMPLIFY_CI ? 30 : 5) * 1000; // 5 secs wait to check if new stacks are created by root stack @@ -55,7 +56,14 @@ class CloudFormation { userAgentOption.customUserAgent = userAgentParam; } - this.cfn = new aws.CloudFormation({ ...cred, ...options, ...userAgentOption }); + this.cfn = new aws.CloudFormation({ + ...cred, + ...options, + ...userAgentOption, + httpOptions: { + agent: proxyAgent(), + }, + }); this.context = context; if (Object.keys(eventMap).length) { this.eventMap = eventMap; diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cognito-client.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cognito-client.ts index 9ce601154ba..ec59323b15a 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cognito-client.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-cognito-client.ts @@ -2,6 +2,7 @@ import { $TSContext } from '@aws-amplify/amplify-cli-core'; import aws from './aws.js'; import * as AWS from 'aws-sdk'; import { AwsSecrets, loadConfiguration } from '../configuration-manager'; +import { proxyAgent } from './aws-globals'; export class CognitoUserPoolClientProvider { private static instance: CognitoUserPoolClientProvider; @@ -22,6 +23,12 @@ export class CognitoUserPoolClientProvider { } constructor(creds: AwsSecrets, options = {}) { - this.client = new aws.CognitoIdentityServiceProvider({ ...creds, ...options }); + this.client = new aws.CognitoIdentityServiceProvider({ + ...creds, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-dynamodb.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-dynamodb.js index 2c9abb09769..f6c990129f7 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-dynamodb.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-dynamodb.js @@ -1,5 +1,6 @@ const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class DynamoDB { constructor(context, options = {}) { @@ -11,7 +12,14 @@ class DynamoDB { // ignore errors } this.context = context; - this.dynamodb = new aws.DynamoDB({ ...cred, ...options }); + + this.dynamodb = new aws.DynamoDB({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ecr.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ecr.ts index 6e550aacddd..4486e1672da 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ecr.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ecr.ts @@ -2,6 +2,7 @@ import AWS from 'aws-sdk'; import aws from './aws'; import { loadConfiguration } from '../configuration-manager'; import { $TSContext } from '@aws-amplify/amplify-cli-core'; +import { proxyAgent } from './aws-globals'; class ECR { public ecr: AWS.ECR; @@ -14,7 +15,13 @@ class ECR { // ignore missing config } - this.ecr = new (aws as typeof AWS).ECR({ ...cred, ...options }); + this.ecr = new (aws as typeof AWS).ECR({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-globals.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-globals.ts new file mode 100644 index 00000000000..3a1cb93ff15 --- /dev/null +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-globals.ts @@ -0,0 +1,10 @@ +import { ProxyAgent } from 'proxy-agent'; + +export const proxyAgent = () => { + let httpAgent = undefined; + const httpProxy = process.env.HTTP_PROXY || process.env.HTTPS_PROXY; + if (httpProxy) { + httpAgent = new ProxyAgent(); + } + return httpAgent; +}; diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-iam.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-iam.ts index c7567eb9403..1088d916fc9 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-iam.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-iam.ts @@ -4,6 +4,7 @@ import { IAM } from 'aws-sdk'; import { AwsSdkConfig } from '../utils/auth-types.js'; import { getAwsConfig } from '../configuration-manager'; import { $TSContext } from '@aws-amplify/amplify-cli-core'; +import { proxyAgent } from './aws-globals'; export class IAMClient { private static instance: IAMClient; @@ -24,6 +25,12 @@ export class IAMClient { } private constructor(creds: AwsSdkConfig, options: IAM.ClientConfiguration = {}) { - this.client = new (aws as typeof awstype).IAM({ ...creds, ...options }); + this.client = new (aws as typeof awstype).IAM({ + ...creds, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lambda.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lambda.ts index a7298535f26..0a54d8b9b24 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lambda.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lambda.ts @@ -4,6 +4,7 @@ import { LayerVersionsListItem, ListLayerVersionsRequest, ListLayerVersionsRespo import { AwsSecrets, loadConfiguration } from '../configuration-manager'; import { fileLogger } from '../utils/aws-logger'; import { pagedAWSCall } from './paged-call'; +import { proxyAgent } from './aws-globals'; const aws = require('./aws'); @@ -20,7 +21,13 @@ export class Lambda { } catch (e) { // ignore missing config } - this.lambda = new aws.Lambda({ ...cred, ...options }); + this.lambda = new aws.Lambda({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })() as $TSAny; } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lex.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lex.js index 2980ed30d20..e8bca279458 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lex.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-lex.js @@ -1,5 +1,6 @@ const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); const serviceRegionMap = { 'us-east-1': 'us-east-1', @@ -35,7 +36,14 @@ class Lex { // ignore missing config } this.context = context; - this.lex = new aws.LexModelBuildingService({ ...cred, ...options, apiVersion: '2017-04-19' }); + this.lex = new aws.LexModelBuildingService({ + ...cred, + ...options, + apiVersion: '2017-04-19', + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-location-service.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-location-service.ts index 03f18c4c68c..3037a6a6b9b 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-location-service.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-location-service.ts @@ -2,6 +2,7 @@ import { $TSContext } from '@aws-amplify/amplify-cli-core'; import * as AWS from 'aws-sdk'; import { AwsSecrets, loadConfiguration } from '../configuration-manager'; import aws from './aws.js'; +import { proxyAgent } from './aws-globals'; export class LocationService { private static instance: LocationService; @@ -21,6 +22,12 @@ export class LocationService { } private constructor(cred: AwsSecrets, options = {}) { - this.client = new aws.Location({ ...cred, ...options }); + this.client = new aws.Location({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-polly.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-polly.js index 7f071a0b9cf..c45cc5b6d3c 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-polly.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-polly.js @@ -1,5 +1,6 @@ const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class Polly { constructor(context, options = {}) { @@ -11,7 +12,14 @@ class Polly { // ignore missing config } this.context = context; - this.polly = new aws.Polly({ ...cred, ...options, apiVersion: '2016-06-10' }); + this.polly = new aws.Polly({ + ...cred, + ...options, + apiVersion: '2016-06-10', + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-route53.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-route53.js index 9de3f783c89..5154344cbc5 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-route53.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-route53.js @@ -1,6 +1,7 @@ // @ts-check const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class Route53 { constructor(context, options = {}) { @@ -15,7 +16,13 @@ class Route53 { this.context = context; /** @type {AWS.Route53} */ - this.route53 = new aws.Route53({ ...cred, ...options }); + this.route53 = new aws.Route53({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-s3.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-s3.ts index b43af311007..690184a661f 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-s3.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-s3.ts @@ -16,6 +16,7 @@ import { ListObjectVersionsOutput, ListObjectVersionsRequest, ObjectIdentifier } import { pagedAWSCall } from './paged-call'; import { loadConfiguration } from '../configuration-manager'; import aws from './aws'; +import { proxyAgent } from './aws-globals'; const providerName = require('../constants').ProviderName; const consumers = require('stream/consumers'); @@ -63,7 +64,13 @@ export class S3 { private constructor(context: $TSContext, cred: $TSAny, options = {}) { this.context = context; - this.s3 = new aws.S3({ ...cred, ...options }); + this.s3 = new aws.S3({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } /** diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sagemaker.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sagemaker.js index 24ea7248b60..9e867e7d838 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sagemaker.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sagemaker.js @@ -1,5 +1,6 @@ const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class SageMaker { constructor(context, options = {}) { @@ -11,7 +12,15 @@ class SageMaker { // ignore missing config } this.context = context; - this.sageMaker = new aws.SageMaker({ ...cred, ...options, apiVersion: '2017-07-24' }); + + this.sageMaker = new aws.SageMaker({ + ...cred, + ...options, + apiVersion: '2017-07-24', + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-secretsmanager.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-secretsmanager.js index a72a3862816..022964ea4e1 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-secretsmanager.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-secretsmanager.js @@ -1,6 +1,7 @@ // @ts-check const aws = require('./aws.js'); const configurationManager = require('../configuration-manager'); +const { proxyAgent } = require('./aws-globals'); class SecretsManager { constructor(context, options = {}) { @@ -15,7 +16,13 @@ class SecretsManager { this.context = context; /** @type {AWS.SecretsManager} */ - this.secretsManager = new aws.SecretsManager({ ...cred, ...options }); + this.secretsManager = new aws.SecretsManager({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); return this; })(); diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sns.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sns.ts index bfc17663d02..7c82faf9906 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sns.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sns.ts @@ -1,6 +1,7 @@ import { $TSAny, $TSContext } from '@aws-amplify/amplify-cli-core'; import { AwsSecrets, loadConfiguration } from '../configuration-manager'; import aws from './aws.js'; +import { proxyAgent } from './aws-globals'; // Currently SNS is used only by Cognito for sending SMS and has the following SNS mapping // https://docs.aws.amazon.com/cognito/latest/developerguide/user-pool-settings-email-phone-verification.html @@ -36,7 +37,13 @@ export class SNS { } private constructor(context: $TSContext, cred: $TSAny, options = {}) { - this.sns = new aws.SNS({ ...cred, ...options }); + this.sns = new aws.SNS({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } public async isInSandboxMode(): Promise { diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ssm.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ssm.ts index e0fa52976c5..1bf6772319e 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ssm.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-ssm.ts @@ -2,6 +2,7 @@ import { $TSContext, $TSObject } from '@aws-amplify/amplify-cli-core'; import { AwsSecrets, loadConfiguration } from '../configuration-manager'; import aws from './aws.js'; import * as AWS from 'aws-sdk'; +import { proxyAgent } from './aws-globals'; export class SSM { private static instance: SSM; @@ -22,6 +23,12 @@ export class SSM { } private constructor(cred: AwsSecrets, options = {}) { - this.client = new aws.SSM({ ...cred, ...options }); + this.client = new aws.SSM({ + ...cred, + ...options, + httpOptions: { + agent: proxyAgent(), + }, + }); } } diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sts.ts b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sts.ts index 855c6aae929..69fa9295ec1 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sts.ts +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws-sts.ts @@ -1,6 +1,7 @@ import aws from './aws.js'; import { loadConfiguration } from '../configuration-manager'; import { $TSAny, $TSContext } from '@aws-amplify/amplify-cli-core'; +import { proxyAgent } from './aws-globals'; export class STS { private static instance: STS; @@ -23,7 +24,13 @@ export class STS { private constructor(context: $TSContext, cred: $TSAny, options = {}) { this.context = context; - this.sts = new aws.STS({ ...cred, options }); + this.sts = new aws.STS({ + ...cred, + options, + httpOptions: { + agent: proxyAgent(), + }, + }); } async getCallerIdentity(): Promise { diff --git a/packages/amplify-provider-awscloudformation/src/aws-utils/aws.js b/packages/amplify-provider-awscloudformation/src/aws-utils/aws.js index dd30c7f276a..b7700eab815 100644 --- a/packages/amplify-provider-awscloudformation/src/aws-utils/aws.js +++ b/packages/amplify-provider-awscloudformation/src/aws-utils/aws.js @@ -22,6 +22,7 @@ try { aws = require('aws-sdk'); } +// TODO: get rid of configureWithCreds after data Gen1 releases const { ProxyAgent } = require('proxy-agent'); const configurationManager = require('../configuration-manager'); @@ -39,7 +40,6 @@ aws.configureWithCreds = async (context) => { }, }); } - return aws; }; diff --git a/packages/amplify-provider-awscloudformation/src/configuration-manager.ts b/packages/amplify-provider-awscloudformation/src/configuration-manager.ts index 140e2287ead..c67391c769c 100644 --- a/packages/amplify-provider-awscloudformation/src/configuration-manager.ts +++ b/packages/amplify-provider-awscloudformation/src/configuration-manager.ts @@ -13,7 +13,6 @@ import chalk from 'chalk'; import { prompt } from 'inquirer'; import _ from 'lodash'; import path from 'path'; -import { ProxyAgent } from 'proxy-agent'; import { STS } from 'aws-sdk'; import awsRegions from './aws-regions'; import constants from './constants'; @@ -32,6 +31,7 @@ import { updateOrRemoveQuestion, retryAuthConfig, } from './question-flows/configuration-questions'; +import { proxyAgent } from './aws-utils/aws-globals'; interface AwsConfig extends AwsSecrets { useProfile?: boolean; @@ -608,7 +608,7 @@ function removeProjectConfig(envName: string) { } } -export async function loadConfiguration(context: $TSContext): Promise { +export async function loadConfiguration(context: $TSContext): Promise { const envName = stateManager.getCurrentEnvName() || context?.exeInfo?.inputParams?.amplify?.envName; const config = await loadConfigurationForEnv(context, envName); return config; @@ -842,7 +842,7 @@ export async function getAwsConfig(context: $TSContext): Promise { if (httpProxy) { resultAWSConfigInfo = { ...resultAWSConfigInfo, - httpOptions: { agent: new ProxyAgent() }, + httpOptions: { agent: proxyAgent() }, }; } diff --git a/packages/amplify-provider-awscloudformation/src/index.ts b/packages/amplify-provider-awscloudformation/src/index.ts index 710e9430da7..34e06c8910d 100644 --- a/packages/amplify-provider-awscloudformation/src/index.ts +++ b/packages/amplify-provider-awscloudformation/src/index.ts @@ -56,12 +56,14 @@ import { getApiKeyConfig } from './utils/api-key-helpers'; import { deleteEnvironmentParametersFromService } from './utils/ssm-utils/delete-ssm-parameters'; export { deleteEnvironmentParametersFromService } from './utils/ssm-utils/delete-ssm-parameters'; import { getEnvParametersUploadHandler, getEnvParametersDownloadHandler } from './utils/ssm-utils/env-parameter-ssm-helpers'; +import { proxyAgent } from './aws-utils/aws-globals'; export { getEnvParametersUploadHandler, getEnvParametersDownloadHandler, DownloadHandler, PrimitiveRecord, } from './utils/ssm-utils/env-parameter-ssm-helpers'; +export { AwsSdkConfig } from './utils/auth-types'; function init(context) { return initializer.run(context); @@ -101,11 +103,29 @@ function configure(context) { return configManager.configure(context); } +async function getConfiguredAWSClientConfig(context, category, action) { + const credsConfig = await loadConfiguration(context); + category = category || 'missing'; + action = action || ['missing']; + const userAgentAction = `${category}:${action[0]}`; + const config = { + credentials: credsConfig, + customUserAgent: formUserAgentParam(context, userAgentAction), + httpOptions: { + agent: proxyAgent(), + }, + region: credsConfig.region, + }; + return config; +} + +// TODO: get rid of this function after data Gen1 releases async function getConfiguredAWSClient(context, category, action) { await aws.configureWithCreds(context); category = category || 'missing'; action = action || ['missing']; const userAgentAction = `${category}:${action[0]}`; + aws.config.update({ customUserAgent: formUserAgentParam(context, userAgentAction), }); @@ -169,6 +189,7 @@ module.exports = { providerUtils, setupNewUser, getConfiguredAWSClient, + getConfiguredAWSClientConfig, getLexRegionMapping, getConfiguredAmplifyClient, showHelpfulLinks, diff --git a/packages/amplify-provider-awscloudformation/src/iterative-deployment/deployment-manager.ts b/packages/amplify-provider-awscloudformation/src/iterative-deployment/deployment-manager.ts index cc5c4acaf53..ad2ac4fdefa 100644 --- a/packages/amplify-provider-awscloudformation/src/iterative-deployment/deployment-manager.ts +++ b/packages/amplify-provider-awscloudformation/src/iterative-deployment/deployment-manager.ts @@ -20,6 +20,7 @@ import { loadConfiguration } from '../configuration-manager'; import { fileLogger, Logger } from '../utils/aws-logger'; import { EventMap } from '../utils/progress-bar-helpers'; import { StackProgressPrinter } from './stack-progress-printer'; +import { proxyAgent } from '../aws-utils/aws-globals'; interface DeploymentManagerOptions { throttleDelay?: number; @@ -127,8 +128,13 @@ export class DeploymentManager { }; this.eventMap = eventMap; this.s3Client = new aws.S3(creds); - this.cfnClient = new aws.CloudFormation({ ...creds, maxRetries: 10, customUserAgent: this.options.userAgent }); - this.ddbClient = new aws.DynamoDB({ ...creds, region, maxRetries: 10 }); + this.cfnClient = new aws.CloudFormation({ + ...creds, + maxRetries: 10, + customUserAgent: this.options.userAgent, + httpOptions: { agent: proxyAgent() }, + }); + this.ddbClient = new aws.DynamoDB({ ...creds, region, maxRetries: 10, httpOptions: { agent: proxyAgent() } }); this.logger = fileLogger('deployment-manager'); this.printer = new StackProgressPrinter(eventMap); this.spinner = new AmplifySpinner(); diff --git a/packages/amplify-provider-awscloudformation/src/system-config-manager.ts b/packages/amplify-provider-awscloudformation/src/system-config-manager.ts index 4d1f2e7db87..69e738c01fa 100644 --- a/packages/amplify-provider-awscloudformation/src/system-config-manager.ts +++ b/packages/amplify-provider-awscloudformation/src/system-config-manager.ts @@ -5,10 +5,10 @@ import * as fs from 'fs-extra'; import * as path from 'path'; import * as ini from 'ini'; import * as inquirer from 'inquirer'; -import { ProxyAgent } from 'proxy-agent'; import * as constants from './constants'; import { fileLogger } from './utils/aws-logger'; import { AwsSdkConfig } from './utils/auth-types'; +import { proxyAgent } from './aws-utils/aws-globals'; const logger = fileLogger('system-config-manager'); @@ -79,7 +79,6 @@ export const getProfiledAwsConfig = async ( isRoleSourceProfile?: boolean, ): Promise => { let awsConfigInfo: AwsSdkConfig; - const httpProxy = process.env.HTTP_PROXY || process.env.HTTPS_PROXY; const profileConfig = getProfileConfig(profileName); if (profileConfig) { logger('getProfiledAwsConfig.profileConfig', [profileConfig])(); @@ -106,6 +105,9 @@ export const getProfiledAwsConfig = async ( secretAccessKey: credentials.secretAccessKey, sessionToken: credentials.sessionToken, expiration: credentials.expireTime, + httpOptions: { + agent: proxyAgent(), + }, }; process.env.AWS_SDK_LOAD_CONFIG = sdkLoadConfigOriginal; } else { @@ -122,15 +124,6 @@ export const getProfiledAwsConfig = async ( message: `Profile configuration is missing for: ${profileName}`, }); } - - // HTTP_PROXY & HTTPS_PROXY env vars are read automatically by ProxyAgent, but we check to see if they are set before using the proxy - if (httpProxy) { - awsConfigInfo = { - ...awsConfigInfo, - httpOptions: { agent: new ProxyAgent() }, - }; - } - return awsConfigInfo; }; diff --git a/packages/amplify-provider-awscloudformation/src/utils/admin-helpers.ts b/packages/amplify-provider-awscloudformation/src/utils/admin-helpers.ts index d9341961464..d5341f2d0e1 100644 --- a/packages/amplify-provider-awscloudformation/src/utils/admin-helpers.ts +++ b/packages/amplify-provider-awscloudformation/src/utils/admin-helpers.ts @@ -73,11 +73,26 @@ export async function getTempCredsWithAdminTokens(context: $TSContext, appId: st // use tokens to get creds and assign to config const awsConfigInfo = await getAdminCognitoCredentials(idToken, IdentityId, region); - aws.config.update(awsConfigInfo); - // need to use Cognito creds to get STS creds - otherwise // users will not be able to provision Cognito resources - return await getAdminStsCredentials(idToken, region); + const sts = new aws.STS({ + ...awsConfigInfo, + stsRegionalEndpoints: 'regional', + }); + const { Credentials } = await sts + .assumeRole({ + RoleArn: idToken.payload['cognito:preferred_role'], + RoleSessionName: 'amplifyadmin', + }) + .promise(); + + return { + accessKeyId: Credentials.AccessKeyId, + expiration: Credentials.Expiration, + region, + secretAccessKey: Credentials.SecretAccessKey, + sessionToken: Credentials.SessionToken, + }; } type AppStateResponse = { @@ -123,26 +138,6 @@ async function getAdminCognitoCredentials(idToken: CognitoIdToken, identityId: s }; } -async function getAdminStsCredentials(idToken: CognitoIdToken, region: string): Promise { - const sts = new aws.STS({ - stsRegionalEndpoints: 'regional', - }); - const { Credentials } = await sts - .assumeRole({ - RoleArn: idToken.payload['cognito:preferred_role'], - RoleSessionName: 'amplifyadmin', - }) - .promise(); - - return { - accessKeyId: Credentials.AccessKeyId, - expiration: Credentials.Expiration, - region, - secretAccessKey: Credentials.SecretAccessKey, - sessionToken: Credentials.SessionToken, - }; -} - async function getRefreshedTokens(context: $TSContext, appId: string) { // load token, check expiry, refresh if needed const authConfig: AdminAuthConfig = stateManager.getAmplifyAdminConfigEntry(appId); diff --git a/yarn.lock b/yarn.lock index 3fe1b99326e..c1989973a11 100644 --- a/yarn.lock +++ b/yarn.lock @@ -313,6 +313,7 @@ __metadata: dependencies: "@aws-amplify/amplify-cli-core": 4.4.1 "@aws-amplify/amplify-prompts": 2.8.6 + aws-sdk: ^2.1692.0 chalk: ^4.1.1 fs-extra: ^8.1.0 mime-types: ^2.1.26 @@ -469,6 +470,7 @@ __metadata: "@aws-amplify/amplify-cli-core": 4.4.1 "@aws-amplify/amplify-environment-parameters": 1.9.19 archiver: ^7.0.1 + aws-sdk: ^2.1692.0 chalk: ^4.1.1 cli-table3: ^0.6.0 execa: ^5.1.1