async function verifyTagExistsOnResources()

in source/services/resource-selector/index.ts [374:429]


async function verifyTagExistsOnResources(handlerData: FunctionData): Promise<boolean> {
    const sts = new AWS.STS({ apiVersion: '2011-06-15' });
    const { resourceAccount, resourceRegion } = handlerData.passthroughResource;
    const taskId = handlerData.taskMetadata.taskId;
    const roleArn = `arn:aws:iam::${resourceAccount}:role/${resourceAccount}-${resourceRegion}-${taskId}`;
    const stsParams: AWS.STS.AssumeRoleRequest = {
        RoleArn: roleArn,
        RoleSessionName: 'ops_conductor_query_by_tag',
        DurationSeconds: 900
    };

    const assumedRole = await sts.assumeRole(stsParams).promise();

    const taggingAPIParams: AWS.ResourceGroupsTaggingAPI.GetResourcesInput = {
        TagFilters: [
            {
                Key: handlerData.taskMetadata.targetTag
            }
        ],
        ResourcesPerPage: 100,
    };

    const resourceTaggingApi = new AWS.ResourceGroupsTaggingAPI(
        {
            apiVersion: '2017-01-26',
            accessKeyId: assumedRole.Credentials.AccessKeyId,
            secretAccessKey: assumedRole.Credentials.SecretAccessKey,
            sessionToken: assumedRole.Credentials.SessionToken,
            region: handlerData.passthroughResource.resourceRegion
        }
    );

    // Call the Resource Tagging API at least once and repeat if a PaginationToken was returned
    let foundResource = false;
    do {
        const data = await resourceTaggingApi.getResources(taggingAPIParams).promise();
        for (let resourceMapping of data.ResourceTagMappingList) {
            // Due to the difference between API getResources ARN and the actual ARN, extract the resource ID from the ARNs
            let resourceArn = resourceMapping.ResourceARN.split(':').pop();
            let eventResourceArn = handlerData.passthroughResource.fullArn.split(':').pop();
            if (resourceArn === eventResourceArn) {
                foundResource = true;
                break;
            }
        }

        if (data.PaginationToken && data.PaginationToken.trim() !== '') {
            taggingAPIParams.PaginationToken = data.PaginationToken;
        } else {
            // Remove PaginationToken from params so we exit the while loop
            delete taggingAPIParams.PaginationToken;
        }
    } while (!foundResource && Object.prototype.hasOwnProperty.call(taggingAPIParams, 'PaginationToken'));

    return foundResource;
}